validateXxx()方法

上一篇文章写了使用Action的validate()方法,validate()仅仅能对action的所有方法进行验证。而要实现对action中特定的方法进行验证,就须要使用validateXxx()方法。

validateXxx()仅仅会校验action中方法名为xxx的方法。当中Xxx的第一个字母要大写。

源码

UserAction.java

package org.dny.action;

import org.dny.model.User;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; public class UserAction extends ActionSupport implements ModelDriven<User>{
private User user; @Override
public User getModel() {
if(this.user == null)
this.user = new User(); return this.user;
} public String login() { //登录
System.out.println("UserAction login");
System.out.println("userName:"+user.getUserName());
System.out.println("paswword:"+user.getPassword()); return "loginSuccess";
} public void validateLogin() {
System.out.println("UserAction validateLogin");
if(user.getUserName() == null || user.getUserName().trim().equals(""))
this.addFieldError("loginUserName", "帐号不能为空"); //给loginUserName属性加入错误消息“帐号不能为空”
if(user.getPassword() == null || user.getPassword().trim().equals(""))
this.addFieldError("loginPassword", "密码不能为空");
} public String register() { //注冊
System.out.println("UserAction register");
System.out.println("userName:"+user.getUserName());
System.out.println("paswword:"+user.getPassword()); return "registerSuccess";
} public void validateRegister() {
System.out.println("UserAction validateRegister");
if(user.getUserName() == null || user.getUserName().trim().equals(""))
this.addFieldError("registerUserName", "帐号不能为空"); //给registerUserName属性加入错误消息“帐号不能为空”
if(user.getPassword() == null || user.getPassword().trim().equals(""))
this.addFieldError("registerPassword", "密码不能为空");
} @Override
public void validate() {
System.out.println("UserAction validate"); }
}

这里的UserAction中有login()和register()两个方法,以及与二者相应的validateLogin()和validateRegister()验证方法。

struts.xml配置

<action name="user_*" class="org.dny.action.UserAction" method="{1}">
<result name="loginSuccess">/success.jsp</result>
<result name="registerSuccess">/success.jsp</result>
<result name="input">/index.jsp</result>
</action>

登陆成功或者注冊成功都会跳转到success.jsp页面。而验证失败时会跳转到index.jsp页面。

index.jsp页面

<center>
登录<br>
<!-- 登录 -->
<form action="user_login" method="post">
<table>
<tr>
<td>帐号:</td>
<td><input type="text" name="userName"></td>
<td>
<!-- 通过EL表达式取出 fieldErrors中loginUserName的值 -->
${fieldErrors['loginUserName'][0]}
</td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password"></td>
<td>
<!-- 通过EL表达式取出 fieldErrors中loginPassword的值 -->
${fieldErrors['loginPassword'][0]}
</td>
</tr>
<tr>
<td></td>
<td align="left"><input type="submit" value="登录"> <input
type="reset" value="重置">
</tr>
</table>
</form>
</center> <hr> <center>
错误信息<br>
<!-- 通过EL表达式取出 fieldErrors中所有的错误消息 -->
通过EL表达式取出 fieldErrors中所有的错误消息:<br> ${fieldErrors}<br>
<br>
<!-- 通过struts标签取出fielderror中所有的错误消息 -->
通过struts标签取出fielderror中所有的错误消息:
<s:fielderror />
</center> <hr> <center>
注冊<br>
<!-- 注冊 -->
<form action="user_register" method="post">
<table>
<tr>
<td>帐号:</td>
<td><input type="text" name="userName"></td>
<td>
<!-- 通过EL表达式取出 fieldErrors中registerUserName的值 -->
${fieldErrors['registerUserName'][0]}
</td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password"></td>
<td>
<!-- 通过EL表达式取出 fieldErrors中registerPassword的值 -->
${fieldErrors['registerPassword'][0]}
</td>
</tr>
<tr>
<td></td>
<td align="left"><input type="submit" value="注冊"> <input
type="reset" value="重置">
</tr>
</table>
</form>
</center> <hr> <center>
<s:debug />
</center>

运行结果及截图

验证流程

1、类型转换器对请求參数运行类型转换。并把转换后的值赋给action中的属性。

2、假设在运行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息加入到fieldErrors里。

无论类型转换是否出现异常,都会进入第3步。

3、系统通过反射技术先调用action中的validateXxx()方法,Xxx为方法名。

4、再调用action中的validate()方法。

5、经过上面4步。假设系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自己主动将请求转发至名称为input的视图。

假设系统中的fieldErrors没有不论什么错误信息。系统将运行action中的处理方法。

參考链接:

http://blog.csdn.net/houpengfei111/article/details/9038233

最新文章

  1. seo优化urlrewrite伪静态技术
  2. [SDN] mininet walkthrough
  3. KK录像机破解补丁
  4. Linux下做软RAID
  5. ylbtech-Recode(记录)-数据库设计
  6. locals()函数访问当前还在作用范围内的局部变量
  7. Sqoop详细介绍包括:sqoop命令,原理,流程
  8. gcc编译器基本命令
  9. erlang学习笔记(1)
  10. .NET Core中的包、元包与框架
  11. Python基础总结
  12. hdu1394 分治 or 线段树
  13. Python Cookbook(第3版)中文版:15.15 C字符串转换为Python字符串
  14. 【Android应用开发】分享一个录制 Android 屏幕 gif 格式的小技巧
  15. nginx部署静态网站
  16. flink metric库的使用和自定义metric-reporter
  17. Linux~上部署.net MVC出现的问题与解决
  18. 八大排序算法——堆排序(动图演示 思路分析 实例代码java 复杂度分析)
  19. 如何才能在python的路上走得更远
  20. 执行Runtime.exec()需要注意的陷阱

热门文章

  1. poj_2777线段树+位运算
  2. [JSOI2008] [BZOJ1567] Blue Mary的战役地图 解题报告 (hash)
  3. 实时监控Cat之旅~对Get和Post进行封装,支持分布式消息树
  4. AD域导入导出命令
  5. OpenGL编程逐步深入(七)旋转变换
  6. &lt;Sicily&gt;Funny Game
  7. c# 静态成员和实例成员的区别
  8. UI Framework-1: Aura Graphics Architecture
  9. windows平台Perl模块离线安装
  10. C# http服务器