Использование request.setAttribute на странице JSP

Можно ли использовать request.setAttribute на странице JSP, а затем при отправке HTML получить тот же атрибут запроса в Servlet?


person ria    schedule 23.10.2008    source источник


Ответы (7)


Нет. К сожалению, объект Request доступен только до тех пор, пока страница не завершит загрузку — как только она будет завершена, вы потеряете все содержащиеся в ней значения, если только они не были где-то сохранены.

Если вы хотите сохранить атрибуты через запросы, вам необходимо:

  1. Добавьте в форму скрытый ввод, например <input type="hidden" name="myhiddenvalue" value="<%= request.getParameter("value") %>" />. Затем это будет доступно в сервлете в качестве параметра запроса.
  2. Поместите его в сеанс (см. request.getSession() - в JSP это доступно как просто session)

Я рекомендую использовать Session, так как им легче управлять.

person Community    schedule 23.10.2008
comment
Может быть, это и не печально. Скриптлеты JSP — плохая практика. Будьте осторожны при использовании сеанса, им проще управлять, но иногда это дорого с точки зрения масштабируемости. - person Guido; 23.10.2008
comment
ну, скажем так - сеанс, вероятно, лучше, чем все, что вы пишете сами :) Если вы находитесь на приличном сервере приложений, он может выполнять репликацию и т. д., и у вас есть варианты хранения (не только в памяти). - person ; 24.10.2008

Ответ Фила Сакра был правильным, однако сессию не следует использовать просто так. Вы должны использовать это только для значений, которые действительно должны существовать в течение всего времени существования сеанса, например, для входа пользователя. Обычно люди злоупотребляют сеансом и сталкиваются с новыми проблемами, особенно при работе с коллекцией или когда пользователи возвращаются на страницу, которую они ранее посещали, только для того, чтобы обнаружить, что у них остались значения, оставшиеся после предыдущего посещения. Умная программа максимально минимизирует область действия переменных, плохая слишком много использует сессию.

person user31475    schedule 25.10.2008

Однако вы можете сделать это, используя атрибуты pageContext:

В ЖСП:

<form action="Enter.do">
    <button type="SUBMIT" id="btnSubmit" name="btnSubmit">SUBMIT</button>
</form>
<% String s="opportunity";
pageContext.setAttribute("opp", s, PageContext.APPLICATION_SCOPE); %>

В сервлете (связанном с URL-шаблоном "Enter.do"):

String s=(String) request.getServletContext().getAttribute("opp");

Существуют и другие области помимо APPLICATION_SCOPE, такие как SESSION_SCOPE. APPLICATION_SCOPE используется для атрибутов ServletContext.

person Prasad    schedule 25.09.2014

Если вы хотите, чтобы ваши запросы сохранялись, попробуйте следующее:

пример: на вашей странице JSP или сервлета

request.getSession().setAttribute("SUBFAMILY", subFam);

и на любой принимающей странице используйте следующие строки для получения вашего сеанса и данных:

SubFamily subFam = (SubFamily)request.getSession().getAttribute("SUBFAMILY");
person connect2krish    schedule 13.03.2014

Пытаться

request.getSession().setAttribute("SUBFAMILY", subFam);
request.getSession().getAttribute("SUBFAMILY");
person Lino    schedule 07.04.2010

Поправьте меня, если я ошибаюсь... Я думаю, что запрос сохраняется между последовательными страницами..

Думайте, что вы переходите со страницы 1 -> страница 2 -> страница 3.

У вас есть некоторое значение, установленное в объекте запроса с помощью setAttribute со страницы 1, которое вы получаете на странице 2 с помощью getAttribute, затем, если вы попытаетесь снова установить что-то в том же объекте запроса, чтобы получить его на странице 3, тогда он не даст вам нулевое значение как " запрос, который создал JSP, и запрос, который генерируется при отправке JSP, являются совершенно разными запросами, и любые атрибуты, помещенные в первый, не будут доступны во втором".

Я имею в виду, что что-то вроде этого на странице 2 не работает:

Где то же самое сработало в случае страницы 1, например:

Поэтому я думаю, что мне нужно будет использовать любой из двух вариантов, предложенных Филлом.

person ria    schedule 24.10.2008

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

person Community    schedule 13.10.2009
comment
не вызовут ли скрытые теги проблемы с безопасностью, если что-то, что мы отправляем, является ценным. - person gagangaur; 14.08.2020