Доступ к бобам Spring от представления Tiles (JSP)

В Spring MVC я могу получить доступ к своим бобам в JSP использование exposedContextBeanNames JstlView (или exposeContextBeansAsAttributes). Например, затем, в моем JSP я могу записать ($ {properties.myProperty). Но когда тот же JSP является частью представления мозаик, эти свойства не доступны. Возможно настроить Мозаики правильно или получить доступ к этим свойствам в другом отношении?

Я использую Spring MVC 3.0.2 и Мозаики 2.2.1. Вот немного моей конфигурации:

<bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="order" value="1"/>
    <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" />
</bean> 

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="order" value="2"/>
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
    <property name="exposedContextBeanNames">
        <list><value>properties</value></list>
    </property>
</bean>

Править: Я реализовал решение Skaffman.

TilesExposingBeansViewResolver.java:

package es.kcsolutions.util.spring.servlet.view;

import org.springframework.web.servlet.view.*;

public class TilesExposingBeansViewResolver extends UrlBasedViewResolver {

    private Boolean exposeContextBeansAsAttributes;
    private String[] exposedContextBeanNames;

    public void setExposeContextBeansAsAttributes(boolean exposeContextBeansAsAttributes) {
        this.exposeContextBeansAsAttributes = exposeContextBeansAsAttributes;
    }

    public void setExposedContextBeanNames(String[] exposedContextBeanNames) {
        this.exposedContextBeanNames = exposedContextBeanNames;
    }

    @Override
    protected AbstractUrlBasedView buildView(String viewName) throws Exception {
        AbstractUrlBasedView superView = super.buildView(viewName);
        if (superView instanceof TilesExposingBeansView) {
            TilesExposingBeansView view = (TilesExposingBeansView) superView;
            if (this.exposeContextBeansAsAttributes != null) view.setExposeContextBeansAsAttributes(this.exposeContextBeansAsAttributes);
            if (this.exposedContextBeanNames != null) view.setExposedContextBeanNames(this.exposedContextBeanNames);
        }
        return superView;
    }

}

TilesExposingBeansView.java:

package es.kcsolutions.util.spring.servlet.view;

import java.util.*;
import javax.servlet.http.*;
import org.springframework.web.context.support.ContextExposingHttpServletRequest;
import org.springframework.web.servlet.view.tiles2.TilesView;

public class TilesExposingBeansView extends TilesView {

    private boolean exposeContextBeansAsAttributes = false;
    private Set<String> exposedContextBeanNames;

    public void setExposeContextBeansAsAttributes(boolean exposeContextBeansAsAttributes) {
        this.exposeContextBeansAsAttributes = exposeContextBeansAsAttributes;
    }

    public void setExposedContextBeanNames(String[] exposedContextBeanNames) {
        this.exposedContextBeanNames = new HashSet<String>(Arrays.asList(exposedContextBeanNames));
    } 

    protected HttpServletRequest getRequestToExpose(HttpServletRequest originalRequest) {
        if (this.exposeContextBeansAsAttributes || this.exposedContextBeanNames != null) 
        return new ContextExposingHttpServletRequest(originalRequest, getWebApplicationContext(), this.exposedContextBeanNames);
        return originalRequest;
    }

    @Override
    protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
        HttpServletRequest requestToExpose = getRequestToExpose(request);
        exposeModelAsRequestAttributes(model, requestToExpose);
        super.renderMergedOutputModel(model, requestToExpose, response);
    }

}

Конфигурация Spring:

    <bean id="tilesViewResolver" class="es.kcsolutions.util.spring.servlet.view.TilesExposingBeansViewResolver">
        <property name="order" value="1"/>
        <property name="viewClass" value="es.kcsolutions.util.spring.servlet.view.TilesExposingBeansView"/>
        <property name="exposedContextBeanNames">
            <list><value>properties</value></list>
        </property>
    </bean> 

Если Вы имеете некоторую проблему, смотрите на TilesExposingBeansView.renderMergedOutputModel. Я сделал некоторые тесты, но возможно необходимо сделать намного больше.

19
задан sinuhepop 17 May 2010 в 12:50
поделиться

1 ответ

Как вы заметили, эта функциональность является частью InternalResourceViewResolver и InternalResourceView, тогда как материал Tiles наследуется непосредственно от UrlBasedViewResolver и AbstractUrlBasedView, поэтому вы не можете его использовать.

Если посмотреть на код, то нет причин, почему эти вещи нельзя было поместить в AbstractUrlBasedView. Магия происходит в InternalResourceView.getRequestToExpose, и она выглядит вполне применимой и к AbstractUrlBasedView.

В краткосрочной перспективе я предлагаю создать подклассы UrlBasedViewResolver и TilesView, копируя getRequestToExpose из InternalResourceView. В более долгосрочной перспективе я рекомендую вам обратиться в SpringSource с просьбой переместить эту функциональность вверх по иерархии классов в AbstractUrlBasedView, сделав ее более широко доступной.

12
ответ дан 30 November 2019 в 04:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: