Доступ к данным из сессионных компонентов в файлах JSP - PullRequest
5 голосов
/ 08 мая 2011

Я пытаюсь начать работу с bean-объектами в рамках сеанса в Spring Web MVC 3. Я добавил эту строку в конфигурацию диспетчера:

<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";
    }
}

Как я могу получить доступ к сессионным компонентам в файлах JSP, которые представляют часть View моего приложения? Я попробовал это ...

<p align="right">${userInfo.username}</p>

... но это не дало мне ожидаемого результата, т.е.

<p align="right">Unregistered User</p>

Вместо этого я просто получаю

<p align="right"></p>

Что я делаю не так?

Ответы [ 6 ]

11 голосов
/ 08 мая 2011

Вы можете сделать это, как показано в вашем вопросе. Проблема, вероятно, в вашей конфигурации. Посмотрите, выставляете ли вы ваши бины в виде, как это:

<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 голосов
/ 21 августа 2014

Вы можете выставить отдельные бины в JSTL с помощью Spring.

<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 голос
/ 14 мая 2012

Разработка предложения @sinuhepop ниже.

Простой способ сделать это - настроить Spring таким образом, чтобы он предоставлял идентификаторы bean-компонентов Spring в качестве переменных в 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>

Если ваш боб настроен так

@Component
@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS,value=WebApplicationContext.SCOPE_SESSION)
public class SomeBean {
}

Затем на странице JSP вы можете получить доступ к bean-компоненту, используя имя ${someBean.someProp}, потому что это имя, которое Spring будет автоматически назначать для SomeBean, если только bean-компонент не определен с именем, таким как @Component("someName"), тогда JSTL будет ${someName.someProp}

1 голос
/ 08 мая 2011

Вы должны убедиться, что у вас есть

<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».

1 голос
/ 08 мая 2011

Этот ответ частично основан на некоторых советах, которые были опубликованы в комментариях к вопросу, но позже были удалены автором. Я добавил это на каждую страницу JSP, которой нужно использовать bean-компонент:

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

Затем я нашел эту статью , подробно описывающую, как вы можете использовать bean-компоненты на странице JSP.

0 голосов
/ 02 марта 2018

Обновление этого ответа для тех, кто хочет использовать конфигурацию Java Spring 5.Добавление этого к вашему 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>

Обратите внимание, что «удобный» свободный API реестра (registry.jsp(). ...) не предлагает вам возможность настроить свойства exposeContextBean.....

Если возможно, вам следует рассмотреть возможность использования exposeContextBeanNames.Тем не менее, используйте как можно больше констант для имен ваших компонентов, чтобы избежать дублирования строковых литералов в вашем коде.Поэтому, возможно, определите String Array в некотором классе, который собирает все тезисные константы и предоставляет их вашему распознавателю представлений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...