Java NumberFormatException——验证JSP文件中的表单提交?

Java NumberFormatException——验证JSP文件中的表单提交?,java,javascript,forms,jsp,Java,Javascript,Forms,Jsp,我迫切的问题是如何在JSP web表单中最好地处理此异常,不过我相信下面的内容也可以提供答案 我一直在忙于一个java项目,我已经实现了一个applet/JFrame,还通过JSP实现了一个web表单。在我学习的最后一个类(基本上是Java 1)中,当用户输入数据时,我学习的处理异常(如NumberFormatException)的方法是通过ActionListener中的try/catch块 例如: private ActionListener L_Weight() { return

我迫切的问题是如何在JSP web表单中最好地处理此异常,不过我相信下面的内容也可以提供答案

我一直在忙于一个java项目,我已经实现了一个applet/JFrame,还通过JSP实现了一个web表单。在我学习的最后一个类(基本上是Java 1)中,当用户输入数据时,我学习的处理异常(如
NumberFormatException
)的方法是通过
ActionListener
中的try/catch块

例如:

private ActionListener L_Weight() {
    return new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            double weight = Person.DEFAULT_WEIGHT;
            try {
                weight = Double.parseDouble(ae.getActionCommand());
            }
            catch (NumberFormatException e) {
                //e.printStackTrace();
            }
            person = new Person(
                    person.getGender(),
                    weight, 
                    person.getAge(),
                    person.getNumberOfDrinks(), 
                    person.getHoursSinceFirstDrink());
            view.updatePerson(person);
        }
        
    };
}
因此,虽然这适用于applet/JFrame,但它似乎不是try/catch的最佳用法,我不知道如何处理NumberFormatException,除了忽略它之外,它对我在web表单方面没有任何作用

因此,在web方面,我找到了各种处理异常/错误的方法,但似乎没有一种是最好的选择。我目前最喜欢的是将
onsubmit=“return checkForm(this)”
添加到我的表单提交中,其中
checkForm()
是javascript代码,如果提交了有效数据,它将返回true。这似乎仍然是一个无关的步骤,但除了将变量声明为字符串并将其解析为双精度,以便我可以在java端执行try/catch错误处理之外,我不确定还能在哪里验证提交

因此,我实现了checkForm()函数,它正在工作,只是想知道这是否是JSP中表单验证的良好实践:

<form name="Name Input Form" action="index.jsp" method="POST" onsubmit="return checkForm(this)">

<script type="text/javascript">
    function checkForm(form) {
        var result = true;
        var numbers = /^[0-9|\.]+$/;
        var checkFields = new Array(
                form.age,
                form.weight,
                form.drinks,
                form.hours);
        
        for (i=0; i < checkFields.length; i++) {
            if (!checkFields[i].value.match(numbers)) {
                alert(checkFields[i].name + " field must be a number");
                checkFields[i].focus();
                result = false;
                break;
            }
        }
        return result;
    }
    
    function optionChange(form) {
        if (checkForm(form)) {
            form.submit();
        }
        
    }

