it-roy-ru.com

Передайте скрытые параметры, используя response.sendRedirect ()

Как мне передать скрытые параметры? Я хочу вызвать страницу (test.jsp), но также передать 2 скрытых параметра, таких как сообщение.

response.sendRedirect("/content/test.jsp");
25
Ashish Anand

Ответ TheNewIdiot успешно объясняет проблему и причину, по которой вы не можете отправлять атрибуты в запросе через перенаправление. Возможные решения:

  1. Используя пересылку. Это позволит передавать атрибуты запроса представлению, и вы можете использовать их в форме 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}" />
    
  2. Если вы не можете использовать переадресацию (потому что вам это не нравится, или вы не чувствуете это таким образом, или потому что вы должны использовать перенаправление), тогда можно было бы сохранить сообщение в качестве атрибута сеанса, а затем перенаправить на ваш просмотр. , восстановите атрибут сеанса в вашем представлении и удалите его из сеанса. Не забудьте всегда иметь пользовательский сеанс только с соответствующими данными. Пример кода

    Контроллер

    //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" />
    
44
Luiggi Mendoza

Как правило, вы не можете отправить запрос POST с помощью sendRedirect () метода. Вы можете использовать RequestDispatcher to forward () запросы с параметрами в том же веб-приложении, в том же контексте.

RequestDispatcher dispatcher = servletContext().getRequestDispatcher("test.jsp");
dispatcher.forward(request, response);

Спецификация HTTP утверждает, что все перенаправления должны быть в форме GET (или HEAD). Вы можете рассмотреть возможность шифрования параметров строки запроса, если проблема в безопасности. Другой способ заключается в том, что вы можете POST достичь цели, используя скрытую форму с методом POST и передавая ее с помощью javascript при загрузке страницы.

4
NINCOMPOOP

Используя 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>

1
Raymond Gan