zoukankan      html  css  js  c++  java
  • (转)再说ActionMessages类及其用法

    转自:http://ahang8415.blog.163.com/blog/static/525291232008512111133947/ 

    再说ActionMessages类及其用法

    在ActionMessages中包含着一个HashMap,其中的key就是add方法的property参数,然而他的值对应的是一个ActionMessageItem,ActionMessageItem是该类的一个内部类,当中包含了一个ArrayList
    由此可见,一个property中可以包含着多个ActionMessage,这些ActionMessage都将保存在ActionMessageItem的ArrayList中

     1 public void  add(String property, ActionMessage message) {
     2  
     3         ActionMessageItem item =  (ActionMessageItem) messages.get(property);
     4         List list = null ;
     5  
     6         if (item == null ) {
     7             list = new  ArrayList();
     8             item = new ActionMessageItem(list, iCount++ , property);
     9  
    10              messages.put(property, item);
    11         } else  {
    12             list =  item.getList();
    13          }
    14  
    15          list.add(message);
    16  
    17     }



    每次添加新的ActionMessage中,ActionMessages类会判断HashMap中的get(property)是否存在,如果存在的话,就获得该list = item.getList();并把ActionMessage添加到其中如果不存在,就会创建一个新的list = new  ArrayList();
    再将内容添加到当中去总的来说,ActionMessages就是一个保存信息的容器通常ActionMessages是不会单独使用的,和他相关的一些Struts组件会对其进行访问和操作:

    <html:errors>标签

    <html:errors>标签是一个Struts组件,他的内部标签类对ActionMessages类的子类ActionErrors进行访问通过在request和session中找到ActionErrors来获得相关信息在此之前,先来了解下<html:errors>标签的几个重要属性:

    name属性:
    指定ActionMessages在request和session范围内的属性key.默认值为Globals.ERROR_KEY由此我们可以了解到Struts是如此保存和获取ActionMessages的:

    保存:
    ActionErrors errors = new ActionErrors();

    request.setAttribute(Globals.ERROR_KEY ,errors);或者

    session.setAttribute(Globals.ERROR_KEY ,errors);

    获取:
    ActionErrors errors = new ActionErrors();

    errors = (ActionErrors)request.getAttribute(Globals.ERROR_KEY);或者

    errors = (ActionErrors)session.getAttribute(Globals.ERROR_KEY);或者

    该属性通常我们不用设置和更改他,用默认值就可以啦

    property属性:
    用来指定消息的属性,如果不设置该属性,那么<html:errors>标签将显示ActionMessages中的所有属性如果设置了该属性,则只显示HashMap中Key为property属性值的ArrayList集合通常,我们在调用ActionMessages的add方法时,会指定add方法的property参数,也就是第一个参数,将相关信息添加到指定的property对应的ArrayList中那么我们要显示相关信息时,就可以指定输出<html:errors>标签的property属性对应的ArrayList,这两个property是相互对应的

    bundle属性:
    指定资源文件的key属性缺省的情况下调用的是默认的资源文件Application.properties
    如在struts-config.xml中声明的资源文件信息如下:

      < message - resources parameter = " com.kook.struts.ApplicationResources "   /> 
       
    < message - resources key = " ch "  parameter = " com.kook.struts.ApplicationResources_ch "   /> 
       
    < message - resources key = " en "  parameter = " com.kook.struts.ApplicationResources_en "   />

    对应的add方法如下:

    1 ActionErrors errors = new  ActionErrors();
    2 if(name==null || name.length()<1 )
    3  {
    4       errors.add("name",new ActionMessage("kong" ));
    5   }
    6  return errors;

    new  ActionMessage( " kong " )对应在key="en"的资源文件中为:

    kong=bu neng wei kong

    JSP中的<html:errors>标签:

    1 <html:errors property="name" bundle="en"/>

    这时候将会输出key="en"的资源文件中的"kong"对应的信息:bu neng wei kong

    <html:messages>标签

    <html:messages>标签是用来在JSP页面上输出一条消息的通常我们在做添加数据的时候,如果添加成功,通常会在前台页面反馈给用户一条添加成功的信息,这时候我们就可以用到这个标签

    name属性:

    是指ActionMessages对象保存在request或session中的属性key,即request.setAttribute("heihei", messages);中的第一个参数

    message属性:如果为true,表示是从request或session中取得key为Globals.MESSAGE_KEY的ActionMessages对象,此时该标签设置的name属性的无效的如果为false,表示从该标签的name属性来获得request或session的key值缺省值就为false

    id属性:这个属性就不说了,检索出ActionMessages集合中单个对象的标识,他和<logic:iterate>的id是同一个意思

    小实验:

    在action中的execute方法中添加如下代码:

    1 ActionMessages messages = new ActionMessages();
    2         
    messages.add(""new ActionMessage("haha",false));
    4         
    5 this.saveMessages(request, messages);        
    6 
    7 return new ActionForward("/form/hello.jsp");

    表示往ActionMessages对象中添加一条信息new ActionMessage("haha",false),并保存在request当中this.saveMessages(request, messages);  那么在这个方法中,他是如何保存ActionMessage对象的呢?下面是 saveMessages 方法的源代码: 

     1 protected void saveMessages(
     2         HttpServletRequest request,
     3         ActionMessages messages) {
     4 
     5         // Remove any messages attribute if none are required
     6         if ((messages == null|| messages.isEmpty()) {
     7             request.removeAttribute(Globals.MESSAGE_KEY);
     8             return;
     9         }
    10 
    11         // Save the messages we need
    12         request.setAttribute(Globals.MESSAGE_KEY, messages);
    13     }

    观察这段代码不难发现,他是将ActionMessages存放在key为Globals.MESSAGE_KEY当中的,因此我们在调用ActionMessages的add方法时,他的property参数(add方法的第一个参数)就没有必要让我们自己去手动指定了,因为不论你指定什么参数,只要调用了saveMessages方法(这是前提),他只会将信息保存在固定的常量key中
    这时前台的hello.jsp页面的显示代码为:

    1 <html:messages id="a" message="true">
    2     <bean:write name="a"/>
    3 </html:messages>

    上面代码设置了message属性,表示从Globals.MESSAGE_KEY中获取信息,前面也有提到,此时指定name属性是无效的

    那如果我想只显示我自己指定的信息怎么办呢?

    我们可以不使用saveMessages方法而使用最原始的办法,通常最原始的办法也是最有效的,Struts其实是封装了许多最原始的实现我们先将action中的代码改为:

    ActionMessages messages  =   new  ActionMessages();
            
    messages.add(
     ""  new  ActionMessage( " haha " , false ));
            
    request.setAttribute(
     " show " , messages);

    return   new  ActionForward( " /form/hello.jsp " );

    然后在JSP页面中指定name属性,而将message设为false就可以了:

    1 <html:messages id="a" name="show">
    2     <bean:write name="a"/>
    3 </html:messages>

    这里是直接省略了message属性,因为他的缺省值就是false这样就可以达到输出自己指定属性的信息啦!

  • 相关阅读:
    Using sudo inside a docker container
    python enumerate用法总结
    如何保存Keras模型
    python pickle模块
    如何选择开源项目的license
    github在线创建文件夹
    关于python3.4版本中的zip函数
    使用sqoop 在关系型数据库和Hadoop之间实现数据的抽取
    HBase Shell 常见操作
    Java API 实现HBase的数据添加与过滤查询
  • 原文地址:https://www.cnblogs.com/mabaishui/p/2152920.html
Copyright © 2011-2022 走看看