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作用域中设置了java对象,从那里我将请求转发到此Servlet。尽管标记中提到的作用域是session,但<jsp:useBean>如何获得请求属性?如果它使用pageContext.findAttribute()来获取属性,那么在那个<jsp:useBean>标记中使用scope属性有什么用呢?
发布于 2013-01-30 00:57:04
PageContext#findAttribute()分别扫描页面、请求、会话和应用程序范围,直到找到给定属性键的第一个非null属性值。另请参阅javadoc
在or 中的页面、请求、会话(如果有效)和应用程序范围中搜索命名属性,并返回值关联或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>攻击漏洞(请注意,<jsp:getProperty>不会这样做!)
<br>Name: <c:out value="${person.name}" />
<br>Surname: <c:out value="${person.surname}" />要了解有关JSTL的更多信息,请查看our JSTL wiki page。
https://stackoverflow.com/questions/14579121
复制相似问题