jsp:useBean范围

NIN*_*OOP 2 java jsp session-variables request 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"/>
Run Code Online (Sandbox Code Playgroud)

虽然我在request范围内设置了java对象,而不是在sessionController Servlet 中的范围内,我将请求转发给此Servlet.<jsp:useBean>虽然标记中提到的范围是会话,但如何获取请求属性?如果它用于pageContext.findAttribute()获取属性,那么在该<jsp:useBean>标记中使用scope属性有什么用?

Bal*_*usC 9

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

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

这就解释了为什么它发现请求作用于转发servlet中的一个集合而不是JSP中声明的会话范围.我们的EL维基页面也对此进行了解释.

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

所以,<jsp:xxx>你可以这样做,而不是所有这些事情:

<br>Name: ${person.name}
<br>Surname: ${person.surname}
Run Code Online (Sandbox Code Playgroud)

您只需要添加JSTL <c:out>以防止在重新显示用户控制的数据时潜在的XSS攻击漏洞(请注意,<jsp:getProperty>这样做不会!)

<br>Name: <c:out value="${person.name}" />
<br>Surname: <c:out value="${person.surname}" />
Run Code Online (Sandbox Code Playgroud)

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

  • 它在指定的order-request-session-application命令中搜索范围,直到找到第一个非null值.因此,如果您使用`<jsp:useBean scope ="page">``那么`$ {person}`它将返回页面范围中的那个而不是servlet设置的请求范围中的那个.请注意,您实际上最终得到了2个完全独立的`Person`对象实例(一个由servlet创建,另一个由`jsp:useBean`创建),而不仅仅是一个.你需要servlet设置的那个,所以`jsp:useBean` mess是完全没必要的. (2认同)