Проблема
В моем приложении struts2 у меня есть страница JSP, где отображается список книг.У каждой книги есть идентификатор и название.Также я хочу разместить ссылку «редактировать» рядом с любой книгой, которую может редактировать текущий пользователь.Эта ссылка «редактировать» должна вызывать соответствующее действие, передавая идентификатор книги в качестве параметра.Поэтому я реализовал эту страницу с помощью кода:
<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>
Идентификатор книги не является базовым типом, для него я использую собственный класс.Поэтому я решил реализовать свой собственный конвертер.И тут возникает проблема: в приведенном выше коде конвертер используется только при оценке тега <s:property value="id"/>
, но не используется для оценки <s:param name="bookId" value="id"/>
.Вместо этого используется toString()
метод класса идентификатора книги.Почему <s:param>
не использует мой конвертер?Как я могу заставить это сделать?Или, может быть, есть другой способ передать идентификатор книги в качестве параметра в ссылке?
Некоторые (возможно, бесполезные) сведения
Для настройки конвертера я поместил xwork-conversion.properties
в мою папку /src/main/resources/
со следующейсодержание:
my.app.Id = my.app.struts.IdConverter
my.app.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
) для идентификатора со значением int, равным 8.