这是一种编码校验的方法, 我重写ActionSupport父类的validate方法来实现 .
Action执行时一定会执行validate方法, 若有不合格的输入 就调用 addFieldError("age", "年领应在0-200之间");方法.
1 login.jsp
HTML标签:
错误信息 :<s:fielderror ></s:fielderror> <form action="login.action" method="post"> 用户名:<input type="text" name="username" value="${username}"/><br> 年 龄:<input type="text" name="age" value="${age}"/><br> 生 日:<input type="text" name="birthday" value="${birthday}"/><br> 点对象:<input type="text" name="point" value="${point}"/><br> <input type="submit" value="提交"/> </form>
struts2标签
<s:form action="login"> <s:textfield name="username" label="用户名"></s:textfield> <s:textfield name="age" label="年 龄"></s:textfield> <s:textfield name="birthday" label="生 日"></s:textfield> <s:textfield name="point" label="点对象"></s:textfield> <s:submit></s:submit> </s:form>
2 LoginAction.java
package ssh.org.web; import java.util.Date; import java.util.List; import ssh.org.util.Point; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { /** * */ private static final long serialVersionUID = 1L; private String username; private int age; private Date birthday; private List<String> aihao; @Override public String execute() throws Exception { return "success"; } @Override public void validate() { if (age < 0 || 200 < age) { addFieldError("age", "年领应在0-200之间"); } } }
看上面的validate()方法,很简洁,因为少了类型转换,这个工作由Struts2内建的类型转换器把请求参数转换为所须要的类型.
3 结果
------------------------------validateXxx() 方法-------------------------------------------
一个Action可以包含多个处理逻辑
public class UserAction extends ActionSupport { private static final long serialVersionUID = 1L; private String username; private int age; private Date birthday; private List<String> aihao; public String addUser() throws Exception { //添加用户 return "success"; } public void validateAddUser() { if (null == username || "".equals(username)) { addFieldError("username", "用户名不能为空"); } System.out.println("validateAddUser() 验证方法 "); } public String getUserList() { //取得所有用户 return "success"; } public void validateGetUserList() { //验证方法略... System.out.println("validateAddUser() 验证方法 "); } // --测试用 @Override public String execute() throws Exception { return "success"; } @Override public void validate() { if (age < 0 || 200 < age) { addFieldError("age", "年领应在0-200之间"); } System.out.println("~~~~~~基本~~~~~ "); } }
上面的就有三个处理业务的方法 addUser(),getUserList(),execute()
addUser(),getUserList() 方法分别有 不同的验证 方法:validateAddUser(),validateGetUserList() , 也就是validateXxx() 方法.
业务方法叫什么, 验证方法就叫validate+ 业务方法名(首字母大写)
这样, 在执行某个 业务方法,就会执行与它同名的验证方法,执行addUser()这前就会检查有没有validateAddUser()方法, 有就执行之.
---------------------------------------------
其实有了 addUser(),getUserList() 这两方法, execute()就可以不要, 但我为了说明一个 多个validate方法执行的顺序, 还是加上了.
不论执行 addUser()还是getUserList() 方法,validate()方法一定会执行, 这是我们不想要的, 有两解决方法:
1 不写 execute() , 也就不用写validate()方法
2 写 execute(), 把validate() 改名为validateExecute().
关于动态执行 Action中的某个方法, 我在以后讲, 会有例子.