Параметры формы JSP исчезают, когда я размещаю форму на другой странице - PullRequest
3 голосов
/ 04 октября 2010

Если я оставлю атрибут action вне формы, чтобы он отправлял обратно в тот же JSP, у меня не возникнет проблем при чтении параметров запроса. Однако, когда я добавляю атрибут action для обработки формы с отдельным JSP, параметры запроса равны null. Вот короткий пример (FormTest.jsp), который иллюстрирует, как я читаю запрос.

<HTML>
    <HEAD>
        <TITLE>FormTest.jsp</TITLE>
    </HEAD>
    <BODY>
        <H3>Using a Single Form</H3>
        <%
            String command = request.getParameter("submit");
        %>
            You clicked <%= command %>

        <FORM NAME="form1" METHOD="POST">
            <INPUT TYPE="SUBMIT" NAME="submit" VALUE="First">
            <INPUT TYPE="SUBMIT" NAME="submit" VALUE="Second">
            <INPUT TYPE="SUBMIT" NAME="submit" VALUE="Third">
        </FORM>
    </BODY>
</HTML>

Данная страница работает, как и ожидалось. Первоначально страница печатается You clicked null вместе с формой. Нажатие любой из трех кнопок изменяет сообщение на You clicked First и т. Д.

Теперь я изменил только одну строку на странице выше, чтобы добавить атрибут action:

<FORM NAME="form1" METHOD="POST" ACTION="FormHandler.jsp">

Я добавил отдельную JSP в свой проект для чтения параметра запроса следующим образом:

<HTML>
    <HEAD>
        <TITLE>FormHandler.jsp</TITLE>
    </HEAD>
    <BODY>
        <H3>Form Handler</H3>
        <%
            String command = request.getParameter("submit");
        %>
            You clicked <%= command %>
    </BODY>
</HTML>

Я ожидал, что новый FormHandler.jsp просто распечатает, какая кнопка была нажата на другой странице, но кажется, что параметр запроса всегда null.

Что может мешать отправке параметров запроса в отдельную JSP?

Обновление:

Этот проект также имеет файл конфигурации JSF. Я изменил атрибут action на ACTION="FormHandler.faces", и приведенный выше код работает, но я пока не совсем понимаю, почему. Вот метод, который перенаправляет запросы, заканчивающиеся на .jsp.

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
        throws ServletException, IOException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    String uri = request.getRequestURI();

    if (uri.endsWith(".jsp")) {
        int length = uri.length();
        String newAddress = uri.substring(0, length - 3) + ".faces";
        response.sendRedirect(newAddress);
    }
    else { //Address ended in "/"
        response.sendRedirect("login.faces");
    }
}

Теперь, наверное, мне нужно знать 1) как выяснить, является ли это источником проблемы, и 2) есть ли способ сохранить параметры запроса при перенаправлении ответа?

В файле конфигурации web.xml для этого проекта также есть запись, которая устанавливает отображение фильтров.

<filter-mapping>
    <filter-name>faces-redirect-filter</filter-name>
    <url-pattern>*.jsp</url-pattern>
</filter-mapping>

Полагаю (но теперь уже ясно, что я новичок в JSF, поэтому кто-то поправит меня, если я ошибаюсь), что использование расширения .faces в моем атрибуте action обходит этот фильтр.

1 Ответ

7 голосов
/ 05 октября 2010

POST параметры теряются, потому что sendRedirect() отправляет перенаправление 302 Moved Temporarily, которое инструктирует браузер загрузить указанную страницу с запросом GET.

Для сохранения параметров вам нужно использовать 307 Temporary Redirect вместо этого - он дает указание браузеру повторить запрос POST на указанный URI:

response.setHeader("Location", newAddress); 
response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...