2011-11-29 61 views
0

問題

在我的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

<s:param>標記用於「簡單」參數。在這種情況下,您可以使用<s:property>來設置一個臨時值,如果這樣做的話您所期望的轉換。

它使用書籍ID的toString,因爲這就是getId()在呈現時會打印出來,就像您做了System.out.println(book.getId())一樣。

+0

+1 Dave'像往常一樣簡潔和完整的答案:) –

+0

謝謝,戴夫。但我仍然不明白這一點。 'param'和'property'都用於將Object轉換爲String(param api docs明確指出了這一點)。這種轉換的邏輯應該由我通過轉換器來控制。所以我認爲至少這並不明顯,param標籤是用於「簡單」參數的。我在這裏錯過了什麼? –

+0

經過對'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)會導致忽略轉換器。所以看起來,忽略/使用轉換器是嵌入在框架中的一項功能。更混亂。 –

0

用的問題的解釋相應的實測值問題: http://jira.opensymphony.com/browse/WW-808

在幾個字的差是規定<param value="myValue"/>並指定<param><property value="myValue"/></param>之間。轉換僅在第二種情況下使用。