我想了解jsp:useBean
JSP动作标签中的scope
属性的工作原理。在我的理解中,scope
用于指示bean所在的位置(请求,会话,应用程序等),但经过一些测试后,我遇到了一个非常有趣的情况,请考虑以下JSP代码(我正在使用脚本这里只是为了简单起见):jsp:useBean范围属性如何工作?
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1" import="package2JSP.User" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Title</title>
</head>
<body>
<%
User user1 = new User("id1","name1");
User user2 = new User("id2","name2");
request.setAttribute("user", user1);
session.setAttribute("user", user2);
%>
<%-- Here I expect to create user bean that represents user2 from session scope--%>
<jsp:useBean id="user" class="package2JSP.User" scope="session"/>
<%-- Here I expect user name to be name2 but it is name1 instead--%>
<jsp:getProperty property="name" name="user"/>
</body>
</html>
所以基本上我在这里创建了2个用户对象并将其设置为“用户”的请求和会话作用域属性,当我试图从“会话”检索“用户”使用jsp:useBean
的范围似乎是从“请求”范围中检索到“用户”。
你能解释一下为什么发生了吗?那么为什么jsp:useBean
以这种方式工作而不是通常从指定范围选择属性的发展原因是什么?它有什么优点吗?
现在我知道我可以使用JSTL/EL来检索所需的值,即<c:out value="${sessionScope.user.name}" />
但我只是想知道jsp:useBean
的工作原理。
感谢您的澄清。在我看来,这更像是一个设计/开发漏洞,如果'jsp:getProperty'使用'findAttribute'来获得它的值,那么逻辑上我可以去掉''jsp:useBean id =“user”class =“package2JSP.User” scope =“session”/>'line in my jsp file and I should still get namename for' '因为'user'仍然在请求中,会话范围。 –
当我试图做到这一点时,我得到了一个异常,这可能意味着当你使用'getProperty'时,bean必须通过'jsp:useBean'定义。好吧,我尝试使用'<%= user.getName()%>'来获得正确的值,正如你所建议的那样,它的工作原理是这里的罪魁祸首绝对是'jsp:getProperty'而不是'jsp:useBean'。 –