`

深入探讨struts的ActionMessages消息机制

阅读更多

在介绍ActionMessages前,我觉得有必要先介绍一下ActionMessages的数据结构.理解了其数据结构有助于理解相关的各种操作.

    ActionMessages以一个HashMap存储ActionMessage.Map中的key是一个标识,其对应的value是一个List对象,所有的ActionMessage存储在List中.也就是说key标识了一组ActionMessage.
    先介绍涉及到的类中的几个常用方法,然后给出几个示例代码,帮助理解.
  • ActionMessage
    • ActionMessage(String key)
      该方法接受一个字符串,字符串是在资源文件种配置的key值,必须在配置文件中进行相关配置.
    • ActionMessage(String key,Object value)
      ActionMessage(String key,Object value0,Object value1)
      ActionMessage(String key,Object value0,Object value1,Object value2)
      ActionMessage(String key,Object value0,Object value1,Object value2,Object value3)
      上面4个方法第一个参数同样是资源文件中配置的key值,同样必须在配置文件中进行相关配置.后面的参数为资源文件中key所对应的信息中需要的参数
    • ActionMessage(String key,Object[] values)
      这种方法第一个参数同上,第二个参数接受一个Object数组,其中保存key在资源文件中对应信息需要的参数.
  • 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中.
  • Action及其所有子类
    • 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")
    • saveMessages(HttpServletRequest request,ActionMessages messages)
      该方法保存messages时,如果request中已经有一个ActionMessages对象,则用新的覆盖原有的.不推荐使用该方法,该方法容易发生丢失信息的情况.
    • addErrors()和saveErrors()
      这两个方法与addMessages()和saveMessages()相似,不过在HttpServletRequest.setAttribute()时的参数不一样,这两个方法是:setAttribute(Globals.ERROR_KEY,messages)添加的.(Globals.ERROR_KEY = "org.apache.struts.action.ERROR")
           在request中添加的ActionMessages在页面显示时,用<html:messages>标签进行显示,下面介绍一下该标签和经常配套使用的<logic:messagePresent>标签.
          <html:messages>
 id  必须指定id属性.<html:messages>标签作用是遍历ActionMessages对象中的所有    ActionMessage.类似<logic:iterator>,每次循环都定义一个名称为id指定的页面范围的bean,然后用    <bean:write>标签进行输出.
 bundle  绑定一个MessageResources,不指定的时候从上下文中配置的资源中检索.一般不指定bundle属性.
 locale  指定本地化信息,不指定时和Session的本地化信息相同,一般不用指定.
 name  指定ActionMessages对象在request中的key.不指定时,默认用      GLOBALS.ERROR_KEY="org.apache.struts.action.ERROR",用Action.addMessages()方法添加的信息将不    被显示,用Action.addErrors()方法添加的信息才会被显示.一般不指定.
 property  指定哪些ActionMessage将被显示,与ActionMessages.addMessage(String property,ActionMessage am)中的property参数相对应.不指定的时候显示所有信息.
 header  指定一个资源信息key,在显示ActionMessages前打印到页面上,可选.
 footer  指定一个资源信息key,在显示完ActionMessages后打印到页面上,可选.
 message 取值为true/false,默认为false.为false或不指定时,在request中查找key=Globals.ERROR_KEY的ActionMessages bean.当该属性设置为true时,在request中查找key=Globals.MESSAGE_KEY的ActionMessages bean,同时name属性的值将被忽略.
 
         <logic:messagesPresent>和<logic:messagesNotPresent>标签,只支持message,name,property3个属性,作用和<html:messages>相同,就不再介绍

下面给出一段代码,帮助大家理解,这里只写了关键代码.
1. Action 类中的部分代码:
ActionMessages ams = new ActionMessages();
    ams.add(ActionMessages.GLOBAL_MESSAGE,
                              new ActionMessage("addMessages : global message",false));
    ams.add("error",new ActionMessage("addMessages : error message",false));
    ams.add("info",new ActionMessage("addMessages : info message",false));
    this.addMessages(httpServletRequest,ams);

    ActionMessages errorMessage = new ActionMessages();
    errorMessages.add(ActionMessages.GLOBAL_MESSAGE,
                              new ActionMessage("addErrors : global message",false));
    errorMessages.add("error",
                              new ActionMessage("addErrors : error message",false));
    errorMessages.add("info",new ActionMessage("addErrors : info message",false));
    this.addErrors(httpServletRequest,errorMessages);

2.  JSP文件中的部分代码:
 

<html:messages id="message">
  <bean:write name="message"/>
  <br/>
</html:messages>
<!-- 上面代码的输出结果:
  addErrors : global message
  addErrors : error message
  addErrors : info message
-->

<html:messages id="message" property="info">
  <bean:write name="message"/>
  <br /> 
</html:messages>
<!-- 这段代码的输出结果为:
  addErrors : info message
-->

  
<html:messages id="message" message="true">
  <bean:write name="message"/> 
  <br /> 
</html:messages>
<!-- 这段代码的输出结果:
  addMessages : global message
  addMessages : error message
  addMessages : info message
-->

<html:messages id="message" message="true" property="info">
  <bean:write name="message"/>
  <br />
</html:messages>
<!-- 这段代码的输出结果为:
  addMessages : info message
-->

        如果结合上<logic:messagesPresent>标签,将可以做出自由度很高的错误信息显示效果,具体如何表现这里就不在细说了.<logic:messagePresent>的使用方法大家自己体会,我相信大家掌握了<html:messages>,一定能驾驭<logic:messagesPresent>
        对struts的ActionMessages的讨论就到这里,希望这篇文章能对广大刚接触struts的朋友们有所帮助. 
分享到:
评论

相关推荐

    struts技术实现留言功能

    在“struts技术实现留言功能”这一主题中,我们将深入探讨如何使用Struts框架来实现网站的留言和发帖功能。 首先,我们需要理解Struts的工作原理。Struts基于Model-View-Controller(MVC)设计模式,将业务逻辑、...

    struts1开发库

    下面我们将深入探讨Struts1的关键概念、核心组件以及它在实际开发中的应用。 1. **MVC架构**:MVC模式是软件设计中的一种常见架构,用于分离应用程序的业务逻辑、数据处理和用户界面。Struts1作为MVC框架,通过...

    Struts 1.3.8 学习笔记(六)

    在本学习笔记中,我们将深入探讨 Struts 1.3.8 的核心概念、功能以及实际应用。Struts 为开发者提供了构建动态 Web 应用程序的结构框架,简化了开发流程,增强了代码的可维护性和可扩展性。 首先,我们来了解 MVC ...

    Struts 之旅 - 多国语言

    在"Struts 之旅 - 多国语言"这个主题中,我们将深入探讨Struts框架如何支持多语言国际化(i18n)功能,这对于构建全球化应用程序至关重要。 1. **国际化(i18n)基础**: 国际化是指设计和实现软件,使其能够适应...

    struts2输入校验总结

    在本文中,我们将深入探讨Struts2的输入校验功能,包括手动输入校验和基于验证框架的输入校验。 ### 一、手动输入校验 1. **普通处理方式**: - 在Action类中,你可以重写`validate()`方法,该方法会在业务逻辑...

    struts_crud源码

    本源码分析将深入探讨如何在Struts框架中实现这些基本操作。 1. **Struts框架基础** - **ActionServlet**:作为Struts的核心,它是Servlet的子类,处理HTTP请求并分派到相应的Action。 - **ActionMapping**:定义...

    07Struts错误处理

    本文将深入探讨Struts框架中的错误处理机制,并结合具体的示例来阐述如何在实际项目中进行有效的错误管理。 #### 二、Struts框架概述 Struts是一款开源的Web应用框架,基于Java Servlet/JavaServer Pages技术。它...

    Struts1.2 多文件上传下载

    在"Struts1.2 多文件上传下载"这个主题中,我们将深入探讨如何使用Struts1.2实现多个文件的上传和下载功能。 首先,文件上传功能在Web应用中很常见,例如用户可能需要上传个人照片、文档或其他媒体文件。在Struts...

    struts2的自定义校验器代码

    本文将深入探讨如何在Struts2中创建和使用自定义校验器。 ### 一、Struts2验证概述 Struts2的验证机制主要基于两个部分:`Validation拦截器`和`Validator插件`。`Validation拦截器`负责调用相应的验证逻辑,而`...

    StrutsInAction中文

    8. **异常处理**:学习如何在Struts中配置全局和局部异常处理策略,使用ActionError和ActionMessages管理错误和消息。 9. **Tiles框架集成**:Struts可以与Tiles框架结合使用,实现更复杂的页面布局和组件重用。 ...

Global site tag (gtag.js) - Google Analytics