当我将表单发布到另一个页面时,JSP表单参数消失

时间:2010-10-04 19:36:12

标签: java jsp jsf forms post

如果我将action属性保留在我的表单之外,以便它回发到同一个JSP,我就可以轻松读取请求参数。但是,当我使用单独的JSP添加action属性来处理表单时,请求参数为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 个答案:

答案 0 :(得分:7)

POST参数丢失,因为sendRedirect()发送了302 Moved Temporarily重定向,指示浏览器使用GET请求加载指定的网页。

要保留参数,您需要使用307 Temporary Redirect - 它指示浏览器重复对指定URI的POST请求:

response.setHeader("Location", newAddress); 
response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT);