logic:messagesPresent标签的典型用法:
<logic:messagesPresent>
<ul>
<html:messages id="message">
<li><bean:write name="message"/></li>
</html:messages>
</ul>
</logic:messagesPresent>
logic:messagesPresent标签用于以下情况:
在request作用域中存在一个ActionMessages对象,标签的property属性和ActionMessages中的property对应。 在request作用域中存在一个ActionErrors对象,标签的property属性和ActionErrors中的property对应。 存在一个String对象,将其转换(构造)成ActionMessage然后在添加到ActionMessages中。
存在一个String Array对象,将数组中的每一个String转换成一个ActionMessage,在将其添加到ActionMessages中。 标签的message属性值为true时将以Globals.MESSAGE_KEY为key在request作用域中查找Message,其它情况下,将name的值作为key查找,如果name 没有出现,默认值为Globals.ERROR_KEY
html:message 可以让你向用户显示错误信息(默认)或消息信息,而html:errors 只显示错误信息。很明显,错误信息或消息信息一定要保存在request里,否则就什么也不会显示。
Ref:
[1]http://struts.apache.org/1.x/struts-taglib/tlddoc/index.html
[2]http://www.diybl.com/course/3_program/java/javajs/2008711/132741.html
<logic:messagesPresent property="property1" message="true"> Message:property1 存在 </logic:messagesPresent>
我们知道,在Action类中我们可以通过将一个ActionErrors或ActionMessages对象添加进request scope
saveMessages(request, msgs);
用Globals.MESSAGE_KEY(值为”org.apache.struts.action.MESSAGE”)作为键。
saveErrors(request, msgs);
用Globals.ERROR_KEY(值为”org.apache.struts.action.ERROR”)作为键。
<logic:messagesPresent/> 标签就是用来检测在request scope内,有没有以名为Globals.MESSAGE_KEY或Globals.ERROR_KEY的Errors/Messages对象。
该标签的message属性,指定检测在那里进行。(Globals.ERROR_KEY
缺省
或
Globals.MESSAGE_KEY
设为
true
)
如:<logic:messagesPresent property="property1">
就是检测在request scope中有没有一个名为:”org.apache.struts.action.ERROR” 也就是Globals.ERROR_KEY的值,的对象,而在该对象中,有没有一个名为”property1”的属性。
如:<logic:messagesPresent property="property1" message="true">
就是检测在request scope中有没有一个名为:”org.apache.struts.action.Message” 也就是Globals.MESSAGE_KEY的值,的对象,而在该对象中,有没有一个名为”property1”的属性。
其实我们在后台通过 saveErrors(request, msgs); 就相当于
request.setAttribute(Globals.ERROR_KEY, msgs);
之所以用saveErrors方法,就是简化操作,让我们不用为这个对象命名,使用default的名字,从而前台logic:messagesPresent标签中也不用指定name属性,因为在属性message不是true的情况下,该标签默认认为,我们就是来检测名为 Globals.ERROR_KEY的对象。
所以,如果我们在后台 request.setAttribute("MyErrors", msgs);
而前台 <logic:messagesPresent name="MyErrors" property="property1">
指定属性name,是一样可以进行判断的。
而当message属性为true的时候,标签就会忽略name属性,只检测名为 Globals.MESSAGE_KEY的对象。这种情况我们就只能以这个default的名字来命名存储在request scope中的对象。
可为什么我们一定要用struts默认的名字(Globals.ERROR_KEY/Globals.MESSAGE_KEY)呢?因为我们只检测是否存在是不够的。对于messages或者errors我们更重要的是来显示它的信息(丛rescources里面获取)一般用<html:messages/>或者<html:errors/>。而这两个标签,默认都是得到名为Globals.ERROR_KEY或Globals.MESSAGE_KEY的对象。当然我们通过指定name属性,也可以得到我们自定义的名字。但问题是它将无法从我们自定义名字的对象中获得属性,也就是说你不能指定property,因为你自定义的名字无法映射到它所包含的对象中的属性(也就是没有getter()方法)。而如果用default的命名方式(Globals.ERROR_KEY或Globals.MESSAGE_KEY) ,struts就会建立这种对象与属性之间的映射。