struts2:数据校验,通过Action中的validate()方法实现校验(续:多业务方法时的不同验证处理)
前文:struts2:数据校验,通过Action中的validate()方法实现校验,图解
如果定义的Action中存在多个逻辑处理方法,且不同的处理逻辑可能需要不同的校验规则,在这种情况下,就需要通过Struts2框架提供的validateX()方法来准确校验Action中的某一个方法,其中X表示处理逻辑的方法名。
还是以前的例子,换一种写法,来说明validate()方法和validateX()方法的用法。
1. 创建前台JSP页面
表单录入页面:registerM.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ page isELIgnored="false"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <s:form action="registerM" method="post"> 账号:<s:textfield name="username"></s:textfield>${errors.username[0]} <br/> 密码:<s:textfield name="password"></s:textfield>${errors.password[0]} <br/> 年龄:<s:textfield name="age"></s:textfield>${errors.age[0]} <br/> 身高:<s:textfield name="height"></s:textfield>${errors.height[0]} <br/> <s:submit method="log" value="提交"></s:submit> </s:form> </body> </html>
注意:submit元素中的method属性为log,表示调用Action中的log方法,而不是默认的execute方法。
提交成功后显示页面:success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ page isELIgnored="false"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> success! :) </body> </html>
2. 创建Action类
package com.clzhang.struts2.demo1; import com.opensymphony.xwork2.ActionSupport; public class RegisterMAction extends ActionSupport { public static final long serialVersionUID = 1; private String username; private String password; private Integer age; private Double height; 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 Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Double getHeight() { return height; } public void setHeight(Double height) { this.height = height; } public void validateLog() { System.out.println("validateLog方法被调用..."); if (!username.trim().equals("admin")) { this.addFieldError("username", "用户非法,必须为admin"); } if (!password.trim().equals("pass1")) { this.addFieldError("password", "密码非法,必须为pass1"); } if (age == null || age >= 110 || age < 0) { this.addFieldError("age", "年龄非法,必须为0到100之间"); } if (height == null || height < 0 || height > 3) { this.addFieldError("height", "身高非法,必须为0到3米之间"); } } public String log() { System.out.println("log method said:"+ username + "|" + age + "|" + height + " register finished!"); return SUCCESS; } @Override public void validate() { System.out.println("validate方法被调用..."); } public String execute() { System.out.println(username + "|" + age + "|" + height + " register finished!"); return SUCCESS; } }
注意:execute()方法对应验证方法为validate()方法;而log()方法对应的验证方法则为validateLog()方法。
3. 修改struts.xml文件
<action name="registerM" class="com.clzhang.struts2.demo1.RegisterMAction"> <result name="success">/struts2/demo1/success.jsp</result> <result name="input">/struts2/demo1/registerM.jsp</result> </action>
很简单,提交成功显示成功信息;数据不正确则返回到registerM.jsp。
4. 测试
打开IE,输入地址:http://127.0.0.1:8080/st/struts2/demo1/registerM.jsp
结果如下:
直接提交,结果如下:
后台显示:
输入正确的数据,再次提交,前台显示到成功页面,后台显示:
注意:每次运行都是先调用validateLog方法,然后再调用validate方法(哪怕是validateLog方法已经出错了)。校验出错时,使用函数addFieldError将错误信息key-value对放入到容器中,在JSP中再取出来显示。