【问题标题】:How to implement Post Redirect Get with JSP files, where to keep the data?如何使用JSP文件实现Post Redirect Get,数据保存在哪里?
【发布时间】:2013-11-11 19:12:41
【问题描述】:

我想做一个简单的帖子 - 重定向 - 使用 JSP。我就是这样做的。重要的 Servlet 是这样的:

public class PostRedirectGet extends HttpServlet {

    public void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
            throws ServletException, IOException {

        getServletContext().getRequestDispatcher("/WEB-INF/getInformation.jsp")
                .forward(httpServletRequest,httpServletResponse);

    }

    public void doPost(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse)
            throws IOException {
        String firstName = httpServletRequest.getParameter("firstName");
        HttpSession httpSession = httpServletRequest.getSession();
        httpSession.setAttribute("firstName",firstName);
        httpServletResponse.sendRedirect(getServletContext().getContextPath()+"/getFormData");
    }
}

因此,当对这个 Servlet ( /index ) 发出 get 请求 时,我只显示 getInformation.jsp 表单所在的位置。

表单向相同的 url ( /index ) 发出 post 请求,这一次 doPost 被调用。在这里,我保留了 firstName,如下所示:

String firstName = httpServletRequest.getParameter("firstName");

然后我将用户重定向到 /getFormData。这是负责的 servlet:

public class Get extends HttpServlet {

    public void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
            throws ServletException, IOException {

        String firstName = (String) httpServletRequest.getSession().getAttribute("firstName");
        httpServletRequest.setAttribute("firstName",firstName);
        getServletContext().getRequestDispatcher("/WEB-INF/showInformation.jsp")
                .forward(httpServletRequest, httpServletResponse);

    }
}

所以在这里我从

获取变量
String firstName = (String) httpServletRequest.getSession().getAttribute("firstName");

我的第一个问题是:1) 这样 firstName 将在整个会话期间可用,但我不希望这样。那么我应该如何在 2 个 servlet 之间传递信息呢?或者我应该如何清除这个值?

然后我将请求转发给 showInformation.jsp,如下所示:

    Hello, your first name is: <%= request.getAttribute("firstName") %>

我的第二个问题是:2)为什么没有“;”在 request.getAttribute("firstName) 在这里之后?它像这样工作正常,但我希望需要一个分号(“;”)。

如果我在我的 jsp 文件中添加一个分号,我会得到这个异常:

 Syntax error on token ";", delete this token

【问题讨论】:

    标签: java jsp jakarta-ee servlets post-redirect-get


    【解决方案1】:

    关于您的第一个问题:您不应该使用会话来存储这样的临时数据。

    让我们举一个更现实的例子。该表单用于创建产品。 POST 请求包含产品的所有信息。因此 servlet 从请求参数中获取此信息,在数据库的产品表中创建一行,并为这个创建的产品生成一个标识符(主键)。现在 servlet 应该重定向到显示创建的产品信息的页面。所以它应该重定向到这种 URL:

    /product?id=<theGeneratedProductId>
    

    /products/<theGeneratedProductId>
    

    然后,第二个 servlet 将从请求参数或请求 URL 中获取产品的 ID,从数据库中获取产品信息,将 Product 对象存储在请求属性中,然后转发到显示该产品的 JSP。

    关于你的第二个问题:

    <%= request.getAttribute("firstName") %>
    

    由 JSP 编译器翻译为以下 Java 指令(这并不完全正确,但您应该明白):

    response.getWriter().print(request.getAttribute("firstName"));
    

    所以你明白添加分号会转化为

    response.getWriter().print(request.getAttribute("firstName"););
    

    这将是无效的 Java 代码。

    无论如何,您都不应该在 JSP 中使用 scriptlet。因此,试着忘记 scriptlet 的存在,并学习 JSP EL、JSTL 和其他自定义标记库。你应该写:

    ${firstName}
    

    或者,甚至更好:

    <c:out value="${firstName}"/>
    

    这将确保您的 HTML 保持有效,即使 firstName 恰好包含必须进行 HTML 转义的字符,例如 &lt;&gt;&amp;'"

    想想如果用户提交了以下名字,如果没有正确转义会发生什么:

    <script>alert('Got you!');</script>
    

    【讨论】:

    • 对于这个特定的例子,这是否可以接受:httpServletRequest.setAttribute("firstName",firstName); httpServletRequest.getSession().removeAttribute(firstName);
    • 没有。不要使用会话来存储临时数据。这是我回答的第一句话。重定向时传递 firstName 作为参数:sendRedirect(...+"/getFormData?firstName=" + firstName);.
    • 是的,我只是想确认一下。感谢您的回答。
    猜你喜欢
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 2015-02-16
    • 2019-04-09
    相关资源
    最近更新 更多