Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1085|回复: 0

AtionErrors和ActionMessages的区别

[复制链接]

该用户从未签到

发表于 2011-10-13 11:25:50 | 显示全部楼层 |阅读模式
尽管Struts框架提供了有效的异常处理机制,但不能保证处理所有的错误,这时Struts框架会把错误抛给Web容器,在默认情况下Web容器会向用户浏览器直接返回原始信息。如果想避免直接让用户看到这些原始信息,可以在web.xml中配置<error-page>元素,以下代码演示了如何避免用户看到HTTP 404、HTTP 500错误和Exception异常。
web.xml:
  <error-page>
    <error-code>404</error-code>
    <location>/exception/error404.jsp</location>
  </error-page>
  <error-page>
    <error-code>500</error-code>
    <location>/exception/error500.jsp</location>
  </error-page>
  <error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/exception/default.jsp</location>
  </error-page>
当WEB容器捕获到exception-type或error-code指定的错误时将跳到由location指定的页面。
? 问题:当form bean 为动态bean时,在action中无法对form bean数据进行验证,因为formbean没有具体实现类。action中无法引用
? ActionError/ActionErrors/ActionMessage/ActionMessages:
有时候你需要向用户提供相关处理信息,包括表单验证时发现错误等。
1. 相关类介绍:
ActionMessage:用于保存一个与资源束对应的提示信息。主要构造函数如:
ActionMessage(String message);
ActionMessage(String message,paramater)。
ActionMessages:用于保存多个ActionMessage。并在HTML:errors 和html:messages中起作用。
主要构造函数:
ActionMessages().
主要方法是add(String property,ActionMessage message)
ActionMessages有一个HashMap类型messages保存多个ActionMessage对象,每个ActionMessage对象都有唯一的一个property标识。这个property可以是自定义的任意字符串,也可以由org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE指定
html:messages/html:errors使用property属性访问某个资源
ActionErrors:用于保存一个与资源束对应的错误信息。用法跟ActionMessages差不多。
ActionError不赞成使用。
2. 版本:
struts1.1中用ActionErrors报告错误,用ActionMessages提供信息。
在struts1.2中使用ActionMessages提供信息和错误,不赞成使用ActionError
struts1.3中已经没有ActionError类了。
3. 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 cut标签显示每个信息.例如:
<html:messages message="true" id="msg">
    <c:out value="${msg}"/>

</html:messages>
3. 具体的一个例子:
接受输入页面input.jsp:
  <html:form action="/errormessage/input">
    phoneNumber : <html:text property="phoneNumber"/> <html:errors     property="<%=org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE %>"/><br/>
  <html:submit/><html:cancel/>
  </html:form>
struts-config.xml:
  <form-beans >
    <form-bean name="inputForm" type="cn.rolia.struts.form.errorexception.InputForm" />
  </form-beans>
  <action-mappings >
    <action
      attribute="inputForm"
      input="/errormessage/input.jsp"
      name="inputForm"
      path="/errormessage/input"
      scope="request"
      type="com.yourcompany.struts.action.errormessage.InputAction"
      validate="false">
      <forward name="success" path="/errormessage/success.jsp" />
    </action>
  </action-mappings>
