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

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

7 ответов

Решение

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

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

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

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

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

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

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

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

SubFamily subFam = (SubFamily)request.getSession().getAttribute("SUBFAMILY");

Вы можете сделать это, используя атрибуты pageContext, хотя:

В JSP:

<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.

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

Пытаться

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

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

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

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

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

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

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

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

Другие вопросы по тегам