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           
3 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。这样就可以达到输出自己指定属性的信息啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值