InputAction.java:
public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {
  cn.rolia.struts.form.errorexception.InputForm inputForm = (cn.rolia.struts.form.errorexception.InputForm) form;// TODO Auto-generated method stub
  String phoneNumber = inputForm.getPhoneNumber();
  if(phoneNumber.length()<4){
  ActionErrors messages = new ActionErrors();
    messages.add(org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE,new ActionMessage("error.errormessage.input"));
    this.saveErrors(request, messages);
    return mapping.getInputForward();
  }
  return mapping.findForward("success");
}
解说:用户输入手机号码,页面跳转到InputAction控制层进行处理,若输入数据小于4,则创建一个ActionMessage类存储相关错误信息。然后再创建ActionErrors类将此ActionMessage放入ActionErrors。再调用Action的saveErrors方法将此ActionErrors保存的request范围里,然后返回input.jsp页面要求重新输入并用html:errors提示错误信息。
4. Action包含saveErrors()方法和saveMessages()方法。如果创建的ActionErrors则应该调用saveErrors(),若创建的是ActionMessages则应该调用saveMessages()方法。
saveErrors()接收ActionMessages而不是ActionErrors;同时将其保存在request中并用一个由org.apache.struts.Globals.ERROR_KEY指定的常量” org.apache.struts.Globals.ERROR_KEY”标识这个ActionMessages,便于html:errors查找。saveMessages()方法接收ActionMessages同时将其保存在request中并用一个由org.apache.struts.Globals.MESSAGE_KEY指定的常量” org.apache.struts.Globals.MESSAGE_KEY”标识这个ActionMessages,进而让html:messages从常量Globals.ERROR_KEY中遍历获取信息。可以将其属性message设置为true,那么它将从常量Globals.MESSAGE_KEY中遍历获取信息。
5. 默认情况下html:messages从
如果你想将信息保存在session里而不是request,struts1.2提供了
struts1.1没有的saveMessages(HttpSession session, ActionMessages messages)方法和saveErrors(javax.servlet.http.HttpSession session, ActionMessages errors)方法。
InputAction.java:
public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {
cn.rolia.struts.form.errorexception.InputForm inputForm = (cn.rolia.struts.form.errorexception.InputForm) form;// TODO Auto-generated method stub
  String phoneNumber = inputForm.getPhoneNumber();
  if(phoneNumber.length()<4){
    ActionErrors messages = new ActionErrors();
    messages.add(org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE,new ActionMessage("error.errormessage.input"));
    this.saveErrors(request.getSession(true), messages);
    return mapping.getInputForward();
  }
  return mapping.findForward("success");
}
*******************************************http://hi.baidu.com/tuqiangkk/bl ... d4782743a75b33.html
ActionMessages与ActionErrors简单讲解
2007年10月25日 星期四 12:12
在Struts里进行表单验证和业务逻辑验证真是一个很麻烦的事情,下面讲一下简单的经验(自己的与他人的结合),
经验就是:
1、ActionErrors 是ActionMessages的子类,同样ActionError 是ActionMessage的子类。
2、在ActionFrom中使用ActionErrors
错误信息添加用errors.add(“error_key“,new ActionError(“error.input.name“))
方法注解:void add(java.lang.String property, ActionError error)
            Add an error message to the set of errors for the specified property.
jsp中使用显示错误。<html:errors property="error_key"/>
3、在Actoin中使用ActionMessages
它有两个add方法:
void add(ActionMessages messages)
            Adds the messages from the given ActionMessages object to this set of messages.
void add(java.lang.String property, ActionMessage message)
            Add a message to the set of messages for the specified property.
错误信息添加使用errors.add(“error_key“,new ActioinMessage(“errors.loginerror“))
另外要调用this.saveMessages(request,errors)方法;
这是org.apache.struts.action.Action中的方法,要用到的大概有两个:
saveErrors(少用)
protected void saveErrors(javax.servlet.http.HttpServletRequest request,
                            ActionErrors errors)
Save the specified error messages keys into the appropriate request attribute for use by the <html:errors> tag, if
any messages are required. Otherwise, ensure that the request attribute is not created.
Parameters:
request - The servlet request we are processing
errors - Error messages object
--------------------------------------------------------------------------------
saveMessages(常用)
protected void saveMessages(javax.servlet.http.HttpServletRequest request,
                              ActionMessages messages)
Save the specified messages keys into the appropriate request attribute for use by the <html:messages> tag (if
messages="true" is set), if any messages are required. Otherwise, ensure that the request attribute is not
created.
Parameters:
request - The servlet request we are processing
messages - Messages object
Since:
Struts 1.1
<html:messages id="errors" message="true">
<font color="red"><bean:write name="errors"/></font>
</html:messages>
jsp中使用来显示错误。不要管id和name中是什么,只要两者一样,就会显示所有的ActionMessages出来
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-13 06:18 , Processed in 0.453115 second(s), 49 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表