转自(http://blog.csdn.net/wyx100/article/details/8736445).

struts1  处理流程是  jsp  -->  ActionForm 中的ActionErrors validate-->验证通过后执行 action  ,否则返回页面,显示错误信息!

/** Generated by MyEclipse Struts* Template path: templates/java/JavaClass.vtl*/
package org.myrose.form;import javax.servlet.http.HttpServletRequest;import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;/** * MyEclipse Struts* Creation date: 12-27-2007* * XDoclet definition:* @struts.form name="loginForm"*/
public class LoginForm extends ActionForm {/** Generated fields*//** password property */private String password;/** name property */private String id;private String validatecode;/** Generated Methods*/public String getValidatecode() {return validatecode;}public void setValidatecode(String validatecode) {this.validatecode = validatecode;}/** * Method validate* @param mapping* @param request* @return ActionErrors*/public ActionErrors validate(ActionMapping mapping,HttpServletRequest request) {ActionErrors errors = new ActionErrors();if(id == null || id.trim().equals("")){errors.add("login_id_null",new ActionMessage("login.id.null"));return errors;}else if(id.length() != 20){errors.add("login_id_length",new ActionMessage("login.id.length"));return errors;}else if(password == null || password.trim().equals("")){errors.add("login_password_null",new ActionMessage("login.password.null"));return errors;}else if(password.length() != 6){errors.add("login_password_length",new ActionMessage("login.password.length"));return errors;}else if(!validatecode.equals(request.getSession().getAttribute("rand").toString())){errors.add("login_validatecode_error", new ActionMessage("login.validatecode.error"));return errors;}return null;}/** * Method reset* @param mapping* @param request*/public void reset(ActionMapping mapping, HttpServletRequest request) {// TODO Auto-generated method stub
 }/** * Returns the password.* @return String*/public String getPassword() {return password;}/** * Set the password.* @param password The password to set*/public void setPassword(String password) {this.password = password;}public String getId() {return id;}public void setId(String id) {this.id = id;}}

一、简介ActionErrors与ActionMessages
ActionErrors是ActionMessages的子类,包括ActionMessage,他们都实现了接口java.io.serializable。原来ActionError是ActionMessage的子类,后来在struts1.3中已被弃用,估计原因是ActionMessage能满足要求,并且 ActionErrors亦能用作ActionMessage的容器,所以ActionError显得多余。
ActionErrors和ActionMessages都可作为ActionMessage的容器,ActionMessages实例也可以互为容器,甚至ActionErrors可以做父类实例ActionMessages的容器(这里体现了“里氏代换”原则——父类出现的地方,子类是可以安全替代的),既可以有errors.add(msgs)。

二、例子
先来看一个简单例子
1、资源文件错误信息来源(其格式为 key = value )
   error.test = this is a test error.
2、JSP页面中用于显示错误信息标签
   <html:errors property="testerror"/>
3、ActionFormBean的validate()方法中产生错误信息
   ActionErrors error = new ActionErrors();
   error.add("testerror",new ActionMessage("error.test"))
   return error;
这个例子的功能就是在ActionForm Bean的validate()方法中产生一条名为:testerror的错误信息,
错误信息息是资源文件中key为error.test的值。然后在页面上用html:errors标签输出testerror这条错误信息。
这是最常用的一种功能,所有的错误信息都在资源文件里面。
有人会问,错误信息只能存放在资源文件中吗,其实不是这样。不需要资源文件也可以产生错误信息。
1)ActionMessage(String key,boolean isresource)
如果isresource值为true,则表示key是资源文件中的key,产生的消息就是与key相对应的消息
如果isresource值为false,则表示key为一条普通的消息。
如果上面的error.add改为error.add("testerror",new ActonMessage("这是一条自定义消息",false",));
那么页面上显示的将是:这是一条自定义消息.

2)另外还可以用ActionMessage产生复合消息,比如我们要输出:xxx不能用作用户名,其中xxx是一个变量。
首先我们在资源文件中加一个条复合消息
testmsg = {0}不能用作用户名。这里{0}是要被替换的参数。
我们再来看一下ActionMessage的另一中构造方法
ActionMessage(String key,Object value0);
也就是说用value0的值来替换{0}
我们修改error.add为error.add("testerror",new ActonMessage("testmsg","xxx"))
那么JSP页面上将显示:xxx不能用作用户名。
当然在一条复合消息中也可带多个参数,参数依次为{0},{1},{2}或更多
例如:loginUser = 用户名:{0} 姓名:{1} 登录次数:{2}.....
那么在产生错误消息时就用new ActionMessage(String key,Object value0,Object value1,Object value2.....)
或者使用对象数组new ActionMessage(String key,Object[] values)
String[] detail = {"Admin","王晶","12"};
error.add("testerror",new ActionMessage("loginUser",detail))
________________________________________
Note:
Cannot find message resources under key org.apache.struts.action.MESSAGE 错误的原因是没有配置资源文件
解决办法: 在struts-config.xml 中加入如下的一段
<message-resources parameter="application" null="false"></message-resources>
-----------------------------------------------------------------------------------------------------------------------
在Action或Form里生成errors:
在Action中使用:
 ActionErrors errors = new ActionErrors();
//创建一个error,topic.show.error要在application.properties文件中声明
 ActionError error1 = new ActionError("topic.show.error");
//加入到errors ,content为键
  errors.add("content", error1);
//创建多个error
 ActionError error2 = new ActionError("topic.show.error");
 ActionError error3 = new ActionError("topic.show.error"); 
  errors.add("error2", error2);
  errors.add("error2", error3);      
//Action返回值是Forward,所以要保存此errors
  this.saveErrors(request, errors);
在JSP端就可以用:
<html:errors property="content" />
来显示error1这个错误。
若用<html:erros />则显示出所有的错误
三、详细讲解
ActionMessages以一个HashMap存储ActionMessage.Map中的key是一个标识,其对应的value是一个List对象,所有的ActionMessage存储在List中.也就是说key标识了一组ActionMessage.
1、 ActionMessage
1)ActionMessage(String key)该方法接受一个字符串,字符串是在资源文件种配置的key值,必须在配置文件中进行相关配置.
2)ActionMessage(String key,Object value)
3)ActionMessage(String key,Object value0,Object value1)
4)ActionMessage(String key,Object value0,Object value1,Object value2)
5)ActionMessage(String key,Object value0,Object value1,Object value2,Object value3)
上面4个方法第一个参数同样是资源文件中配置的key值,同样必须在配置文件中进行相关配置.
后面的参数为资源文件中key所对应的信 息中需要的参数 ActionMessage(String key,Object[] values)
这种方法第一个参数同上,第二个参数接受一个Object数组,其中保存key在资源文件中对应信息需要的参数.
6)ActionMessage(String msg,false )这个方法显示自定义消息,即消息输出内容为msg。
7)getKey()返回ActionMessage的key,返回类型:String。
8)getValues()返回ActionMessage中设定的资源文件参数,返回类型:Object[]。
2、ActionMessages
ActionMessages.add(String property,ActionMessage message)
第一个参数property对应于<html:messages>标签中的property属性, property的值一般采用ActionMessages类中的静态常量ActionMessages.GLOBAL_MESSAGE,也可以自己定义一个key.该方法执行时,先判断ActionMessages中有没有该key,如果没有就新添加对key-List键值对;如果有同样的key,就先获取该key对应的Value并转换为List对象,然后将(ActionMessage)message添加进List对象中.
ActionMessages.add(ActionMessages ams)该方法将参数中保存的ActionMessage合并到调用ActionMessages中.
3、Action及其所有子类
1)addMessages(HttpServletRequest request,ActionMessages messages)
 该方法首先检查request对象中是否有ActionMessages对象,如果有对象,则将接收的ActionMessages合并到request中,如果没有,用setAttribute(Globals.MESSAGE_KEY,messages)方法将messages添加进去.如果一个Action中需要显示多条错误信息,推荐使用该方法.
