ActionErrors 使用说明 struts1 validate 处理流程 详细教程(转)
转自(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>
ActionErrors 使用说明 struts1 validate 处理流程 详细教程(转)的更多相关文章
- Struts1简单开发流程梳理
共享数据的4种范围MVC设计模式JSP model1.JSP model2struts实现MVC机制(ActionServlet.Action)struts-config.xml ActionServ ...
- Git使用详细教程(一)
很久不发博客,最近有兴趣想写点东西,但 Live Writer 不支持从Word复制图片,疯狂吐槽下 Git使用详细教程(一) Git使用详细教程(二) 该教程主要是Git与IntelliJ IDEA ...
- WebRTC VideoEngine超详细教程(三)——集成X264编码和ffmpeg解码
转自:http://blog.csdn.net/nonmarking/article/details/47958395 本系列目前共三篇文章,后续还会更新 WebRTC VideoEngine超详细教 ...
- 转载:python + requests实现的接口自动化框架详细教程
转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实现的接口自动化框架详细教程 前段时间由于公司测试方向的转型,由 ...
- 阿里云运维部署工具AppDeploy详细教程
AppDeploy是一个通过SSH实现的命令行工具,可完成应用部署和远程运维管理.当前工具实现为两个版本:普通版(伪代码描述语言)和Python版.Python版使用Python语法规则,可实现您的各 ...
- Solr服务在Linux上的搭建详细教程
一.系统环境 注:欢迎大家转载,非商业用途请在醒目位置注明本文链接和作者名dijia478即可,商业用途请联系本人dijia478@163.com. CentOS-6.7-i386-bin-DVD1 ...
- npm安装vue详细教程(图片详解)
npm安装vue详细教程(图片详解) 一.总结 一句话总结:整个安装流程照着教程来,注意系统环境变量的配置,注意一下npm的本地仓库和缓存位置 教程 系统环境变量 仓库 缓存 1.什么情况下最适合用n ...
- windows7配置Nginx+php+mysql的详细教程
windows7配置Nginx+php+mysql的详细教程 作者:Vincent.李 字体:[增加 减小] 类型:转载 时间:2016-09-04我要评论 这篇文章主要介绍了windows7配置Ng ...
- Ubuntu 搭建Web服务器(MySQL+PHP+Apache)详细教程
Ubuntu 搭建Web服务器(MySQL+PHP+Apache)详细教程 看了好多人的博客,有的不全 or 有问题,整理了一下,适合小白 新手先整理几个小问题 1.为啥使用 Linux 搭建服务器? ...
随机推荐
- wpfのpack协议
当引用的资源需要做成dll时,要用此协议 协议:pack:// 授权:有两种.一种用于访问编译时已经知道的文件,用application:///.一种用于访问编译时不知道.运行时才知道的文件 ...
- 2016年6月23日 星期四 --出埃及记 Exodus 14:20
2016年6月23日 星期四 --出埃及记 Exodus 14:20 coming between the armies of Egypt and Israel. Throughout the nig ...
- Android超类
android.test.AndroidTestCase android写测试类的超类 android.database.sqlite.SQLiteOpenHelper sqllite的超类
- linux内核中的GPIO系统之(1):软件框架
一.前言 作为一个工作多年的系统工程师,免不了做两件事情:培训新员工和给新员工分配任务.对于那些刚刚从学校出来的学生,一般在开始的时候总是分配一些非常简单的任务,例如GPIO driver.LED d ...
- UVA 590 二十一 Always on the run
Always on the run Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit ...
- 移除virbr0
在我们使用虚拟机管理器的图形界面来安装虚拟机的时候,自动创建虚拟网桥和虚拟网卡.另外,我们很少会在一个虚拟机中再安装一个虚拟机,所以,我们可以将宿主机上的网桥删除.方法如下: # virsh net- ...
- 经典JSP数据库连接(ORACLE、SQL Server、MySQL)
1.连接ORACLE8/8I/9I数据库(thin模式) <%@ page language="java" import="java.util.*" pa ...
- ironpython 2.75 在c#中的使用
ironpython的介绍请自行搜索. 一句话,python是一个类似lua js的动态预言.ironpython是在net环境执行python的类库. 效果:在网站中调用一个python文件test ...
- CSS笔记(四)文本
CSS 文本属性可定义文本的外观.通过文本属性,可以改变文本的颜色.字符间距,对齐文本,装饰文本和对文本进行缩进,等等. 参考:http://www.w3school.com.cn/css/css_t ...
- XML命名空间详解
http://happylongnv.blog.hexun.com/48859954_d.html 目的:解决同一个元素在相同文件中代表不同含义的问题.因为XML文档中使用的元素不是固定的,那么两个不 ...