Если я оставлю атрибут 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
обходит этот фильтр.