19

Spring MVC では、JstlView のexposedContextBeanNames (またはexposeContextBeansAsAttributes) を使用して、JSP で自分の Bean にアクセスできます。たとえば、私の JSP では (${properties.myProperty) と書くことができます。ただし、同じ JSP がタイル ビューの一部である場合、これらのプロパティにはアクセスできません。タイルを適切に構成したり、別の方法でこれらのプロパティにアクセスしたりすることはできますか?

Spring MVC 3.0.2 と Tiles 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;
    }

}

TilesExposedBeansView.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);
    }

}

春の構成:

    <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 を見てください。いくつかのテストを行いましたが、もっと多くのことを行う必要があるかもしれません。

4

3 に答える 3

13

xml 構成ファイルでServletContextAttributeExporterを使用しようとしましたか?

<bean
    class="org.springframework.web.context.support.ServletContextAttributeExporter">
    <property name="attributes">
        <map>
            <entry key="<bean key here>">
                <ref bean="<bean name here" />
            </entry>
        </map>
    </property>
</bean>
于 2013-07-08T14:40:49.910 に答える
12

お気づきのように、この機能はInternalResourceViewResolverandの一部ですInternalResourceViewが、Tiles はUrlBasedViewResolverandから直接継承されるAbstractUrlBasedViewため、利用することはできません。

コードを見ると、このようなものを に入れられなかった理由はありませんAbstractUrlBasedView。魔法は で起こり、にもInternalResourceView.getRequestToExpose完全に適用できるように見えAbstractUrlBasedViewます。

短期的には、 をサブクラスUrlBasedViewResolver化しTilesView、 からコピーすることをお勧めgetRequestToExposeInternalResourceViewます。長期的には、SpringSourceに問題を提出して、この機能をクラス階層の上位に移動しAbstractUrlBasedView、より広く利用できるようにするよう依頼することをお勧めします。

于 2010-05-17T11:14:17.150 に答える
1

Spring 3.0 の時点で、TilesViewResolverが追加されました。

TilesView (つまり、Tiles 定義) とそのカスタム サブクラスをサポートする UrlBasedViewResolver の便利なサブクラス。

このリゾルバーによって生成されるすべてのビューのビュー クラスは、「viewClass」プロパティを介して指定できます。詳細については、UrlBasedViewResolver の javadoc を参照してください。

注: ViewResolver をチェーンする場合、TilesViewResolver は、指定されたテンプレート リソースの存在を確認し、テンプレートが実際に見つかった場合にのみ、null 以外の View オブジェクトを返します。

以来: 3.0 著者: Juergen Hoeller

于 2012-03-18T02:56:25.230 に答える