代码之家  ›  专栏  ›  技术社区  ›  sinuhepop

从Tiles视图(JSP)访问SpringBean

  •  19
  • sinuhepop  · 技术社区  · 14 年前

    在SpringMVC中,我可以使用JSTLVIEW的ExposeContextBeannames(或ExposeContextBeansAttributes)访问JSP中的bean。例如,在我的JSP中,我可以编写($properties.myproperty)。但是当相同的JSP是tiles视图的一部分时,这些属性是不可访问的。是否可以正确配置磁贴或以其他方式访问这些属性?

    我使用的是SpringMVC 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>
    

    编辑: 我已经实现了斯卡夫曼的解决方案。

    tileExposingBeansView解析器.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;
        }
    
    }
    

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

    如果您有问题,请查看tileexposingbeansview.rendermergedoutmodel。我做了一些测试,但也许有必要做更多的测试。

    3 回复  |  直到 11 年前
        1
  •  12
  •   skaffman    14 年前

    正如您所注意到的,此功能是 InternalResourceViewResolver InternalResourceView 而Tiles则直接继承自 UrlBasedViewResolver AbstractUrlBasedView 所以你不能利用它。

    看看代码,没有理由不把这些东西放进去 摘要基本视图 . 魔法发生在 InternalResourceView.getRequestToExpose 它看起来非常适用于 摘要基本视图 也是。

    在短期内,我建议子类化 UrlBasedView分解器 TilesView 复制 getRequestToExpose 来自于 内部资源视图 . 从长远来看,我鼓励你向 SpringSource 要求他们将此功能向上移动到类层次结构中 摘要基本视图 使其更广泛地提供。

        2
  •  13
  •   francarl    11 年前

    你试过用吗 servletcontextattributeexporter 在XML配置文件中?

    <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>
    
        3
  •  1
  •   Brian    12 年前

    从弹簧3.0开始,现在 TilesViewResolver .

    支持tilesView的urlbasedView解析器的便利子类 (即瓷砖定义)及其自定义子类。

    此冲突解决程序生成的所有视图的视图类可以是 通过“ViewClass”属性指定。请参阅urlbasedview解析器 JavaDoc了解详细信息。

    注意:链接viewresolver时,tilesviewresolver将检查 存在指定的模板资源,并且只返回 如果实际找到模板,则为非空视图对象。

    因为: 3.0作者:Juergen Hoeller