它们只是传递相同数据的略微不同的方式。
就像你所说的,你可以选择:
(1)
session.setAttribute("entry", entry);
或(2)
session.setAttribute("name", entry.getName());
session.setAttribute("address", entry.getAddress());
session.setAttrubute("phone", entry.getPhone());
对于(1),JSP 可能包括以下内容:
Name: ${entry.name}<br/>
Address: ${entry.address}<br/>
Phone: ${entry.phone}<br/>
对于(2),相应的JSP可能是:
Name: ${sessionScope['name']}<br/>
Address: ${sessionScope['address']}<br/>
Phone: ${sessionScope['phone']}<br/>
(或者您可以使用<c:set>
设置一些本地变量,以使上面的代码更易读)。
本质上,两者都是相同的,但是(1)使用的代码较少,更易于阅读和理解。
(虽然我自己仍然是Java EE的新手,所以我不介意听取更有经验的意见!)
有一些不同之处。
首先,当你将某些东西存储为属性时,它会被存储为对象,因此在检索它时必须将其强制转换为实际上它是什么类型,而Bean始终是它所表示的类。
其次,在使用Bean时,您不必担心它是否已经创建。jsp:useBean标记将访问Bean(如果已经创建),并在没有Bean的情况下创建它,因此如果您想要调用一个函数或使用一个get方法,您可以保证在使用Bean时它实际上是存在的。如果您打算将它存储在会话变量中,但在存储之前尝试访问它,它将返回null,并且调用函数将引起一些问题。
通常,您使用会话变量来传递信息,而使用Bean来传递具有可能需要调用的函数的类。
因此,如果您计划传递相对简单的数据(例如字符串),将其抛到会话变量中没有任何问题。null作为值是有意义的,只需在比较时小心(例如,使用string_var.equals((String)session.getAttribute("attribute_name"))而不是((String)session.getAttribute("attribute_name")).equals(string_var),因为后者可能是null.equals(),这是未定义的)。
如果您正在使用MVC框架进行编程,那么(据我所知),通常使用bean将信息写入会话(或其他变量,具体取决于情况),然后您的JSP页面将从会话变量中加载信息。这使得网页刷新安全(意思是,如果您点击刷新按钮,它将仅从会话变量中再次获取信息,而不是重新运行所有代码并重新加载会话变量中的信息),当您附加信息、增加或减少时,这是非常重要的。
诚然,我对JSP还比较新,但这就是我的理解。