struts2: тег param не использует преобразование - PullRequest
0 голосов
/ 29 ноября 2011

Проблема

В моем приложении 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.

Ответы [ 2 ]

1 голос
/ 29 ноября 2011

Тег <s:param> предназначен для «простых» параметров. В этом случае вы можете просто установить временное значение, используя <s:property>, если это соответствует ожидаемой вами конвертации.

Используется toString идентификатора книги, потому что это то, что getId() распечатает при визуализации, как если бы вы сделали System.out.println(book.getId()).

0 голосов
/ 26 декабря 2011

Найдена соответствующая проблема с объяснением проблемы: http://jira.opensymphony.com/browse/WW-808

В нескольких словах разница между указанием <param value="myValue"/> и указанием <param><property value="myValue"/></param>Преобразование используется только во втором случае.

...