jsp:useBean范围

时间:2013-01-29 09:04:19

标签: java jsp request session-variables usebean

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属性有什么用?

1 个答案:

答案 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