NumberFormatException——是否验证JSP文件中的表单提交



我的紧迫问题是如何在JSP web表单中最好地处理此异常,但我相信下面的内容也能提供答案。

我一直在处理一个java项目,我已经通过JSP将其实现为applet/JFrame和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表单方面对我没有任何帮助。

因此,在网络方面,我发现了各种处理异常/错误的想法,但似乎都不是最好的选择。我目前最喜欢的是将onsubmit="return checkForm(this)"添加到我的表单提交中,其中checkForm()是javascript代码,如果提交了有效数据,它将返回true。这似乎仍然是一个无关的步骤,,但除了将变量声明为String并将其解析为doubles以便我可以在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应用程序和源


编辑:

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

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

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

尽管xp500为改进HTML代码提供了一些有用的信息,但我相信我终于找到了如何在提交表单后验证用户输入,而不必将所有输入都接受为字符串,然后将其转换为相应的数据类型。

因此,我的部分研究导致了对标签和脚本等的研究,据我所知,使用JSTL标签库是一种公认的做法

话虽如此,以下是我实现的更改(注意,你可以在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网络项目的信息,但到目前为止我很高兴。如果我愿意的话,我肯定可以对表单验证进行一些更改,以改变这种行为,并可能在表单中返回关于我更改了值的信息,然而,这样做的主要原因是,如果有人在URL字符串中输入参数,他们就会得到验证。

最新更新