2

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"/>

尽管我将 java 对象设置在request范围内,而不是在session控制器 Servlet 的范围内,但我将请求转发到该 Servlet 的范围内。尽管标签中提到的范围是会话,但如何<jsp:useBean>获取请求属性?如果它用于pageContext.findAttribute()获取属性,那么在该<jsp:useBean>标记中具有范围属性有什么用?

4

1 回答 1

11

PageContext#findAttribute()分别扫描页面、请求、会话和应用程序范围,直到找到给定属性键的第一个非属性null值。另请参阅javadoc

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

这就解释了为什么它在转发 servlet 中发现请求范围为一组,而不是在 JSP 中声明的会话范围为一组。这也在我们的 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}" />

要了解有关 JSTL 的更多信息,请查看我们的 JSTL wiki 页面

于 2013-01-29T16:57:04.453 回答