0

我想做一个简单的帖子 - 重定向 - 使用 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
4

1 回答 1

6

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

让我们举一个更现实的例子。该表单用于创建产品。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 转义的字符,例如<>、或.&'"

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

<script>alert('Got you!');</script>
于 2013-11-11T19:26:59.780 回答