在我的struts2应用程序中,我有JSP页面,其中显示了书籍列表。每本书都有一个id和名字。另外,我想在任何书籍旁边放置一个“编辑”链接,可以由当前用户编辑。此“编辑”链接应调用相应的操作,将book id作为参数传递给它。所以我使用代码实现了这个页面:
<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>
图书ID不是基本类型,我使用自定义类。所以我决定实现自己的转换器。
问题就出现了:在上面的代码中,转换器仅在评估标记<s:property value="id"/>
时使用,但不用于评估<s:param name="bookId" value="id"/>
。而是使用了书籍id类的toString()
方法。为什么<s:param>
不使用我的转换器?我如何强迫它这样做?或者也许还有另一种方法可以将book id作为参数传递给链接?
要配置转换器,我将xwork-conversion.properties
放在/src/main/resources/
文件夹中,其中包含以下内容:
my.app.Id = my.app.struts.IdConverter
my.app.Id
是一个抽象类,由book 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。
答案 0 :(得分:1)
<s:param>
标记用于“简单”参数。在这种情况下,您可以使用<s:property>
设置临时值,如果这样做了您期望的转化。
它使用了图书ID的toString
,因为这是getId()
在呈现时会打印出来的内容,就像您执行System.out.println(book.getId())
一样。
答案 1 :(得分:0)
发现相应的问题解释问题: http://jira.opensymphony.com/browse/WW-808
简而言之,指定<param value="myValue"/>
和指定<param><property value="myValue"/></param>
之间存在差异。转换仅在第二种情况下使用。