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"/>
虽然我在request
范围内设置java对象而不是在Controller Servlet中的session
范围内,我将请求转发给此Servlet。虽然标记中提到的范围是会话,但<jsp:useBean>
如何获取请求属性?如果它使用pageContext.findAttribute()
来获取属性,那么在<jsp:useBean>
标记中使用scope属性有什么用?
答案 0 :(得分:9)
PageContext#findAttribute()
分别扫描页面,请求,会话和应用程序范围,直到找到给定属性键的第一个非null
属性值。另请参阅javadoc:
在页面,请求,会话(如果有效)和应用程序范围
按顺序中搜索命名属性,并返回关联的值或null。
这解释了为什么它发现请求作用于转发servlet中的一个集合而不是JSP中声明的会话范围。这也在our EL wiki page中解释。
在任何情况下,如果您正在使用servlet,则不应对应该由servlet管理的模型对象使用<jsp:useBean>
。 <jsp:useBean>
遵循不同的MVC级别,当实际使用servlet作为控制器时,这只会导致混淆和维护问题。 our Servlets wiki page的“编码样式和建议”部分也明确提到了这一点。
所以,你可以这样做,而不是所有那些<jsp:xxx>
的东西:
<br>Name: ${person.name}
<br>Surname: ${person.surname}
您只需要添加JSTL <c:out>
以防止在重新显示用户控制的数据时潜在的XSS攻击漏洞(请注意<jsp:getProperty>
不会这样做!)
<br>Name: <c:out value="${person.name}" />
<br>Surname: <c:out value="${person.surname}" />
要了解有关JSTL的更多信息,请查看our JSTL wiki page。