【问题标题】:How to return some data from HttpServlet's doPost() method?如何从 HttpServlet 的 doPost() 方法返回一些数据?
【发布时间】:2015-03-11 15:19:06
【问题描述】:

我正在编写一个扩展 HttpServlet 的 java 类,从而覆盖 doPost() 方法。在 doPost() 方法中,组装了一些数据对象,但我不确定返回数据的更好方法是什么。例如,

public class FormSubmission extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // http request is parsed to assemble an object, e.g., a List
        List L = parseRequest(request);

        // Question: how to return List L for use by Server?         
    }
}    

我能想到的一种方法是将静态变量声明为

Public static List L;

并调用FormSubmission.L,这基本上使 List L 成为全局变量。

另一种方法是将数据字节写入文件,以便以后可以将其读回列表。

但是有没有更好的方法来处理这种情况?

基于评论的用例:

在首页“index.html”中创建了两个带有HTTP/POST的表单,表单A和B。要求用户先提交表单A,然后提交表单B。提交表单A触发上述doPost() 方法,从而构造 List L。该方案是如何使此列表可用于处理表单 B 提交。具体来说,如何让 Form B 的 doPost() 方法能够访问从 A 创建的 List L前一阶段。

【问题讨论】:

  • 您的用例是什么?哪些类会使用该列表?用于显示目的的业务服务或 JSP?
  • 基本上,我创建了两个表单,表单A和B。如果我提交表单A,就会调用上面的doPost()方法并构造List L。然后如果我点击提交表单B,目标是表单B的doPost()方法能够拉入从表单A创建的列表L。所以我的麻烦是如何将A的doPost()中的值传递给B使用.
  • 表单是否提交到同一个 FormSubmission servlet?
  • 不,他们将使用两个不同的 servlet 类,每个类都有自己的 doPost() 方法。

标签: java servlets http-post


【解决方案1】:

在您的FormASubmission servlet 中,将List 保存到用户的session 对象中。

List L = parseRequest(request);

HttpSession session = request.getSession();
session.setAttribute("FormADataList", L);

然后在您的FormBSumission servlet 中,您可以将这个List 检索为

HttpSession session = request.getSession();
List L = (List) session.getAttribute("FormADataList");

HttpSession 是一个接口,其底层实现由容器提供。每个与应用程序交互的用户/浏览器只创建一次此作用域 对象。在会话期间,存储在此处的任何用户数据在来自同一用户的多个 HTTP 请求中仍然可用。

HttpSession 的 javadoc 这么说

提供了一种在多个页面请求或访问网站时识别用户并存储有关该用户的信息的方法。

【讨论】:

  • 所以一个 HttpSession 在不同的 servlet 之间共享——这正是我想要的。谢谢。
  • 正确。我对此添加了更多细节。还要注意session.getAttribute() 返回一个Object;所以,它需要在使用前类型转换
【解决方案2】:

我会考虑使用 Session 范围并放在那里。 您可以从该会话中访问对象。

final HttpSession session = req.getSession();

【讨论】:

    【解决方案3】:

    你可以做一个 RequestDispatcher

    RequestDispatcher rd = request.getRequestDispatcher("name.jsp");
        rd.forward(request, response);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-21
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 2012-02-07
      • 2019-05-21
      相关资源
      最近更新 更多