Как я могу передать объект тегу JSP?

У меня есть страница JSP, содержащая скрипт, в котором я создаю экземпляр объекта. Я хотел бы передать этот объект тегу JSP без использования кеша.

Например, я хотел бы выполнить следующее:

<%@ taglib prefix="wf" uri="JspCustomTag" %>

<% 
 Object myObject = new Object();
%>

<wf:my-tag obj=myObject />

Я пытаюсь избежать прямого взаимодействия с любым из кешей (страница, сеанс, контекст сервлета), я бы предпочел, чтобы мой тег обрабатывал это.


person Joe Bienkowski    schedule 16.09.2008    source источник
comment
Обратите внимание: я не хочу, чтобы мой объект преобразовывался в строку и передавался как строка, я хочу, чтобы мой обработчик тегов действительно имел доступ к объекту.   -  person Joe Bienkowski    schedule 18.09.2008
comment
Вы заботитесь, чтобы выбрать правильный ответ?   -  person Rubens Mariuzzo    schedule 28.08.2012
comment
@RubensMariuzzo Все они плохие.   -  person peterh    schedule 09.12.2014
comment
@peterh, ну не все они настолько плохи.   -  person Priidu Neemre    schedule 26.09.2015


Ответы (6)


Немного другой вопрос, который я искал здесь: «Как вы передаете объект в файл тегов?»

Ответ: Используйте атрибут type директивы attribute:

<%@ attribute name="field" 
              required="true"
              type="com.mycompany.MyClass" %>

Тип по умолчанию java.lang.String , поэтому без него вы получите сообщение об ошибке, если попытаетесь получить доступ к полям объекта, говоря, что он не может найти поле из типа String.

person dfrankow    schedule 04.08.2009
comment
Не в этом был вопрос, -1. - person peterh; 09.12.2014

<jsp:useBean id="myObject" class="java.lang.Object" scope="page" />
<wf:my-tag obj="${myObject}" />

Не рекомендуется использовать скриптлеты на странице JSP. Это убивает цель языка шаблонов.

person Adeel Ansari    schedule 10.12.2008
comment
Во-первых, постраничная область видимости — это очень плохо. Второй: он сначала сериализует myObject, а затем десериализует. Это решение намного хуже, чем простой скриптлет. - person peterh; 09.12.2014
comment
1. Что не так с bean-компонентами с областью видимости page? 2. Здесь нет сериализации. Почему вы так думаете? - person Steve C; 10.12.2014
comment
Наконец я понял, что у тебя есть право, поэтому у тебя есть награда. - person peterh; 12.12.2014

Исходный синтаксис заключался в повторном использовании '‹%= %>'.

So

<wf:my-tag obj="<%= myObject %>" />

Пример см. в этой части руководства по библиотеке тегов Sun.

person Garth Gilmour    schedule 16.09.2008
comment
Ссылка не работает. См. версию веб-архива здесь. - person βξhrαng; 05.03.2014
comment
Сначала он сериализует myObject, а затем десериализует. Очень плохое решение. - person peterh; 09.12.2014
comment
Была аналогичная проблема, решил. Не возникло проблем с сериализацией и десериализацией, поскольку она прозрачна - не нужно было ничего делать с обработчиком тегов. - person Rafael Santos; 16.08.2018

Для меня язык выражений работает только в том случае, если я делаю эту переменную доступной, помещая ее, например, в контекст страницы.

<%  Object myObject = new Object();
    pageContext.setAttribute("myObject", myObject);
%>
<wf:my-tag obj="${myObject}" />

В противном случае tas получает null.

И <wf:my-tag obj="<%= myObject %>" /> работает без дополнительных усилий. Также ‹%=%> дает проверку типа jsp во время компиляции, в то время как El проверяется только во время выполнения.

person Pavel Feldman    schedule 16.09.2008
comment
Сначала он сериализует myObject, а затем десериализует. Очень плохое решение. - person peterh; 09.12.2014

Вы можете использовать «‹%= %>», чтобы получить значение объекта непосредственно в вашем теге:

    <wf:my-tag obj="<%= myObject %>"/>

и чтобы получить значение любой переменной внутри этого объекта, вы можете получить это, используя «obj.parameter», например:

<wf:my-tag obj="<%= myObject.variableName %>"/>
person Mike Clark    schedule 10.12.2014

Используйте язык выражений:

    <wf:my-tag obj="${myObject}" />
person Brian Matthews    schedule 16.09.2008
comment
Нам нужно добавить это в каком-то контексте, прежде чем использовать его. - person Adeel Ansari; 10.12.2008
comment
Сначала он сериализует myObject, а затем десериализует. Очень плохое решение. - person peterh; 09.12.2014