Как передать скрытые параметры? Я хочу вызвать страницу (test.jsp), но также передать 2 скрытых параметра, таких как сообщение.
response.sendRedirect("/content/test.jsp");
Как передать скрытые параметры? Я хочу вызвать страницу (test.jsp), но также передать 2 скрытых параметра, таких как сообщение.
response.sendRedirect("/content/test.jsp");
Ответ TheNewIdiot успешно объясняет проблему и причину, по которой вы не можете отправлять атрибуты в запрос через перенаправление. Возможные решения:
Использование пересылки. Это позволит передать атрибуты запроса в представление, и вы можете использовать их в форме ServletRequest#getAttribute
или используя Язык выражений и 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 при загрузке страницы.
Используя 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");
---, но вам это не нужно.
Если Servlet # 2 вызывает JSP, вы можете показать name
таким образом на веб-странице JSP:
<h1>Welcome ${name}</h1>