如何实现Post Redirect获取JSP文件,在哪里保存数据?

Kor*_*gay 0 java jsp servlets post-redirect-get java-ee

我想做一个简单的post-redirect - 使用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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

表单对同一个url(/ index)发出post请求,这次调用doPost.在这里我保持firstName如下所示:

String firstName = httpServletRequest.getParameter("firstName");
Run Code Online (Sandbox Code Playgroud)

然后我将用户重定向到/ 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);

    }
}
Run Code Online (Sandbox Code Playgroud)

所以我在这里得到变量

String firstName = (String) httpServletRequest.getSession().getAttribute("firstName");
Run Code Online (Sandbox Code Playgroud)

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

然后我将请求转发给showInformation.jsp,它看起来像:

    Hello, your first name is: <%= request.getAttribute("firstName") %>
Run Code Online (Sandbox Code Playgroud)

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

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

 Syntax error on token ";", delete this token
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 6

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

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

/product?id=<theGeneratedProductId>
Run Code Online (Sandbox Code Playgroud)

要么

/products/<theGeneratedProductId>
Run Code Online (Sandbox Code Playgroud)

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

关于你的第二个问题:

<%= request.getAttribute("firstName") %>
Run Code Online (Sandbox Code Playgroud)

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

response.getWriter().print(request.getAttribute("firstName"));
Run Code Online (Sandbox Code Playgroud)

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

response.getWriter().print(request.getAttribute("firstName"););
Run Code Online (Sandbox Code Playgroud)

这将是无效的Java代码.

不管怎样,你不应该在JSP中使用scriptlet.因此,请尽量忘记存在scriptlet,并学习JSP EL,JSTL和其他自定义标记库.你应该写:

${firstName}
Run Code Online (Sandbox Code Playgroud)

或者,甚至更好:

<c:out value="${firstName}"/>
Run Code Online (Sandbox Code Playgroud)

这将确保你的HTML保持有效即使的firstName恰好包含必须HTML字符转义,如<,>,&,'".

想想如果用户提交了以下firstName会发生什么,以及它是否未正确转义:

<script>alert('Got you!');</script>
Run Code Online (Sandbox Code Playgroud)