信息标签 <html:messages />
Displays a set of messages prepared by a business logic component and stored as an ActionMessages object, ActionErrors object, a String, or a String array in any scope. If such a bean is not found, nothing will be rendered. The messages are placed into the page scope in the body of this tag where they can be displayed by standard JSP methods. (eg: <bean:write>,<c:out>,<%=%>)
以上是struts API doc对<html:messages/>标签的表述。这里有几点需要注意:
首先,这些可供显示的对象,必须是由business logic component准备的。意思就是说是由我们程序添加进去的,而不是说会自动添加对象并寻找项目资源文件下的所有信息。
比如在Action类中:
request.setAttribute(Globals.ERROR_KEY, msgObj);
我们将对象保存进request scope.
<html:messages id="message" message="true" property="property2">
再次,该标签的属性 message
表示从所有scope中寻找名为什么的对象。true表示寻找名为 Globals.MESSAGE_KEY的对象,而不设该属性(默认情况下),它将寻找名为Globals.ERROR_KEY的对象。
Id属性声明了一个page scope可用的对象,来表示信息集合中的message。
property属性则表示只取到ActionMessages集合中名为”property2”的对象,如果不设置,表示取到所有对象。然后可以通过<bean:write>,<c:out>,<%=%>等形式对id的声明代表的对象进行输出。
<html:messages id="message" message="true">
<bean:write name="message"/>
</html:messages>
也就是说我们如果在Action类中 不将这个ActionMessages对象,以 Globals.ERROR_KEY或Globals.MESSAGE_KEY所代表的string存进某一个scope,<html:messages/>标签将不能获取到。
在Action类中:
ActionMessages msgs = new ActionMessages();
msgs.add("property1",
new ActionMessage("userRegistration.password.nomatch"));
msgs.add("property2",
new ActionMessage("img.text","1","1","1","1"));
request.setAttribute(Globals.MESSAGE_KEY, msgs);
相当于 saveMessages(request, msgs);
或者
request.setAttribute(Globals.ERROR_KEY, msgs);
相当于this.saveErrors(request, msgs);
ActionMessages/ActionErrors 类 是一个可以存放一系列信息(ActionMessage类)对象的集合。它的 add(String arg0, ActionMessage arg1)方法,arg0是arg1: ActionMessage对象在该集合中的名字。
ActionMessage类可以用来保存MessageResources(项目信息资源文件)的内容。它的构造器 ActionMessage(String arg)中,arg是项目信息资源文件中的key名。它的第二个构造器 ActionMessage(String arg,String arg1)中,arg1是可以传递给项目信息资源文件的参数(占位符 place holder),这样的参数值多可以pass 四个。
当jsp页面从ActionMessages/ActionErrors 集合类中取得ActionMessage对象时,就可以从项目信息资源文件中获取到和key相对应的value,并加以显示。
<html:errors bundle="extended"/>
<html:errors/> 和 <html:messages/> 这两个标签作用都是从request scope里得到对象,只不过一个得到的是名为 Globals.ERROR_KEY 的对象,另一个是得到名为Globals.MESSAGE _KEY的对象(messages标签也可以取error对象)。
默认情况会将所有对象输出,当指定了property属性的时候,就只输出指定对象。
ActionMessages msgs = new ActionMessages();也可以写做
ActionErrors msgs = new ActionErrors()
saveMessages(request, msgs); 就是将对象存为名为Globals.MESSAGE_KEY
saveErrors(request, msgs); 就是将对象存为名为Globals.ERROR_KEY
这样 jsp页面就可以用errors或者messages标签进行显示。 Messages标签即可显示Globals.MESSAGE_KEY (通过指定message=”true”) 又可显示Globals.ERROR_KEY (default)。而errors标签只能显示用saveErrors方法保存的信息对象。其实error还是message都是一个意思,建议用message标签。
这两个标签,最终的目的,是把(错误)信息从资源文件里读出来。Msgs是一个集合对象,它里面包含的每个元素,呈 name – ojb 形式,而该obj又是一个ActionMessage或者ActionError类的对象,用于初始该对象的值又对应了资源文件里的key。所以messages和erorrs 标签的最终目的是通过key把resource bundle里的value读出来并加以显示。