代码之家  ›  专栏  ›  技术社区  ›  Bill the Lizard

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

  •  3
  • Bill the Lizard  · 技术社区  · 15 年前

    如果我离开 action 属性,这样它就可以回发到同一个JSP,读取请求参数没有问题。但是当我添加一个 属性使用单独的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 等等。

    现在我只在上面的页面中更改一行来添加 属性:

    <FORM NAME="form1" METHOD="POST" ACTION="FormHandler.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 无效的 .

    什么可能会干扰发送到单独JSP的请求参数?

    更新:

    行动 属性为 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>
    

    .faces 行动 属性绕过此筛选器。

    1 回复  |  直到 5 年前
        1
  •  7
  •   axtavt    15 年前

    POST 参数丢失,因为 sendRedirect() 发送一个 302 Moved Temporarily 重定向,指示浏览器使用 GET

    要保留需要使用的参数 307 Temporary Redirect 岗位 请求指定的URI:

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