JSP代码是:
<jsp:useBean id="person" class="org.example.model.PersonModel" scope="session"> </jsp:useBean> <br> Name : <jsp:getProperty property="name" name="person"/> <br> Surname : <jsp:getProperty property="surname" name="person"/>
尽管我在将请求转发到此Servlet的控制器Servlet 的request作用域中而不是在session作用域中设置了java对象。<jsp:useBean>尽管标记中提到的作用域是会话,如何获取请求属性?如果它用于pageContext.findAttribute()获取属性,那么在该<jsp:useBean>标签中具有scope属性有什么用?
request
session
<jsp:useBean>
pageContext.findAttribute()
的PageContext#findAttribute()分别在页,请求,会话和应用范围,直到第一非扫描null属性值被发现,对于给定的属性键。另请参阅javadoc:
PageContext#findAttribute()
null
在页面,请求,会话(如果有效)和应用程序范围内 按顺序 搜索命名属性,并返回关联的值或null。
这就解释了为什么它在转发servlet中找到范围为1的请求,而不是在JSP中声明范围为1的会话。我们的EL Wiki页面也对此进行了说明。
无论如何,如果您使用的是servlet,则不应<jsp:useBean>在应该由servlet管理的模型对象上使用。将<jsp:useBean>分别遵循不同的MVC水平实际使用servlet作为控制器时,这只会导致混乱和维护的麻烦。在Servlets Wiki页面的“编码样式和建议”部分中也明确提到了这一点。
因此,除了所有这些<jsp:xxx>事情,您可以执行以下操作:
<jsp:xxx>
<br>Name: ${person.name} <br>Surname: ${person.surname}
您只需要添加JSTL <c:out>来防止潜在的XSS攻击漏洞,同时重新显示用户控制的数据(请注意,<jsp:getProperty>这样做不会!)
<c:out>
<jsp:getProperty>
<br>Name: <c:out value="${person.name}" /> <br>Surname: <c:out value="${person.surname}" />