从JSP文件中的会话范围bean访问数据

时间:2011-05-08 09:38:23

标签: spring jsp spring-mvc

我正在尝试在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>

我做错了什么?

6 个答案:

答案 0 :(得分:11)

您可以在问题中显示。问题可能出在您的配置中。看看你是否在视图中公开你的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>

答案 1 :(得分:2)

您可以使用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>

答案 2 :(得分:1)

这个答案部分基于问题评论中发布的一些建议,但后来被海报删除了。我将此添加到需要使用bean的每个JSP页面:

<jsp:useBean id="userInfo" scope="session" class="net.sandbox.sessionbeans.UserInfo" />

然后我发现this article详细说明了如何在JSP页面中使用bean。

答案 3 :(得分:1)

你需要确保你有

<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范围”一章中阅读更多相关内容。

答案 4 :(得分:1)

详细阐述@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}

答案 5 :(得分:0)

对于那些想要使用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,它收集所有这些常量并将它们公开给你的视图解析器。