深入探讨struts的ActionMessages消息机制 


2007-11-22 10:23:01
标签:struts ActionMessages 消息机制    [推送到技术圈]

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://leaze.blog.51cto.com/83088/51750
在介绍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的朋友们有所帮助. 
本文出自 “立子” 博客,请务必保留此出处http://leaze.blog.51cto.com/83088/51750

转载于:https://blog.51cto.com/j2eedev/169539

深入探讨struts的ActionMessages消息机制(转)相关推荐

  1. 动态的Objective-C——关于消息机制与运行时的探讨

    2019独角兽企业重金招聘Python工程师标准>>> 动态的Objective-C--关于消息机制与运行时的探讨 一.引言 Objective-C是一种很优美的语言,至少在我使用其 ...

  2. 【腾讯Bugly干货分享】经典随机Crash之二:Android消息机制

    为什么80%的码农都做不了架构师?>>>    本文作者:鲁可--腾讯SNG专项测试组 测试工程师 背景 承上经典随机Crash之一:线程安全 问题的模型 好几次灰度top1.top ...

  3. Handler消息机制(二):一个线程有几个Handler

    在消息机制里面,有一个非常重要的东西,那就是Looper,Looper的作用主要是从消息队列里面取出消息交给Handler处理,不过不仅限于此,在这里面还有很多东西值得我们去源码看一看: 1.从Loo ...

  4. Android消息机制学习笔记

    Android的消息机制主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑: MessageQueue:消息队列,它的内存存储了一组消息,以队 ...

  5. WPF的消息机制(二)- WPF内部的5个窗口之隐藏消息窗口

    原文:WPF的消息机制(二)- WPF内部的5个窗口之隐藏消息窗口 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/powertoolsteam/ar ...

  6. iOS开发系列--通知与消息机制

    http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣 ...

  7. Android消息机制Handler用法

    这篇文章介绍了Android消息机制Handler用法总结,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 1.简述 Handler消息机制主要包括: Messa ...

  8. EJB与JAVA BEAN_J2EE的异步消息机制

    EJB与JAVA BEAN_J2EE的异步消息机制 EJB与JAVA BEAN的区别 Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个 ...

  9. Android异步消息机制

    2019独角兽企业重金招聘Python工程师标准>>> 目录介绍 1.Handler的常见的使用方式 2.如何在子线程中定义Handler 3.主线程如何自动调用Looper.pre ...

最新文章

  1. Redis源码解析——字典基本操作
  2. 抄代码的时候总是遇到原始数据应该长什么样的问题??
  3. 星光不问赶路人——任正非
  4. it程序员刷题 面试 中文网站收集
  5. 小程序加载本地图片路径问题
  6. ZeroMQ接口函数之 :zmq_msg_init_data - 从一个指定的存储空间中初始化一个ZMQ消息对象的数据...
  7. JSON处理1.1:100DaysOfJavaEE8
  8. swoole之代码热更新实现
  9. CV Code | 本周新出计算机视觉开源代码汇总(南理SGE 和Intel的实时动作识别很吸引人)...
  10. 通过debug过程分析Struts2什么时候将Action对象放入了值栈ValueStack中
  11. VUE3-Cesium(加载GeoJSON、KML、KMZ数据)
  12. 【转载】一文读懂MCMC算法原理
  13. 微信小程序图片上传并预览
  14. 项目集与项目群、项目组合的区别
  15. 说说用笔记本电脑的惨痛经历
  16. DedeCMS 栏目三级联动树形菜单的代码
  17. 关于8杯酒只有一杯酒有毒,每个人是否中毒只能化验一次,至少需要几个人辨识。...
  18. 【前端词典】分享 8 个有趣且实用的 API
  19. 2021年11月15日到2021年11月21日笔记
  20. 成功解决TypeError: Value passed to parameter 'paddings' has DataType float32 not in list of allowed valu

热门文章

  1. python程序如何循环_在Python的一段程序中如何使用多次事件循环详解
  2. 神经网络与机器学习 笔记—多层感知器(MLP)
  3. UVA10047独轮车
  4. 【数字信号处理】周期序列 ( 正弦序列特性 | 单个模拟周期采集 m 个数字样本 | Q 个模拟周期采集 P 个数字样本 | 非周期序列的情况 | 数字信号周期 )
  5. 【C 语言】文件操作 ( 配置文件读写 | 读取配置文件 | 函数接口形参 | 读取配置文件的逐行遍历操作 | 读取一行文本 | 查找字符 | 删除字符串前后空格 )
  6. 【C 语言】二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )
  7. 【Flutter】StatefulWidget 组件 ( 底部导航栏组件 | BottomNavigationBar 组件 | BottomNavigationBarItem 组件 | 选项卡切换 )
  8. 【计算理论】计算理论总结 ( 上下文无关文法 CFG 转为下推自动机 PDA 示例 2 ) ★★
  9. MySql中常用的内置函数
  10. Yuan先生的博客网址