功能检查表(表格){
var结果=真;
变量数=/^[0-9 | \.]+$/;
var checkFields=新数组(
年龄,
体重,
饮料,
表格(小时),;
对于(i=0;i
我还将性别选择设置为一个下拉列表,该下拉列表调用optionChange函数:

<select name="gender" id="gender" onchange="optionChange(this.form)">
    <option value="Male">Male</option>
    <option value="Female">Female</option>
</select>

男性
女性

欢迎您查看和


编辑:

在发布了这些问题之后,我意识到我还有另一个与此相关的问题,在Person类中创建一个构造函数,将性别、体重、年龄、饮料和小时作为字符串参数,然后处理到各自类型的转换,这是一个糟糕的选择吗?我可以将错误处理放在这里的try/catch块中,但我(在我看来)会再次利用错误处理来强制验证。从这里开始,我不需要担心验证问题,因为java代码需要字符串,但这似乎是一个不必要的折光操作。

您可以使用函数。因此,在每个文本字段中添加一个侦听器,每次更改时,可以检查文本是否为有效数字(如果不是,则显示某种红色内联消息)


您也可以将html5输入类型number用于数字字段。

尽管xp500提供了一些有用的信息,可以使我的HTML代码更好,但我相信我最终发现了如何在提交表单后验证用户输入,而不必将所有输入作为字符串接受,然后将它们转换为相应的数据类型

因此,我的部分研究导致了对Taglet和Scriptlet等的研究,据我所知,使用JSTL taglibs是一种

话虽如此,以下是我实施的更改(请注意,您可以在上看到应用程序的工作版本,源代码为:


首先,我创建了一个名为
FormValidation.java
的servlet,源代码可以在GitHub上看到,但其要点是,我的表单现在提交给这个servlet,然后验证、解析参数并作为响应返回

表单验证Servlet

public class FormValidation extends HttpServlet {

    @Override
    public void doGet(HttpServletRequest request,HttpServletResponse response)
            throws ServletException, IOException {

        String gender = request.getParameter("gender");
        String age_s = request.getParameter("age");
        String weight_s = request.getParameter("weight");
        String drinks_s = request.getParameter("drinks");
        String hours_s = request.getParameter("hours");
        String gender_s;
        int age_i;
        double weight_d, drinks_d, hours_d;

        if (gender.toLowerCase().equals("male") || 
                gender.toLowerCase().equals("female")) {
            gender_s = gender;
        }
        else {
            gender_s = Person.DEFAULT_GENDER;
        }

        try {
            age_i = Integer.parseInt(age_s);
        }
        catch (NumberFormatException e) {
            age_i = Person.DEFAULT_AGE;
        }
        try {
            weight_d = Double.parseDouble(weight_s);
        }
        catch (NumberFormatException e) {
            weight_d = Person.DEFAULT_WEIGHT;
        }
        try {
            drinks_d = Double.parseDouble(drinks_s);
        }
        catch (NumberFormatException e) {
            drinks_d = Person.DEFAULT_DRINKS;
        }
        try {
            hours_d = Double.parseDouble(hours_s);
        }
        catch (NumberFormatException e) {
            hours_d = Person.DEFAULT_HOURS;
        }

        request.setAttribute("gender", gender_s);
        request.setAttribute("age", age_i);
        request.setAttribute("weight", weight_d);
        request.setAttribute("drinks", drinks_d);
        request.setAttribute("hours", hours_d);
        request.getRequestDispatcher("/index.jsp").forward(request, response);

    }


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }

}
接下来,servlet被添加到my web.xml中:

<servlet>
    <servlet-name>FormValidation</servlet-name>
    <servlet-class>drunkstuff.view.FormValidation</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ErrorHandler</servlet-name>
    <url-pattern>/ErrorHandler</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>FormValidation</servlet-name>
    <url-pattern>/FormValidation</url-pattern>
</servlet-mapping>

表单验证
.view.FormValidation
错误处理程序
/错误处理程序
表单验证
/表单验证
从那里,我修改了index.jsp文件以使用新属性,并设置bean的初始默认值:

<jsp:useBean id="WebViewBean" scope="session" class="drunkstuff.view.WebView" />
<c:set var="gender" scope="session" value="${WebViewBean.gender}" />
<c:set var="age" scope="session" value="${WebViewBean.age}" />
<c:set var="weight" scope="session" value="${WebViewBean.weight}" />
<c:set var="drinks" scope="session" value="${WebViewBean.drinks}" />
<c:set var="hours" scope="session" value="${WebViewBean.hours}" />
<jsp:setProperty name="WebViewBean" property="gender" value="${gender}" />
<jsp:setProperty name="WebViewBean" property="age" value="${age}" />
<jsp:setProperty name="WebViewBean" property="weight" value="${weight}" />
<jsp:setProperty name="WebViewBean" property="drinks" value="${drinks}" />
<jsp:setProperty name="WebViewBean" property="hours" value="${hours}" />

并提交到servlet:

<form name="Name Input Form" action="./FormValidation" method="GET" onsubmit="return checkForm(this)">



我确信我所做的已经在其他地方做过了,但是我在寻找可以用来做我想做的事情的例子时遇到了很多困难。还有很多使用Scriptlet所需要的答案,我认为我不应该使用。所以我很想看看如何改进这一点,以便我能够更多地了解java web项目,但到目前为止,我非常高兴。如果我愿意,我肯定可以对表单验证进行一些更改,以更改该行为,并可能返回表单,其中包含有关我更改了值的信息,但主要原因是,如果有人在URL字符串中输入参数,他们将得到验证。

非常感谢,我不知道这些。不过,我想总的想法是,我应该在HTML端而不是java端进行验证?@akevit您应该在这两个端都进行验证。在客户端,这样您就不会使服务器超载验证这些内容。在服务器上,万一有人绕过客户端,直接将数据发送到服务器(例如,手动获取或发布)因此,我想我的问题是,在不将变量类型更改为字符串的情况下,如何在服务器端执行此操作?似乎我可以执行错误检查的唯一方法是将预期的输入类型更改为字符串,然后使用大量转换来使其正常工作。我对使用JSP非常陌生,Bean使用默认的get/set方法来执行此操作变量,在