(Globals.MESSAGE_KEY ="org.apache.struts.action.ACTION_MESSAGE")
2)saveMessages(HttpServletRequest request,ActionMessages messages)
 该方法保存messages时,如果request中已经有一个ActionMessages对象,则用新的覆盖原有的.不推荐使用该方法,该方法容易发生丢失信息的情况.
3)addErrors()和saveErrors()
这两个方法与addMessages()和saveMessages()相似,不过在HttpServletRequest.setAttribute()时的参数不一样,这两个方法是:setAttribute(Globals.ERROR_KEY,messages)添加的.(Globals.ERROR_KEY = "org.apache.struts.action.ERROR")
4)clear()
5)isEmpty()
6)isAccessed()是否已将ActionMessages存入request中。
7)size()存于ActionMessages中的ActionMessage的数量。
8)size(String property)ActionMessages中property键对应的List中的ActionMessage的数量。
9)properties()返回ActionMessages的所有key,并存于Iterator中。
10)get()返回存于ActionMessages中的所有ActionMessage,并存于Iterator中。
11)get(String property)返回ActionMessages中property键对应的List中的所有ActionMessage,并存于Iterator中。
4、 AtionErrors和ActionMessages的区别
1) ActionErrors是ActionMessages的一个子类,功能几乎相同,不同点在于标签<html:errors/>和<html:messages>的使用上的区别。
html:errors指定了footer和header属性。默认值为errors.header和errors.footer,需要时可以自己指定。如果资源属性文件配置了 errors.header和errors.footer,则任何时候使用html:errors时开头和结尾都是这两个属性对应的资源信息。
而html:message默认情况下没有errors.header和errors.footer值,当然可以自己指定。
2)html:errors可以根据property属性指定显示一个错误信息。html:messages有一个必添项id。html:messages不能直接显示信息,它将选出的信息放入一个用id标识的Iterator对象里,然后在用ben:write或JSTL c:out标签显示每个信息.例如:
<html:messages message="true" id="msg">
    <c:out value="${msg}"/><br />
</html:messages>

转载于:https://www.cnblogs.com/kakaisgood/p/5548998.html

