1、新建一个UserRegAction,为了方便编程,继承于ActionSupport
- publicclass UserRegAction extends ActionSupport{
- privatestaticfinallong serialVersionUID = -3132955950082594812L;
- private User user;//不用初始化
- public User getUser() {
- return user;
- }
- publicvoid setUser(User user) {
- this.user = user;
- }
- public String execute(){
- //这里其实返回的是一个小写的字符串"success"
- return Action.SUCCESS;
- }
- @Override
- publicvoid validate() {
- //执行完validate,一旦FieldError不为空,就会返回input视图给用户,不再执行业务逻辑方法
- if(null==user.getUsername()||"".equals(user.getUsername().trim())){
- this.addFieldError("user.username", "用户名不能不空!");
- }elseif(user.getUsername().length()<6||user.getUsername().length()>15){
- this.addFieldError("user.username", "用户名长度必需在6~15之间!!");
- }elseif(!user.getUsername().matches("[\\w]+")){
- this.addFieldError("user.username", "用户名只能是字母、数字或_符号!");
- }
- if(null==user.getPassword()||"".equals(user.getPassword().trim())){
- this.addFieldError("user.password", "密码不能不空!");
- }elseif(user.getPassword().length()<6||user.getPassword().length()>15){
- this.addFieldError("user.password", "密码长度必需在6~15之间!");
- }
- if(null==user.getRepassword()||"".equals(user.getRepassword().trim())){
- this.addFieldError("user.repassword", "重复密码不能不空!");
- }elseif(!user.getPassword().equals(user.getRepassword())){
- this.addFieldError("user.repassword", "输入密码不一致!");
- }
- if(null==user.getEmail()||"".equals(user.getEmail().trim())){
- this.addFieldError("user.email", "邮箱不能不空!");
- }elseif(!user.getEmail().matches("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+")){
- this.addFieldError("user.email", "邮箱格式有误!");
- }
- }
public class UserRegAction extends ActionSupport{ private static final long serialVersionUID = -3132955950082594812L; private User user;//不用初始化 public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String execute(){ //这里其实返回的是一个小写的字符串"success" return Action.SUCCESS; } @Override public void validate() { //执行完validate,一旦FieldError不为空,就会返回input视图给用户,不再执行业务逻辑方法 if(null==user.getUsername()||"".equals(user.getUsername().trim())){ this.addFieldError("user.username", "用户名不能不空!"); }else if(user.getUsername().length()<6||user.getUsername().length()>15){ this.addFieldError("user.username", "用户名长度必需在6~15之间!!"); }else if(!user.getUsername().matches("[\\w]+")){ this.addFieldError("user.username", "用户名只能是字母、数字或_符号!"); } if(null==user.getPassword()||"".equals(user.getPassword().trim())){ this.addFieldError("user.password", "密码不能不空!"); }else if(user.getPassword().length()<6||user.getPassword().length()>15){ this.addFieldError("user.password", "密码长度必需在6~15之间!"); } if(null==user.getRepassword()||"".equals(user.getRepassword().trim())){ this.addFieldError("user.repassword", "重复密码不能不空!"); }else if(!user.getPassword().equals(user.getRepassword())){ this.addFieldError("user.repassword", "输入密码不一致!"); } if(null==user.getEmail()||"".equals(user.getEmail().trim())){ this.addFieldError("user.email", "邮箱不能不空!"); }else if(!user.getEmail().matches("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+")){ this.addFieldError("user.email", "邮箱格式有误!"); } } }
知识提示:addFieldError方法属于ActionSupport类,其实里面是使用Map把错误信息以键值的方式存储。当执行完 validate方法后,接着会调用ActionSupport的hasErrors()方法,一旦存在错误信息,就返回input视图给用户,不再执行execute方法.最后在页面显示出这些信息给用户.
2、在struts.xml里配置
- <!-- 测试数据校验 -->
- <packagename="testvalidate"namespace="/test3"extends="struts-default">
- <!-- 用户注册界面 -->
- <actionname="registerUI">
- <result>/WEB-INF/jsp/register.jsp</result>
- </action>
- <!-- 用户注册 -->
- <actionname="register"class="cn.gkit.action.UserRegAction">
- <resultname="input">/WEB-INF/jsp/register.jsp</result>
- <resultname="success">/WEB-INF/jsp/welcome.jsp</result>
- </action>
- </package>
<!-- 测试数据校验 --> <package name="testvalidate" namespace="/test3" extends="struts-default"> <!-- 用户注册界面 --> <action name="registerUI"> <result>/WEB-INF/jsp/register.jsp</result> </action> <!-- 用户注册 --> <action name="register" class="cn.gkit.action.UserRegAction"> <result name="input">/WEB-INF/jsp/register.jsp</result> <result name="success">/WEB-INF/jsp/welcome.jsp</result> </action> </package>
3、新建register.jsp页面,为了简洁,这里不对页面进行布局.
- <s:formaction="register"namespace="/test3">
- 用户名:<s:textfieldname="user.username"/>
- <s:fielderrorcssStyle="color:red;">
- <s:param>user.username</s:param>
- </s:fielderror><br/>
- 密码:<s:passwordname="user.password"/>
- <s:fielderrorcssStyle="color:red;">
- <s:param>user.password</s:param>
- </s:fielderror><br/>
- 重复密码:<s:passwordname="user.repassword"/>
- <s:fielderrorcssStyle="color:red;">
- <s:param>user.repassword</s:param>
- </s:fielderror><br/>
- 电子邮箱:<s:textfieldname="user.email"/>
- <s:fielderrorcssStyle="color:red;">
- <s:param>user.email</s:param>
- </s:fielderror><br/>
- <s:submitvalue="提交"/>
- </s:form>
<s:form action="register" namespace="/test3"> 用户名:<s:textfield name="user.username" /> <s:fielderror cssStyle="color:red;" > <s:param>user.username</s:param> </s:fielderror><br/> 密码:<s:password name="user.password"/> <s:fielderror cssStyle="color:red;"> <s:param>user.password</s:param> </s:fielderror><br/> 重复密码:<s:password name="user.repassword"/> <s:fielderror cssStyle="color:red;" > <s:param>user.repassword</s:param> </s:fielderror><br/> 电子邮箱:<s:textfield name="user.email"/> <s:fielderror cssStyle="color:red;" > <s:param>user.email</s:param> </s:fielderror><br/> <s:submit value="提交"/> </s:form>
知识提示:<s:fielderror />是从fielderror里面取出错误信息,<s:param />是取出指定key的错误消息.
4、validate方法会对action里面的所有业务方法进行校验,但如何只对指定的方法进行校验呢?
如增加一个reg方法:
- public String reg(){
- return Action.SUCCESS;
- }
public String reg(){ return Action.SUCCESS; }
写一个只对reg业务方法进行校验的方法:
- publicvoid validateReg(){
- //写验证代码,类似之前写的validate方法
- }
public void validateReg(){ //写验证代码,类似之前写的validate方法 }
知识提示:如果一个action里面有多个业务方法,指定要校验的方法名的定义规则:validate+业务方法名(首字母要大写).
执行流程: 封装表单数据后-->先调用validateReg方法-->再调用validate方法. validate方法最终还是会被调用的。所以当action里面有多个业务方法时,我们不会去重写validate方法,而是对应每一个业务方法都写一个验证方法. 如果要写一个只对execute方法校验的方法,一样方法名可以写成validateExecute方法.