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