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

问题描述 投票:5回答:6

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

我究竟做错了什么?

spring jsp spring-mvc
6个回答
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>

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>

1
投票

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

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

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


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


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}


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,它收集所有这些常量并将它们公开给您的视图解析器。

© www.soinside.com 2019 - 2024. All rights reserved.