Передайте скрытые параметры с помощью response.sendRedirect()
Как передать скрытые параметры? Я хочу вызвать страницу (test.jsp), но также передают 2 скрытых параметра, таких как сообщение.
response.sendRedirect("/content/test.jsp");
3 ответов
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 to вперед() запросы с параметрами в том же веб-приложении, в том же контексте.
RequestDispatcher dispatcher = servletContext().getRequestDispatcher("test.jsp");
dispatcher.forward(request, response);
спецификация HTTP утверждает, что все перенаправления должны быть в форме GET (или HEAD). Вы можете рассмотреть возможность шифрования параметров строки запроса, если проблема безопасности. Другой способ-вы можете опубликовать к цели, имея скрытый форма с методом 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");
в сервлете #2 вам не нужно получать name
обратно. Он уже подключен к сеансу. Вы могли бы сделать String name = (String) request.getSession().getAttribute("name");
- - - - но вам это не нужно.
если сервлет #2 вызывает JSP, вы можете показать name
этот путь на веб-странице JSP:
<h1>Welcome ${name}</h1>