問題
在我的struts2應用程序中,我有一個顯示書籍列表的JSP頁面。每本書都有一個id和名字。另外我想在任何一本書上放置一個「編輯」鏈接,可以由當前用戶編輯。這個「編輯」鏈接應該調用相應的操作,並將book id作爲參數傳遞給它。因此,我使用以下代碼實現了此頁:struts2:param標記不使用轉換
<table>
<s:iterator value="books" status="stat">
<tr>
<td><s:property value="id"/></td>
<td><s:property value="name"/></td>
<td>
<s:if test="canEdit[#stat.index]">
<s:a action="editBook">edit
<s:param name="bookId" value="id"/>
</s:a>
</s:if>
</td>
</tr>
</s:iterator>
</table>
Book id不是基本類型,我使用它的自定義類。所以我決定實現我自己的轉換器。 問題在於:在上面的代碼中,轉換器僅在評估標籤<s:property value="id"/>
時使用,但不用於評估<s:param name="bookId" value="id"/>
。而是使用toString()
書籍ID類的方法。爲什麼<s:param>
不使用我的轉換器?我如何強迫它這樣做?或者,也許有另一種方式來傳遞書籍ID作爲參數鏈接?
一些(可能沒用)詳情
要配置轉換器,我把我的xwork-conversion.properties
文件夾/src/main/resources/
裏面包含以下內容:
my.app.Id = my.app.struts.IdConverter
my.app.Id
是由書ID類擴展一個抽象類。
的JSP用於單條目列表的繪製的結果如下:
<table>
<tr>
<td>8</td>
<td>Book 01</td>
<td><a href="/web/editBook.action?bookId=id%288%29">edit</a></td>
</tr>
</table>
id%288%29
是串id(8)
的逸出版本是toString()
方法的結果(在抽象基類my.app.Id
定義)爲id,int值爲8.
+1 Dave'像往常一樣簡潔和完整的答案:) –
謝謝,戴夫。但我仍然不明白這一點。 'param'和'property'都用於將Object轉換爲String(param api docs明確指出了這一點)。這種轉換的邏輯應該由我通過轉換器來控制。所以我認爲至少這並不明顯,param標籤是用於「簡單」參數的。我在這裏錯過了什麼? –
經過對'org.apache.struts2.components.Property'和'org.apache.struts2.components.Param'的一些調試後,我發現他們之間的區別在於第一個使用'findValue(String,Class, boolean)'ValueStack,而第二個使用基本Component的'findValue(String)',它最終將我們帶到ValueStack的'findValue(String,boolean)'中。 Class toClass參數(在屬性標籤中等於String.class)會導致忽略轉換器。所以看起來,忽略/使用轉換器是嵌入在框架中的一項功能。更混亂。 –