Как получить атрибут модели или боб весны в декораторе ситеш? - PullRequest
8 голосов
/ 17 октября 2010

Я использую Spring 3 с sitemesh.Я хотел бы сослаться на bean-компонент контекста Spring на странице декоратора, определенной в sitemesh.

Проблема в том, что фильтр SiteMesh работает вне контекста Spring, поэтому объект запроса на странице jsp декоратора sitemesh является собственным HttpServletRequest, а не оболочкойполезные функции для доступа к контексту и т. д.

Есть ли способ как-то настроить Spring и Sitemesh для доступа к контексту Spring на странице декоратора?

Ответы [ 4 ]

3 голосов
/ 04 января 2013

У меня была та же проблема, и я решил свою проблему с помощью фильтра.Я создал фильтр среды, который я мог бы использовать для установки данных среды для всех запросов.Автоматически связывайте bean-компонент, к которому у вас должен быть доступ, тоже в фильтре.

@Component
public class EnvironmentFilter extends OncePerRequestFilter {

    @Autowired
    Object bean;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

        request.setAttribute("bean", bean); // add bean or just specific properties of bean.

        filterChain.doFilter(request, response);

    }

}

Сконфигурируйте фильтр в web.xml, обязательно используйте тот же шаблон для сопоставления фильтра, что и для фильтра Sitemesh.

<filter>
    <filter-name>environmentFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>environmentFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Атрибуты, установленные в вашем фильтре, теперь доступны на странице вашего декоратора.

0 голосов
/ 03 мая 2013

Я решил эту проблему, переопределив фильтр sitemesh:

@Component
class SitemeshSpringFilter extends PageFilter implements ApplicationContextAware {
    ApplicationContext applicationContext;

    @Override
    public void doFilter(ServletRequest rq, ServletResponse rs,
            FilterChain chain) throws IOException, ServletException {
        def newRq = new ContextExposingHttpServletRequest(
                rq, getApplicationContext(), null);

        super.doFilter(newRq, rs, chain);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
    throws BeansException {
        this.applicationContext = applicationContext;
    }
}

В файле web.xml объявите этот фильтр:

<filter>
    <filter-name>sitemeshSpringFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
        <param-name>targetFilterLifecycle</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>sitemeshSpringFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Теперь фильтр sitemesh будет использовать ContextExposingHttpServletRequest вместо обычногозапрос.

0 голосов
/ 17 августа 2011

Я не знаю, как сделать то, что вы просите, но есть и другая альтернатива. Вы можете объявить HttpServletRequest в параметрах метода вашего контроллера. Просто поместите объекты модели по запросу, если они должны быть доступны для Sitemesh. Код JSP выглядит точно так же, независимо от того, является ли контекст поддержки запросом сервлета или моделью Spring MVC.

0 голосов
/ 06 апреля 2011

Начните с создания синглтона для чего угодно, я просто устанавливаю строку, но любой класс будет работать:

public class MySiteEnvironment {

    private String someConfigurationParameter;

    public String getSomeConfigurationParameter() {
        return someConfigurationParameter;
    }

    public void setSomeConfigurationParameter(String someConfigurationParameter) {
        this.someConfigurationParameter = someConfigurationParameter;
    }

    /* SINGLETON */
    private static final MySiteEnvironment INSTANCE = new MySiteEnvironment();

    private MySiteEnvironment() {
    }

    public static MySiteEnvironment getInstance() {
        return INSTANCE;
    }
}

Далее вам нужно ввести значение:

<bean id="mySiteEnvironment" class="MySiteEnvironment" factory-method="getInstance">
        <property name="someConfigurationParameter" value="myValueOrBean"/>
    </bean>

Наконец, вы получаете к нему доступ:

<%@ page import="MySiteEnvironment" %>
<% pageContext.setAttribute("env", MySiteEnvironment.getInstance()); %> 

Теперь вы можете использовать язык выражений для доступа к среде

...