在 jsp 中管理用户会话时,我们有时通过使用 session.setAttribute() 设置变量来使用会话,另一方面,我们可以创建 java bean 对象(将范围设置为会话)来存储用户信息并可以在另一个页面上检索它。谁能告诉我这两件事有什么区别?
2 回答
它们只是传递相同数据的方式略有不同。
正如您所说,您可以:
(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,如果没有创建则创建,所以如果你想调用一个函数或者使用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 比较陌生,但这是我对这种情况的理解。