一尘不染

jsp:useBean范围

jsp

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


阅读 311

收藏
2020-06-08

共1个答案

一尘不染

PageContext#findAttribute()分别在页,请求,会话和应用范围,直到第一非扫描null属性值被发现,对于给定的属性键。另请参阅javadoc

在页面,请求,会话(如果有效)和应用程序范围内 按顺序 搜索命名属性,并返回关联的值或null。

这就解释了为什么它在转发servlet中找到范围为1的请求,而不是在JSP中声明范围为1的会话。我们的EL
Wiki页面也对此进行了说明。

无论如何,如果您使用的是servlet,则不应<jsp:useBean>在应该由servlet管理的模型对象上使用。将<jsp:useBean>分别遵循不同的MVC水平实际使用servlet作为控制器时,这只会导致混乱和维护的麻烦。在Servlets Wiki页面的“编码样式和建议”部分中也明确提到了这一点。

因此,除了所有这些<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}" />
2020-06-08