ActionErrors 使用说明 struts1 validate 处理流程 详细教程(转)相关推荐

  1. 阿里云域名注册流程(全流程详细教程)

    阿里云域名注册流程很简单,先注册阿里云账号,账号必须通过实名认证:然后创建信息模版,个人或企业信息模板必须通过实名认证:然后想好域名名称和域名后缀:最后在阿里云域名注册官网进行新域名的注册.阿里云百科 ...

  2. SpringBoot整合spring-ws开发webservice接口(全流程详细教程)

    场景 spring-ws spring-ws官网: https://spring.io/projects/spring-ws SpringWebServices(Spring-WS)是Spring社区 ...

  3. 小白学3D游戏建模全流程详细教程

    我想大多数接触游戏开发引擎的朋友们对于"次世代建模"这个词汇一定不会陌生,或许您是第一次接触到这个词汇,认为这是一门很复杂很深奥的技术,其实她没有你想象中的复杂,只要用对了方法,走 ...

  4. 云服务器架设网站教程_阿里云服务器购买流程详细教程及注意事项

    阿里云服务器如何购买?目前,无论个人站长还是企业,都将阿里云作为了上云首选,那么作为新手用户应该如何选择阿里云服务器呢?阿里云服务器配置选择,和网站或应用的类型.访问量.数据量大小.程序质量等因素息息 ...

  5. Git使用流程及技巧 - 详细教程

    Git使用流程及技巧 - 详细教程 前言 1. 技巧 1.1. 基础技巧 1.2. 提升SSH传输速度 1.3. 解决Git Bash命令行的中文乱码问题 1.3.1. 情况1:内部资源乱码 1.3. ...

  6. (一)Ubuntu安装详细教程(从镜像制作到NVIDIA驱动安装全流程)——超详细的图文教程

    Ubuntu安装详细教程(从下载镜像到安装NVIDIA驱动) 1.下载镜像文件 2.制作硬盘镜像 2.1 安装UltraISO并打开ISO文件 2.2 制作硬盘镜像 2.3 检查是否成功 3.划分磁盘 ...

  7. 3dmax:3dmax三维之各种材质参数化设置(贴图简介、设计流程)图文教程之详细攻略(切记收藏!)

    3dmax:3dmax三维动画之各种材质参数化设置(贴图简介.设计流程)图文教程之详细攻略(切记收藏!) 目录 3dmax三维动画之各种材质参数化设置(贴图简介.设计流程)图文教程之详细攻略 1.基本 ...

  8. vue form validate 多个input_Vue表单校验插件Vuerify使用详细教程及示例

    点击右上方红色按钮关注"web秀",让你真正秀起来 前言 表单校验,在开发中是非常常见的,为了防止用户误操作,填写错误数据,亦或是防止用户恶意提交数据等,都需要前端同学来做一些简单 ...

  9. Git使用技巧--详细教程

    Git使用流程及技巧 - 详细教程 前言 1. 技巧 1.1. 基础技巧 1.2. 解决Git Bash命令行的中文乱码问题 1.2.1. 情况1:内部资源乱码 1.2.2. 情况2:远程库资源乱码( ...

  10. Kubernetes详细教程

    Kubernetes详细教程 1. Kubernetes介绍 1.1 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署在物理机上 优点:简单, ...

最新文章

  1. Nginx之rewrite使用
  2. LVS server 关键点
  3. python print %s 号格式化输出
  4. linux vscode配置spring boot开发环境
  5. BZOJ-1951 古代猪文 (组合数取模Lucas+中国剩余定理+拓展欧几里得+快速幂)...
  6. 组策略里更改更新和设置客户端首页
  7. one_code=soup.find('a',href=re.compile(rill)) NameError: name 're' is not defined
  8. Oracle实现数据不存在则插入,数据存在则更新(insert or update)
  9. 自动驾驶 4-1 二维运动学建模Kinematic Modeling in 2D
  10. sudo rosdep init时出现错误: ERROR: cannot download default sources list from
  11. Docker安装mysql5.7
  12. RobotFramework-关键字-Wait Until Keyword Succeeds
  13. 分类变量、有序变量、数值变量差异分析(二)t检验
  14. Ubuntu 22.04 LTS 是史诗级的版本?
  15. 基于STM32设计智能称重系统(华为云IOT)
  16. linux下文件编码格式转换方法
  17. Windows Server 2008 安装VMware Tools
  18. ValidationError: Invalid options object.报错
  19. SEBASTIEN KWOK 2022春夏系列新品上市
  20. Win32程序设计初步之线程

热门文章

  1. oracle 之 游标
  2. js【Object.prototype.hasOwnProperty()方法】
  3. 我的挨踢人物传之又是一年找工作时
  4. 证书格式简介及不同格式之间的转换方式
  5. 2个区别搞懂web.xml配置Session超时时间
  6. 搭建 WPF 上的 UI 自动化测试框架
  7. Webbench学习笔记一:源码获取和使用
  8. 获取相对于父元素的位置
  9. 斜率优化dp学习笔记
  10. append 注意事项