上一篇我们学习了struts2中的表单提交数据,我们注意到在我们输入数据时,我们并没有在HTML上编写JavaScript用于输入数据的验证
我们先看下面的一个例子
注意看,我们在age文本框中输入了字符 ,我们知道age 是int类型的此时输入了string类型的数据会怎么处理呢?
提交表单,出现了异常:
注意看异常信息
上面说返回了input 而我们的reslult没有定义
如果Struts 2返回”input”表明在表单输入无效如何处理? 在大部分情况下我们想重新显示包含表单的web页面并包含用户在表单输入数据和如何错误的信息 .
要处理返回值 “input” 我们需要在struts.xml 中action 下添加如下的结果 .
<result name="input">/register.jsp</result>
上面的result 节点在 success result节点之后,在 register action 结束之前.
添加之后 ,我们可以看到 在有错误的情况下提交表单,struts2会根据我们配置的input中的jsp进行转发
由于当验证失败时 Struts 2将返回 input, Struts 2 框架将重新显示register.jsp. 由于我们使用Struts 2表单标签, Struts 2 将自动添加错误消息. 这些错误消息是我们在 addFieldError方法调用中指定. 该 addFieldError方法有两个参数. 第一个参数是错误应用的表单字段 而第二个参数是显示在表单上面的错误消息.
因而如下的addFieldError方法调用:
addFieldError( "personBean.firstName", "First name is required.")
将导致消息”First name is required” 在firstName 表单字段上显示.
validate方法
Struts 2调用 validate方法, 验证失败, register.jsp 将显示错误消息.
美化错误消息
Struts 2 s:head 标签用来提供包含美化错误信息的CSS . 添加 到 register.jsp 在HTML 标签后. 和上面相同的步骤你将看到如下效果:
重写validate方法
我们可以在action 类Register中重写validate方法,
@Override
public void validate() {
// TODO Auto-generated method stub
super.validate();
if (personBean.getFirstName().length() == 0) {
addFieldError("personBean.firstName", "名字不能为空");
}
if (personBean.getLastName().length() == 0) {
addFieldError("personBean.lastName", "名字不能为空");
}
//邮箱可以为空 ,当不为空时验证
if (personBean.getEmail().length() != 0) {
if (!personBean.getEmail().matches("\\w+@\\w+(\\.\\w+)+")) {
addFieldError("personBean.email", "邮箱不是一个合法邮箱!!");
}
}
if (personBean.getAge() < 18) {
addFieldError("personBean.age", "年龄不能小于18岁");
}
此时,我们在输错的时候会提示:
我们还可以在action类中定义 validateExecute方法
public void validateExecute(){
if (personBean.getFirstName().length() == 0) {
addFieldError("personBean.firstName", "名字不能为空");
}
if (personBean.getLastName().length() == 0) {
addFieldError("personBean.lastName", "名字不能为空");
}
//邮箱可以为空 ,当不为空时验证
if (personBean.getEmail().length() != 0) {
if (!personBean.getEmail().matches("\\w+@\\w+(\\.\\w+)+")) {
addFieldError("personBean.email", "邮箱不是一个合法邮箱!!");
}
}
if (personBean.getAge() < 18) {
addFieldError("personBean.age", "年龄不能小于18岁");
}
System.out.println("validateExecute 方法----------------------");
}
在validate方法中添上:
System.out.println("validate 方法 --------------- ");
我们看到:
控制台输出:
validateExecute 方法----------------------
validate 方法 ---------------
两个方法都起到了验证的作用
还有一个方法也可以起到验证作用:
public void validateDoExecute(){
if (personBean.getFirstName().length() == 0) {
addFieldError("personBean.firstName", "名字不能为空");
}
if (personBean.getLastName().length() == 0) {
addFieldError("personBean.lastName", "名字不能为空");
}
//邮箱可以为空 ,当不为空时验证
if (personBean.getEmail().length() != 0) {
if (!personBean.getEmail().matches("\\w+@\\w+(\\.\\w+)+")) {
addFieldError("personBean.email", "邮箱不是一个合法邮箱!!");
}
}
if (personBean.getAge() < 18) {
addFieldError("personBean.age", "年龄不能小于18岁");
}
System.out.println("validateDoExecute 方法----------------------");
}
经验证当三个方法都存在时
控制台打出:
validateExecute 方法----------------------
validate 方法 ---------------
说明validateDoExecute 方法没调用,当把validateExecute 方法去掉时控制台输出:
validateDoExecute 方法----------------------
validate 方法 ---------------
调用了两个方法
总结
看了上面的三个方法,在具体使用时,使用哪个比较好呢,个人推荐使用
validate+XXX方法,如validateExecute()方法,因为,在一个action中有可能我们会写多个方法
如在用户管理的action中 我们可能也会写上退出和注册的方法
在UserAction中有两个方法 :login() 和 logout() register(),在登录时需要验证,注册同样需要验证,二两者的验证方式又不一样 那么使用validate方法就不太适合了,而使用validateLogin 和validateRegister分别进行登录和注册验证则非常适合
使用validate()方法还有一个缺点,那就时在进行不需要验证的logout()方法,他也会进行验证
还是上面的例子:我们在register 类中 写一个
public String logout(){
return SUCCESS;
}
先把validateExecute()和validateDoExecute()方法注释
并在struts.xml中
<action name="logout" class="com.lgh.struts2maven.action.Register" method="logout">
<result name="success">/logout.jsp</result>
</action>
在thankyou.jsp页面添加退出链接
<a href="<s:url action='logout' />"> 退出</a>
这时,输入数据提交,后的界面是
我们点击退出
我们看到错误在register类中的34行
我们可以很轻易的判断出空指针异常的原因,但是这时我们想的是,lagout根本不需要进行验证,但是它还是执行了验证方法
,这是我们不需要的,
解决的方法:
(1)、在不需要进行验证的方法加上annotation,即在方法前加上@SkipValidation
@SkipValidation
public String logout(){
return SUCCESS;
}
加上了注解,当我们执行action调用该方法时,会忽略验证的
这时重启项目执行logout
(2)、不使用validate()方法,使用validateXXX方法,验证针对具体的某个方法,这样,也可以解决该问题