【问题标题】:JSP form parameters disappear when I POST my form to another page当我将表单发布到另一个页面时,JSP 表单参数消失
【发布时间】:2010-10-04 19:36:12
【问题描述】:

如果我将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 扩展会绕过此过滤器。

【问题讨论】:

  • 你的环境是什么?我刚刚将您的示例粘贴到 Tomcat 6.0.24 中,它运行良好。
  • @Affe:我在 WebLogic 9.2 中运行它。这个项目还有一个 JSF 配置文件,我现在正在查看,看看能否找到问题的根源。
  • 我同意 Affe 的观点,即它适用于 Tomcat。你在firebug的net视图中看到请求了吗?
  • @kukudas:谢谢。不幸的是,我正在使用 IE6 工作,所以没有萤火虫。

标签: java jsp jsf forms post


【解决方案1】:

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

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

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

【讨论】:

  • 正是我需要的。谢谢。
  • 非常感谢@axtavt!这就是我一直在寻找的
猜你喜欢
  • 1970-01-01
  • 2012-06-24
  • 2015-05-05
  • 2015-04-18
  • 1970-01-01
  • 2011-01-26
  • 2013-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多