如何在jsp页面和servlet之间共享数据

时间:2009-11-04 14:44:40

标签: java jsp session servlets

我有几个.jsp页面和几个servlet。

我需要将一些信息保存到会话变量中。在jsp页面中,我只是引用

session.get...()

session.set...()

没有明确声明HttpSession对象。

但是在servlet中应用适当的编程规则,我必须先创建一个对象。

我担心的是我是否创建了这样的对象

HttpSession session = new HttpSession();

然后使用类似的内容写入

session.setAttribute("files",fileList);

我担心的是我没有写入.jsp文件中引用的同一个会话对象。

我该怎么做才能在任何jsp或servlet中写入同一个对象。

2 个答案:

答案 0 :(得分:6)

您需要通过调用 HttpServletRequest.getSession()方法来获取HttpSession。

HttpServletRequest传入您的 doGet()方法。如果此请求尚未启用会话,则 getSession()将创建一个会话。如果会话已经到位并与此请求相关联,则getSession()将检索现有会话。如果使用此标准机制,那么您将自动在JSP和servlet之间共享相同的会话。

您永远不应该尝试直接构建HttpSession,因为它是由容器管理的。实际上,你不能通过调用 new HttpSesion()来创建一个新的,因为HttpSession只是一个接口,无法实例化。

答案 1 :(得分:5)

要预处理数据,请使用Servlet的doGet()方法。

Data data = dataDAO.load();
request.setAttribute("data", data);
request.getRequestDispatcher("page.jsp").forward(request, response);

要访问JSP中的数据,请使用EL(按照此顺序在页面,请求,会话和应用程序范围内搜索具有给定名称的属性)。

<br>Plain object: ${data}
<br>A property: ${data.property}
<br>Explicitly search in request scope: ${requestScope.data}

要将数据从JSP发送到servlet,通常使用由客户端控制的请求参数。最常用的HTML表单就是用于此目的。或者,您也可以使用Javascript向服务器端发出异步请求。

任何生活在同一范围内的东西都可以访问某个范围内的任何内容。请求范围从客户端发起请求的那一刻开始(通过单击链接,按钮,书签或在地址栏中输入URL),直到服务器发送响应的最后一位。您通常将请求特定数据存储在那里,如表单数据。会话范围从客户端第一次请求网页的那一刻起生效,并且HttpSession尚未创建,直到HttpSession在未使用一段时间后超时(可在web.xml中配置),或者当代码使用HttpSession#invalidate()显式超时时。您通常将用户特定数据存储在那里,例如登录用户和用户首选项等。应用程序范围从服务器启动的那一刻起直到服务器关闭(或重新启动)的那一刻为止。您通常在其中存储应用程序范围的数据,如静态下拉数据,DAO工厂,Web应用程序配置数据等。

请求可以通过Servlet类中的HttpServletRequest参数访问 Servlet类中的HttpServletRequest#getSession()可以访问该会话 Servlet类中的继承getServletContext()方法可以访问该应用程序 它们都有get / setAttribute()方法。

要了解有关JSP / Servlet / EL的更多信息,我可以向您推荐Sun Java EE 5 tutorial part II chapters 1-8

祝你好运。