Jsp: param с классом Java

У меня есть JSP файл, содержащий другой JSP файл. Первый JSP должен передать экземпляр класса Java (виджет) во второй файл JSP.

Это то, что у меня есть:

Первый JSP:

<jsp:include page="/container/SpecialWidget.jsp">
     <jsp:param name="widget" value="${widget}"/> // widget is a .Java POJO
</jsp:include>

Второй JSP:

${param.widget.id}

Проблема в том, что этот код дает ошибку (он говорит, что не знает ID). Если я опускаю часть ".id", страница печатает код Java для класса Java, что означает, что класс был передан правильно. Если я изменю правило ${widget} первой страницы, например, ${widget.id}, и я попытаюсь напечатать ${param.widget}, все будет хорошо.

Мой вопрос: Почему я не могу передать класс Java и напрямую обращаться к его атрибутам? Что я делаю неправильно?

Изменить: сообщение об ошибке: вызвано: javax.el.PropertyNotFoundException: Свойство 'id' не найдено по типу java.lang.String

Ответ 1

Когда вы передаете переменную ${widget}, она переводится во время запроса в строку (widget.toString()). Это значение затем передается во второй JSP как String, а не как исходный java-объект.

Одним из подходов к доступу к значениям объектов является установка значения параметра со значением атрибута:

<jsp:param name="widgetId" value="${widget.id}"/>

Затем используйте следующий код на втором JSP:

${param.widgetId}

Вы также можете установить виджет как запрос атрибут и использовать его на второй странице как ${widget.id} или ${request.widget.id}. Я предлагаю вам использовать второй подход.

Ответ 2

Мне удалось исправить мою проблему с помощью следующего кода:

<c:set var="widget" value="${widget}" scope="request" />
<jsp:include page="/SOMEWHERE/SpecialWidget.jsp"/>

Спасибо вам за вашу помощь:) Это спасло мой день

Ответ 3

<jsp:param> передает параметр как параметр HTTP-запроса, который может быть только строкой. Поэтому toString() вызывается на ваш виджет, и результат этого метода передается как параметр.

Вы должны использовать JSP-тег, реализованный как файл тега, вместо использования JSP. См. http://docs.oracle.com/javaee/1.4/tutorial/doc/JSPTags5.html для определения их использования.

Например:

Определение тегов в /WEB -INF/tags/specialWidget.tag:

<%@ tag %>
<%@ attribute name="widget" required="true" type="the.fully.qualified.name.of.WidgetClass" %>
TODO: add the HTML markup that must be displayed, using ${widget} to access the passed in widget attribute

Использование тегов в любом JSP:

<%@ taglib prefix="myTags" tagdir="/WEB-INF/tags" %>
...
Tada! I will use the specialWidget tag here, with widget as an attribute:
<myTags:specialWidget widget="${widget}"/>