2014-08-28 73 views
3

我使用struts 2.3.16和tiles 2.0.6。Struts2 Tiles將var設置爲tiles屬性作爲字符串

與空的屬性(其中包括)一個瓷磚的定義:

<put-attribute name="pageSidePanel" value="" /> 

一些其他的定義擴展它,他們可以選擇無論是在填入值:

<put-attribute name="pageSidePanel" value="/panels/greenPanel.jsp" /> 

拉倒也是空的。

我試着用struts「set」標籤和一些基本的if/else邏輯來測試這個屬性是否爲空。例如:

<s:set var="sidePanelName"><tiles:getAsString name='pageSidePanel'/></s:set> 
<s:if test='%{#sidePanelName.isEmpty()}'>TRUE</s:if><s:else>FALSE</s:else> 

結果不是我所期望的。我進行了11次邏輯測試,兩種變化:11次測試中使用的井號標籤,以及其他11個都沒有:

#sidePanelName vs sidePanelName 

我做了2個不同的JSP頁面,一個測試,實際上已經把一個價值在瓷磚和一個沒有。因此,在總共有44邏輯測試:使用#一個頁面,瓷磚屬性上

  1. 11個測試爲空
  2. 11個測試不使用#一個頁面,瓷磚屬性上是使用空
  3. 11個測試#一個頁面,瓷磚屬性上填充了值
  4. 11個測試不使用#一個頁面,瓦片上的屬性與價值

填寫ONLY情況3是正確的。所有其他情況都給出了錯誤的結果。例如,在情況1中,如果我測試#var == null我會得到錯誤,但如果我測試var == null(沒有標籤)i變爲true。所以我需要清理兩件事:

  1. 使用#或不使用的效果是什麼?
  2. tiles屬性是否具有值的作用是什麼,struts var將它視爲null還是作爲空字符串,還是取決於我是否使用了#或不是?

僅供參考,這裏有所有的測試:

<s:set var="sidePanelName"><tiles:getAsString name='pageSidePanel'/></s:set> 

<s:if test='#sidePanelName != ""'>TRUE</s:if><s:else>FALSE</s:else> 
<s:if test="#sidePanelName != ''">TRUE</s:if><s:else>FALSE</s:else> 
<s:if test='#sidePanelName == ""'>TRUE</s:if><s:else>FALSE</s:else> 
<s:if test="#sidePanelName == ''">TRUE</s:if><s:else>FALSE</s:else> 
<s:if test='%{!#sidePanelName.isEmpty()}'>TRUE</s:if><s:else>FALSE</s:else> 
<s:if test='%{#sidePanelName.length() > 0}'>TRUE</s:if><s:else>FALSE</s:else> 
<s:if test='%{#sidePanelName.length() == 0}'>TRUE</s:if><s:else>FALSE</s:else> 
<s:if test='%{#sidePanelName.equals("")}'>TRUE</s:if><s:else>FALSE</s:else> 
<s:if test='%{#sidePanelName.equalsIgnoreCase("")}'>TRUE</s:if><s:else>FALSE</s:else> 
<s:if test='#sidePanelName == null'>TRUE</s:if><s:else>FALSE</s:else> 
<s:if test='#sidePanelName != null'>TRUE</s:if><s:else>FALSE</s:else> 

<s:if test='sidePanelName != ""'>TRUE</s:if><s:else>FALSE</s:else> 
<s:if test="sidePanelName != ''">TRUE</s:if><s:else>FALSE</s:else> 
<s:if test='sidePanelName == ""'>TRUE</s:if><s:else>FALSE</s:else> 
<s:if test="sidePanelName == ''">TRUE</s:if><s:else>FALSE</s:else> 
<s:if test='%{!sidePanelName.isEmpty()}'>TRUE</s:if><s:else>FALSE</s:else> 
<s:if test='%{sidePanelName.length() > 0}'>TRUE</s:if><s:else>FALSE</s:else> 
<s:if test='%{sidePanelName.length() == 0}'>TRUE</s:if><s:else>FALSE</s:else> 
<s:if test='%{sidePanelName.equals("")}'>TRUE</s:if><s:else>FALSE</s:else> 
<s:if test='%{sidePanelName.equalsIgnoreCase("")}'>TRUE</s:if><s:else>FALSE</s:else> 
<s:if test='sidePanelName == null'>TRUE</s:if><s:else>FALSE</s:else> 
<s:if test='sidePanelName != null'>TRUE</s:if><s:else>FALSE</s:else> 
+0

您應該使用's:property'標籤輸出'tiles:getAsString'的值。 – 2014-08-28 17:08:42

回答

4

<tiles:getAsString>標籤將返回空字符串,如果你的避風港」在tile定義中定義它的值。所以你的代碼

<s:set var="sidePanelName"><tiles:getAsString name='pageSidePanel'/></s:set> 

將只是一個空的<s:set>標籤相同。

<s:set var="sidePanelName"></s:set> 

和空<s:set>標籤W/O value屬性將top分配給一個變量(在大多數情況下,這將是目前的操作實例)。

嘗試使用<s:property value="#sidePanelName"/>打印其值。您可能會看到類似[email protected]的內容。

+0

如果未找到指定值,則''拋出'JSPException'。 – 2014-08-28 16:25:54

+0

我的意思是在這種情況下它不會返回空字符串。 – 2014-08-28 16:29:02

+0

@羅曼C:是的,如果沒有定義的話。但OP說,有定義但有空值。 – 2014-08-28 16:29:10

1

不能調用null對象的方法...

然後

  • isEmpty()length()是uncallable,因爲在對象本身上調用,而
  • equals()equalsIgnoreCase()進行比較,如果在已知對象上調用它們,則不會生成NPE,如"".equalsIgnoreCase(#sidePanelName)

順便說一句,如果對象爲空,也"".equalsIgnoreCase(#sidePanelName)會給出錯誤的,因爲它不是等於一個空字符串,它只是空...


PS:注意你的說明,誤導:

我有一個磚屬性是字符串類型不

[...]

結果是正確的,只要字符串不是空/填充/至少有一個character-

+0

我清理了問題並添加了更多詳細信息/結果。你能否用這些新信息澄清你的答案?特別是問題:如果tiles屬性爲空,struts變量爲null? – user1884155 2014-08-28 15:25:50

+0

請閱讀[本](http://stackoverflow.com/a/20467947/1654265),特別是與其相關的答案,以避免22測試:) – 2014-08-28 16:01:56

+1

謝謝,這是我的必要文獻! – user1884155 2014-08-28 20:20:39