Доступ к бинам Spring MVC DI из jsp - PullRequest
13 голосов
/ 15 января 2010

В некоторых средах MVC вы можете вызывать действие контроллера из представления, если вы хотите выполнить некоторый код и визуализировать некоторое частичное представление. Я не уверен, как правильно сделать это в Spring MVC

Я хочу иметь набор шаблонов JSP. Некоторые из них будут макетами страниц, некоторые из них будут небольшими компонентами, такими как paginator, окно входа в систему, меню, облако тегов и т. Д. И т. Д. И т. Д. Каждый из этих компонентов нуждается в некоторых bean-компонентах или контроллере для установки некоторых данных во ViewAndModel, чтобы представление могло использовать их .

Проблема в том, что я не хочу устанавливать все эти объекты в каждом вызове. Мой контроллер реестра заботится только об обработке регистрации. Итак, как мне это сделать правильно? Как вызвать DI-компоненты или контроллеры из представления для подготовки частичных представлений? Или я должен создать некоторые сопоставления? Или я подхожу к проблеме с совершенно неправильного ракурса?

Ответы [ 5 ]

38 голосов
/ 15 января 2010

Spring-MVC может представить бины контекста приложения на уровне представления, если это то, что вы хотите сделать.

Например, InternalResourceViewResolver может быть проинструктирован выставлять каждый компонент в контексте или только определенные. Посмотрите на свойства exposeContextBeansAsAttributes и ctedContextBeanNames .

Например, скажем, вы хотели представить бины beanA и beanB вашим JSP. Вы бы объявили распознаватель вида в вашем контексте следующим образом:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
   <property name="exposedContextBeanNames">
      <list>
         <value>beanA</value>
         <value>beanB</value>
      </list>
   </property>
</bean>

Либо просто выставить каждый боб:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
   <property name="exposeContextBeansAsAttributes" value="true"/>
</bean>

Является ли это хорошей идеей, это другой вопрос, но Spring даёт вам возможность.

5 голосов
/ 29 сентября 2011

IMO добавить использование visibleContextBeanNames в конфигурации bean-компонента viewResolver (также есть возможность использовать глобальный флаг, но это не рекомендуется)

<bean id="viewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="exposedContextBeanNames">
 <list>
  <value>beanName</value>
 </list>

использовать в вашем JSP

${beanName.property}
3 голосов
/ 01 сентября 2014

Вы можете использовать spring:eval тег:

...
<spring:eval expression="@properties.getProperty('myProp')" var="myProp" />
${myProp}
...

Где @properties - это имя компонента ваших свойств в Spring Context. Обратите внимание, что этот подход не использует exposedContextBeanNames, поэтому он может использоваться, например, с Tiles Views (TilesViewResolver не имеет такой возможности).

3 голосов
/ 13 сентября 2013

Важной частью использования InternalResourceViewResolver, по-видимому, является то, что Spring должен быть включен в поток кода при обработке страницы jsp. Если вы обращаетесь к странице jsp напрямую или иным образом, минуя какое-либо действие на основе Spring (например, возможно, путем внутренней переадресации на страницу jsp из-за конфигурации входа в систему в web.xml), это не будет работать.

Тем не менее, можно настроить ваше приложение так, чтобы определенные bean-компоненты были доступны для всего, что может попасть в ServletContext (он же applicationScope) через использование класса ServletContextAttributeExporter .

В вашей конфигурации пружины добавьте:

<bean id="mybean" .../>
<bean class="org.springframework.web.context.support.ServletContextAttributeExporter">
    <property name="attributes">
        <map>
            <entry key="attrname" value-ref="mybean"/>
        </map>
    </property>
</bean>

Затем на странице JSP вы можете получить доступ к этому бину с помощью:

${applicationScope.attrname}

или если вы знаете, что у вас нет атрибута "attrname" в более конкретной области, просто:

${attrname}

Очевидно, что это не сможет ссылаться на bean-компоненты области запроса или сеанса, но если вам нужен доступ к одноэлементному bean-компоненту, он прекрасно работает.

0 голосов
/ 15 января 2010

Никогда не обращайтесь к бизнес-компонентам из представлений jsp; что-то вроде sitemesh можно использовать для объединения нескольких видов в одно. Jsps также не должен вызывать методы контроллера напрямую

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