Bil*_*ard 3 java forms jsf post jsp
如果我将该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>
Run Code Online (Sandbox Code Playgroud)
上面的页面按预期工作.最初页面You clicked null随表单一起打印.单击三个按钮中的任何一个都会将消息更改为You clicked First等.
现在我只更改上面页面中的一行来添加action属性:
<FORM NAME="form1" METHOD="POST" ACTION="FormHandler.jsp">
Run Code Online (Sandbox Code Playgroud)
我在项目中添加了一个单独的JSP来读取请求参数,如下所示:
<HTML>
<HEAD>
<TITLE>FormHandler.jsp</TITLE>
</HEAD>
<BODY>
<H3>Form Handler</H3>
<%
String command = request.getParameter("submit");
%>
You clicked <%= command %>
</BODY>
</HTML>
Run Code Online (Sandbox Code Playgroud)
我希望新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");
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想我需要知道1)如何判断这是否是问题的根源,2)有没有办法在重定向响应时保留请求参数?
web.xml此项目的配置文件中还有一个条目,用于设置过滤器映射.
<filter-mapping>
<filter-name>faces-redirect-filter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
我想(但现在可能很清楚我是JSF的新手,所以如果我错了就有人纠正我),.faces在我的action属性中使用扩展会绕过这个过滤器.
POST参数丢失,因为sendRedirect()发送302 Moved Temporarily重定向,指示浏览器使用GET请求加载指定的页面.
要保留您需要使用的参数307 Temporary Redirect- 它指示浏览器重复POST对指定URI 的请求:
response.setHeader("Location", newAddress);
response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5219 次 |
| 最近记录: |