我正在尝试在Spring Web MVC 3中开始使用会话范围的bean。我将此行放在我的调度程序配置中:
<bean id="userInfo" class="net.sandbox.sessionbeans.UserInfo" scope="session" />
这是net.sandbox.sessionbeans.UserInfo
:
package net.sandbox.sessionbeans;
public class UserInfo {
public String username;
public UserInfo() {
this.username = "Unregistered User";
}
}
如何在代表我的应用程序的View部分的JSP文件中访问会话范围的bean?我试过这个......
<p align="right">${userInfo.username}</p>
......但这没有给我预期的结果,即
<p align="right">Unregistered User</p>
相反,我得到了
<p align="right"></p>
我究竟做错了什么?
您可以在问题中显示它。问题可能出在您的配置中。看看你是否在视图中公开你的bean,如下所示:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
<property name="exposeContextBeansAsAttributes" value="true" />
</bean>
您可以使用Spring将单个bean公开给JSTL。
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="exposedContextBeanNames">
<list>
<value>someBean</value>
<value>someOtherBean</value>
</list>
</property>
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
这个答案部分基于一些建议,这些建议发布在问题的评论中,但后来被海报删除了。我将此添加到需要使用bean的每个JSP页面:
<jsp:useBean id="userInfo" scope="session" class="net.sandbox.sessionbeans.UserInfo" />
然后我找到了this article,详细说明了如何在JSP页面中使用bean。
你需要确保你拥有
<aop:scoped-proxy/>
在xml配置中启用。
例如:
<!-- an HTTP Session-scoped bean exposed as a proxy -->
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session">
<!-- this next element effects the proxying of the surrounding bean -->
<aop:scoped-proxy/>
</bean>
您可以在Spring参考指南“Bean scopes”一章中阅读更多相关内容。
详细说明@sinuhepop建议如下。
一个简单的方法是配置spring,以便将spring bean id作为varibales暴露给JSTL,这可以通过将exposeContextBeansAsAttributes属性设置为true来完成。
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="exposeContextBeansAsAttributes" value="true"/>
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
如果你有一个像这样配置的bean
@Component
@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS,value=WebApplicationContext.SCOPE_SESSION)
public class SomeBean {
}
然后在JSP页面中,您可以使用名称${someBean.someProp}
访问bean,因为这是Spring将自动分配给SomeBean的名称,除非使用诸如@Component("someName")
之类的名称定义bean,那么JSTL将是${someName.someProp}
对于那些想要使用Spring 5 Java配置的人来说,这个答案的更新。将此添加到您的WebMvcConfigurer
@Override
public void configureViewResolvers(ViewResolverRegistry registry){
InternalResourceViewResolver resolver = new InternalResourceViewResolver("/WEB-INF/view", ".jsp");
resolver.setExposeContextBeansAsAttributes(true);
registry.viewResolver(resolver);
}
等同于其他人提到的这个XML配置:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
<property name="exposeContextBeansAsAttributes" value="true" />
</bean>
请注意,注册表(registry.jsp(). ...
)的“方便”流畅API不能为您提供配置exposeContextBean....
属性的可能性。
如果可能,您应该考虑使用exposeContextBeanNames
。但是,尽可能为bean名称使用常量,以避免在代码中重复字符串文字。因此,可以在某个类中定义一个String Array,它收集所有这些常量并将它们公开给您的视图解析器。