struts2学习笔记七(第7讲.Struts2的输入校验续二)
Struts2的输入校验续二
主要介绍addActionError的用法:
一、修改com.test.action下的RegisterAction.java类(把addFieldError改成addActionError):
package com.test.action;import java.util.Calendar;import java.util.Date;import com.opensymphony.xwork2.ActionSupport;public class RegisterAction extends ActionSupport {private String username;private String password;private String repassword;private int age;private Date birthday;private Date graduation;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getRepassword() {return repassword;}public void setRepassword(String repassword) {this.repassword = repassword;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public Date getGraduation() {return graduation;}public void setGraduation(Date graduation) {this.graduation = graduation;}@Overridepublic String execute() throws Exception {return SUCCESS;}@Overridepublic void validate() {if(null == username || username.length() < 6 || username.length() > 10){this.addActionError("username invalid");}if(null == password || password.length() <6 || password.length() > 10){this.addActionError("password invalid");}else if(null == repassword || repassword.length() < 6 || repassword.length() > 10){this.addActionError("repassword invalid");}else if(!password.equals(repassword)){this.addFieldError("password", "two passwords not the same");}if(age <= 0 || age > 150){this.addActionError("age should be between 1 and 150");}//if(null == birthday){//this.addFieldError("birthday", "birthday invalid");//}//if(null == graduation){//this.addFieldError("graduation", "graduation invalid");//}if(null != birthday && null != graduation){Calendar c1 = Calendar.getInstance();c1.setTime(birthday);Calendar c2 = Calendar.getInstance();c2.setTime(graduation);if(!c1.before(c2)){this.addActionError("birthday should be before graduation");}}}}
struts2标签能自动的显示错误信息,但是只局限于addFieldError级别的,当使用addActionError的时候就不能自动的显示错误的提示信息了。
二、需要在标签页面register2.jsp里面添加一个标签<s:actionerror/>:
<body> <s:actionerror cssStyle="color:red"/> <s:form action="register"> <s:textfield name="username" label="username"></s:textfield> <s:password name="password" label="password"></s:password> <s:password name="repassword" label="repassword"></s:password> <s:textfield name="age" label="age"></s:textfield> <s:textfield name="birthday" label="birthday"></s:textfield> <s:textfield name="graduation" label="graduation"></s:textfield> <s:submit value=" submit "></s:submit> </s:form> </body>
结果如下:

当年龄输入的为字母型的字符串时,验证如下图:

会出现验证重复的现象:
三、要修改注册页面register.jsp的标签格式:
<body> <table align="center" width="40%"><tr><td><s:actionerror cssStyle="color:red"/></td></tr></table> <s:form action="register" theme="simple"> <table align="center" width="40%" border="1"> <tr> <td>username </td> <td> <s:textfield name="username" label="username"></s:textfield> </td> </tr> <tr><td>password</td> <td> <s:password name="password" label="password"></s:password> </td> </tr> <tr><td>repassword</td> <td> <s:password name="repassword" label="repassword"></s:password> </td> </tr> <tr><td>age</td> <td> <s:textfield name="age" label="age"></s:textfield> </td> </tr> <tr><td>birthday</td> <td> <s:textfield name="birthday" label="birthday"></s:textfield> </td> </tr> <tr><td>graduation</td> <td> <s:textfield name="graduation" label="graduation"></s:textfield> </td> </tr> <tr><td><s:submit value=" submit "></s:submit></td> <td> <s:reset value=" reset "></s:reset> </td> </tr> </table> </s:form> </body>
效果如下图所示:

问题:当页面出现多个form表单时,如何用不同的方法来进行验证?
四、修改struts.xml中RegisterAction的配置,添加一个method属性,指定acton要执行的方法abc:
<action name="register" method="abc"><result name="success">/success.jsp</result><result name="input">/register2.jsp</result></action>
五、在RegisterAction中创建Action要执行的abc方法:
public String abc() throws Exception {System.out.println("abc method invoked");return SUCCESS;}
问题:当在RegisterAction类中有多个的表单的action需要验证该怎么办?
六、在struts.xml中添加一个需要用到xyz方法的Action:
。。。<action name="register" method="abc"><result name="success">/success.jsp</result><result name="input">/register2.jsp</result></action><action name="zly" method="xyz"><result name="success">/success.jsp</result><result name="input">/register2.jsp</result></action>
七、在RegisterAction类中创建对应的action验证方法:
public String abc() throws Exception {System.out.println("abc() method invoked");return SUCCESS;}public void validateAbc(){System.out.println("validateAbc() invoked");}
控制台输出效果:

说明:在RegisterAction中如果自定义了验证的方法如validateAbc(),但是同样会执行validate验证的方法,这是不科学的,所以可以不重写validate方法,但是execute方法有没有验证了,所以validate方法可以写成validateExexute()方法。