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

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

response.sendRedirect("/content/test.jsp");

person Ashish Anand    schedule 08.06.2013    source источник
comment
@informatik01 мой ответ охватывает то, что вы описали в своем, за исключением того, что мой добавляет часть представления об удалении атрибута сеанса с использованием JSTL.   -  person Luiggi Mendoza    schedule 09.06.2013
comment
@LuiggiMendoza Извини, чувак, я удалю свой комментарий, чтобы убедиться, что с тобой все в порядке. Кстати, этот ответ был опубликован около 5 месяцев назад)   -  person informatik01    schedule 09.06.2013
comment
@informatik01 не знал о вашем сообщении, но, похоже, мы оба знаем (среди других людей по всему миру), как справиться с этой проблемой.   -  person Luiggi Mendoza    schedule 09.06.2013


Ответы (4)


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

  1. Использование переадресации. Это позволит передать атрибуты запроса в представление, и вы сможете использовать их в форме 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}" />
    
  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" />
    
person Luiggi Mendoza    schedule 08.06.2013
comment
Я знаю, что это очень старый ответ, но я хочу удалить атрибут из сеанса с помощью тимелеафа, но не смог найти ничего работающего. Любая помощь? - person oxyt; 27.04.2019

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

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

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

person AllTooSir    schedule 08.06.2013
comment
@AshishAnand Смотрите мой отредактированный ответ, вы можете использовать RequestDispatcher в том же веб-приложении. - person AllTooSir; 08.06.2013
comment
это должно быть getServletContext().getRequestDispatcher(...) ? - person access_granted; 22.03.2018

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

person Raymond Gan    schedule 24.11.2016

Чтобы отправить значение переменной через URL в response.sendRedirect(). Я использовал его для одной переменной, вы также можете использовать его для двух переменных путем правильной конкатенации.

Строковое значение = "xyz";

response.sendRedirect("/content/test.jsp?var="+value);

person Arvind Kumar    schedule 15.04.2020