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就會建立這種對象與屬性之間的映射。