Можно ли использовать request.setAttribute на странице JSP, а затем при отправке HTML получить тот же атрибут запроса в Servlet?
Использование request.setAttribute на странице JSP
Ответы (7)
Нет. К сожалению, объект Request доступен только до тех пор, пока страница не завершит загрузку — как только она будет завершена, вы потеряете все содержащиеся в ней значения, если только они не были где-то сохранены.
Если вы хотите сохранить атрибуты через запросы, вам необходимо:
- Добавьте в форму скрытый ввод, например
<input type="hidden" name="myhiddenvalue" value="<%= request.getParameter("value") %>" />. Затем это будет доступно в сервлете в качестве параметра запроса. - Поместите его в сеанс (см.
request.getSession()- в JSP это доступно как простоsession)
Я рекомендую использовать Session, так как им легче управлять.
Ответ Фила Сакра был правильным, однако сессию не следует использовать просто так. Вы должны использовать это только для значений, которые действительно должны существовать в течение всего времени существования сеанса, например, для входа пользователя. Обычно люди злоупотребляют сеансом и сталкиваются с новыми проблемами, особенно при работе с коллекцией или когда пользователи возвращаются на страницу, которую они ранее посещали, только для того, чтобы обнаружить, что у них остались значения, оставшиеся после предыдущего посещения. Умная программа максимально минимизирует область действия переменных, плохая слишком много использует сессию.
Однако вы можете сделать это, используя атрибуты 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.
Если вы хотите, чтобы ваши запросы сохранялись, попробуйте следующее:
пример: на вашей странице JSP или сервлета
request.getSession().setAttribute("SUBFAMILY", subFam);
и на любой принимающей странице используйте следующие строки для получения вашего сеанса и данных:
SubFamily subFam = (SubFamily)request.getSession().getAttribute("SUBFAMILY");
Пытаться
request.getSession().setAttribute("SUBFAMILY", subFam);
request.getSession().getAttribute("SUBFAMILY");
Поправьте меня, если я ошибаюсь... Я думаю, что запрос сохраняется между последовательными страницами..
Думайте, что вы переходите со страницы 1 -> страница 2 -> страница 3.
У вас есть некоторое значение, установленное в объекте запроса с помощью setAttribute со страницы 1, которое вы получаете на странице 2 с помощью getAttribute, затем, если вы попытаетесь снова установить что-то в том же объекте запроса, чтобы получить его на странице 3, тогда он не даст вам нулевое значение как " запрос, который создал JSP, и запрос, который генерируется при отправке JSP, являются совершенно разными запросами, и любые атрибуты, помещенные в первый, не будут доступны во втором".
Я имею в виду, что что-то вроде этого на странице 2 не работает:
Где то же самое сработало в случае страницы 1, например:
Поэтому я думаю, что мне нужно будет использовать любой из двух вариантов, предложенных Филлом.
Я думаю, что Фил прав, опция запроса доступна до загрузки страницы. поэтому, если мы хотим отправить значение на другую страницу, мы хотим установить в скрытом теге или внутри сеанса, если вам просто нужно значение только на другой странице и не более того, тогда скрытые теги - лучший вариант, если вам нужно это значение на более чем одной странице в это время сеанс лучше, чем скрытые теги.