【问题标题】:Simple JSP/servlet issue with accessing object访问对象的简单 JSP/servlet 问题
【发布时间】:2016-05-22 17:43:37
【问题描述】:

我正在使用 Java(JSP 和 Servlet),但被卡住了。根据我的研究,我相信我可能需要一个会话级对象

用户完成一个 JSP 表单,按下提交,它是 POST 到类 NewServlet。

在 NewServlet 内部创建了一个对象 NewFileThing,该信息存储在其中。

    @WebServlet(urlPatterns = {"/NewServlet"})
    public class NewServlet extends HttpServlet {
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

     // Stuff happens here...
String nameOfUser = request.getParameter("name");

    NewFileThing fi = NewFileThing();
    fi.addName(name);

    response.sendRedirect("nextForm");
    }
    }

然后用户被重定向到 nextForm.jsp。当他们完成此表单后,他们将被发送到 FinalServlet。

@WebServlet("/FinalServlet")
@MultipartConfig
public class FinalServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO how can I access object fi (NewFileThing) from here? 
fi.getName(); <--- Error, or if I make new object it's NULL...
}
}

问题:在 FinalServlet 中,我怎样才能获得我之前创建的相同对象 NewFileThing(相同的实例)?我不想创建一个新的!

感谢可爱的社区!

【问题讨论】:

    标签: java jsp session object servlets


    【解决方案1】:

    是的,一种方法是将该对象存储在会话中。

    在 NewServlet 中

    NewFileThing fi = NewFileThing();
    fi.addName(name);
    
    // get the session
    HttpSession session = request.getSession();
    session.setAttribute("NewFileThing", fi);
    

    在 FinalServlet 中

    // get the session
    HttpSession session = request.getSession();
    
    // get object from session
    NewFileThing fi =  (NewFileThing) session.getAttribute("NewFileThing");
    
    // Make sure it is on the session
    if (fi != null)
    {
        String name = fi.getName();
    }
    

    【讨论】:

    • HttpSession 的大小是否有限制?
    • 这真的取决于服务器的内存资源。你绝对可以在那里储存大量的东西,但我不会太疯狂。您还必须考虑将有多少并发用户。尽量减少会话。如果您需要存储更大的对象,请研究其他形式的持久存储(例如文件、数据库表等)
    • java.lang.IllegalArgumentException: setAttribute: 名称为 fi 的不可序列化属性。我搜索了解决方案,但不明白:您可以通过使用可序列化的 List 实现来使对象可序列化,并确保列表中的对象也是可序列化的。
    • 简短的回答是限制是 JVM。在您的情况下,如果它是一个相当简单的网络应用程序,您可能没问题。我还会考虑并发性和状态完整性考虑(这是一个开始:stackoverflow.com/questions/616601/…)
    • 序列化是另一个话题。我现在不会担心这个。看看你是否可以在第一个 servlet 的会话中存储一个字符串,并在最终的 servlet 中访问该字符串。
    【解决方案2】:

    如果这是一个简单的 web 应用程序,那么“是”,将您的对象存储在 HttpSession 中。

    如果这是一个更复杂的 webapp,那么您可以将对象存储在 HttpSession 中,但您需要“更聪明”地了解如何操作。或者,考虑使用某种持久性存储。

    【讨论】:

    • 什么类型的持久存储,比如数据库?我认为在我的情况下 HttpSession 会很好,因为它只是名称、地址等......
    • 常见的持久存储是数据库。想想像购物车这样的东西。
    【解决方案3】:

    response.sendRedirect() 不会保留您的请求数据。 您必须使用 RequestDispatcher 类。 有多种方法可以在多个类中传输数据。 您可以根据需要将其放入页面范围、请求范围、会话范围或应用范围。 在页面范围内,您的对象数据将仅保留在同一页面中。 在请求范围内,您的对象将保留到下一个即时页面。 在会话范围内,您的对象将保留在同一应用程序同一会话时间的多个页面中。 在应用程序范围内,您的对象也可以进入多个应用程序。

    最常用的范围是请求和会话。

    使用会话必须格外小心,如果使用不当,可能会与其他会话混淆。

    在您的情况下,似乎有多个 jsp 和 servlet,其中对象在使用之前需要经过。所以最好参加会议。使用后将其从会话中删除。所以搞砸的机会更少。

    在第一个 servlet 中将对象放入会话中

    NewFileThing fi = NewFileThing();
    fi.addName(name);
    
    // get the session
    HttpSession session = request.getSession();
    session.setAttribute("NewFileThing", fi);
    

    在你想要的地方使用它 // 获取会话 HttpSession 会话 = request.getSession(); // 从会话中获取对象 NewFileThing fi = (NewFileThing) session.getAttribute("NewFileThing");

    // Make sure it is on the session
    if (fi != null)
    {
        String name = fi.getName();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      • 2011-11-24
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      相关资源
      最近更新 更多