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

时间:2014-03-01 01:09:44

标签: java javascript forms jsp

我迫切的问题是如何在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而不是忽略它,它对我没有任何帮助网络表单方面。

所以在网络方面,我发现了处理异常/错误的各种想法,但似乎没有一个是最好的选择。我目前最喜欢的是将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();
        }

    }

我还将性别选择设为一个下拉列表,调用optionChange函数:

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

欢迎您查看web appsource


修改

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

2 个答案:

答案 0 :(得分:1)

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

您还可以为数字字段使用html5输入类型编号。

答案 1 :(得分:0)

虽然xp500提供了一些有用的信息来使我的HTML代码更好,但我相信我终于找到了如何在提交表单后验证用户输入,而不必接受所有输入,因为字符串然后将它们转换为适当的数据类型。 / p>

因此,我的部分研究导致研究taglet和scriptlet等,据我所知,使用JSTL taglibs是accepted practice

这就是说,以下是我实施的更改(请注意,您可以在Heroku上查看应用的工作版本,并在GitHub看到来源:


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

FormValidation 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被添加到我的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>

从那里我修改了我的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中输入参数字符串,他们将得到验证。