【转】深入探讨struts的ActionMessages消息机制

 

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

    ActionMessages以一个HashMap存储ActionMessage.Map中的key是一个标识,其对应的value是一个List对象,所有的ActionMessage存储在List.也就是说key标识了一组ActionMessage.

    先介绍涉及到的类中的几个常用方法,然后给出几个示例代码,帮助理解.

·                                 ActionMessage 

o                                                        ActionMessage(String key)
该方法接受一个字符串,字符串是在资源文件种配置的key,必须在配置文件中进行相关配置.

o                                                        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所对应的信息中需要的参数

o                                                        ActionMessage(String key,Object[] values)
这种方法第一个参数同上,第二个参数接受一个Object数组,其中保存key在资源文件中对应信息需要的参数.

·                                 ActionMessages

o                                                        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对象中.

o                                                        ActionMessages.add(ActionMessages ams)
该方法将参数中保存的ActionMessage合并到调用ActionMessages.

·                                 Action及其所有子类

o                                                        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")

o                                                        saveMessages(HttpServletRequest request,ActionMessages messages)
该方法保存messages,如果request中已经有一个ActionMessages对象,则用新的覆盖原有的.不推荐使用该方法,该方法容易发生丢失信息的情况.

o                                                        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_KEYActionMessages bean.当该属性设置为true,request中查找key=Globals.MESSAGE_KEYActionMessages 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>

        strutsActionMessages的讨论就到这里,希望这篇文章能对广大刚接触struts的朋友们有所帮助

本文出自立子博客,请务必保留此出处http://leaze.blog.51cto.com/83088/51750

 

 

Struts中我们用html:errors标签在JSP页面上输出验证过程中产生的错误信息,错误信息一般来自于消息资源文件(xxxproperties文件,一般位于classes目录下,文本文件),当然错误信息也可以是不是资源文件中的文本消息,而是自定义的文本。接下来将详细讲述。

  先来看一个简单例子

1、资源文件错误信息来源(其格式为 key = value )
   
 
  
 error.test = this is a test error.

2JSP页面中用于显示错误信息标签
  
 
   <html:errors
 property="testerror"/>

3ActionFormBeanvalidate()方法中产生错误信息

   ActionErrors error = new ActionErrors();

   error.add("testerror",new ActionMessage("error.test"))
  
 
   return error;

 

  这个例子的功能就是在ActionForm Beanvalidate()方法中产生一条名为:testerror的错误信息,错误信息息是资源文件中keyerror.test的值。然后在页面上用html:errors标签输出testerror这条错误信息。

  这是最常用的一种功能,所有的错误信息都在资源文件里面。

  有人会问,错误信息只能存放在资源文件中吗,其实不是这样。不需要资源文件也可以产生错误信息

  我们再来看一下ActionMessage的另一种构造方法:

  ActionMessage(String key,boolean isresource)

  如果isresource值为true,则表示key是资源文件中的key,产生的消息就是与key相对应的消息
  如果isresource值为false,则表示key为一条普通的消息。

  如果上面的error.add改为error.add("testerror",new ActonMessage("这是一条自定义消息",false",));那么页面上显示的将是:这是一条自定义消息.


  另外还可以用ActionMessage产生复合消息,比如我们要输出:xxx不能用作用户名,其中xxx是一个变量。

  首先我们在资源文件中加一个条复合消息

  testmsg = {0}不能用作用户名。这里{0}是要被替换的参数。

  我们再来看一下ActionMessage的另一中构造方法
  ActionMessage(String key,Object value0);

  也就是说用value0的值来替换{0}

  我们修改error.adderror.add("testerror",new ActonMessage("testmsg","毛泽东"))

  那么JSP页面上将显示:毛泽东不能用作用户名。


  当然在一条复合消息中也可带多个参数,参数依次为{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>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值