Как передать скрытые параметры? Я хочу вызвать страницу (test.jsp), но также передать 2 скрытых параметра, таких как сообщение.
response.sendRedirect("/content/test.jsp");
Как передать скрытые параметры? Я хочу вызвать страницу (test.jsp), но также передать 2 скрытых параметра, таких как сообщение.
response.sendRedirect("/content/test.jsp");
Ответ TheNewIdiot успешно объясняет проблему и причину, по которой вы не можете отправлять атрибуты в запросе через перенаправление. Возможные решения:
Использование переадресации. Это позволит передать атрибуты запроса в представление, и вы сможете использовать их в форме ServletRequest#getAttribute
или с помощью языка выражений и < href="https://stackoverflow.com/tags/jstl/info">JSTL. Краткий пример (повторное использование кода ответа TheNewIdiot).
Контроллер (ваш сервлет)
request.setAttribute("message", "Hello world");
RequestDispatcher dispatcher = servletContext().getRequestDispatcher(url);
dispatcher.forward(request, response);
Просмотреть (ваш JSP)
Использование скриптлетов:
<%
out.println(request.getAttribute("message"));
%>
Это просто для информационных целей. Следует избегать использования скриптлетов: Как избежать кода Java в файлах JSP?. Ниже приведен пример использования EL и JSTL.
<c:out value="${message}" />
Если вы не можете использовать переадресацию (потому что вам это не нравится или вы этого не чувствуете, или потому что вы должны использовать перенаправление), тогда вариант будет сохранять сообщение как атрибут сеанса, а затем перенаправлять на ваше представление , восстановите атрибут сеанса в своем представлении и удалите его из сеанса. Помните, что ваш пользовательский сеанс всегда должен содержать только релевантные данные. Пример кода
Контроллер
//if request is not from HttpServletRequest, you should do a typecast before
HttpSession session = request.getSession(false);
//save message in session
session.setAttribute("helloWorld", "Hello world");
response.sendRedirect("/content/test.jsp");
Просмотреть
Опять же, демонстрируя это с помощью скриптлетов, а затем EL + JSTL:
<%
out.println(session.getAttribute("message"));
session.removeAttribute("message");
%>
<c:out value="${sessionScope.message}" />
<c:remove var="message" scope="session" />
Как правило, вы не можете отправить запрос POST, используя sendRedirect(). Вы можете использовать RequestDispatcher для forward() запросы с параметрами в том же веб-приложении, в том же контексте.
RequestDispatcher dispatcher = servletContext().getRequestDispatcher("test.jsp");
dispatcher.forward(request, response);
В спецификации HTTP указано, что все перенаправления должны быть в форме GET (или HEAD). Вы можете зашифровать параметры строки запроса, если безопасность является проблемой. Другой способ: вы можете отправить POST в цель, используя скрытую форму с методом POST и отправив ее с помощью javascript при загрузке страницы.
RequestDispatcher
в том же веб-приложении.
- person AllTooSir; 08.06.2013
Используя session
, я успешно передал параметр (name
) из сервлета №1 в сервлет №2, используя response.sendRedirect
в сервлете №1. Код сервлета №1:
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
String name = request.getParameter("name");
String password = request.getParameter("password");
...
request.getSession().setAttribute("name", name);
response.sendRedirect("/todo.do");
В Servlet #2 вам не нужно возвращать name
. Он уже подключен к сеансу. Вы можете сделать String name = (String) request.getSession().getAttribute("name");
--- но вам это не нужно.
Если сервлет № 2 вызывает JSP, вы можете показать name
таким образом на веб-странице JSP:
<h1>Welcome ${name}</h1>
Чтобы отправить значение переменной через URL в response.sendRedirect(). Я использовал его для одной переменной, вы также можете использовать его для двух переменных путем правильной конкатенации.
Строковое значение = "xyz";
response.sendRedirect("/content/test.jsp?var="+value);