如果我将 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 的新手,所以如果我错了有人纠正我)在我的 action< 中使用
属性绕过此过滤器。.faces
扩展
最佳答案
POST
参数丢失,因为 sendRedirect()
发送一个 302 Moved Temporarily
重定向,指示浏览器加载指定页面 GET
请求。
要保留参数,您需要使用 307 Temporary Redirect
- 它指示浏览器向指定的 URI 重复 POST
请求:
response.setHeader("Location", newAddress);
response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT);
关于java - 当我将表单发布到另一个页面时,JSP 表单参数消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3858483/