Java 从Tiles视图(JSP)访问springbean

Java 从Tiles视图(JSP)访问springbean,java,spring,jsp,spring-mvc,tiles,Java,Spring,Jsp,Spring Mvc,Tiles,在SpringMVC中,我可以使用JstlView的exposedContextBeanNames(或ExposeContextBeanSatAttribute)访问JSP中的bean。例如,我可以在我的JSP中写入(${properties.myProperty)。但是当同一个JSP是tiles视图的一部分时,这些属性是不可访问的。是否可以正确配置tiles或以其他方式访问这些属性 我正在使用Spring MVC 3.0.2和Tiles 2.2.1。下面是我的一些配置: <bean id

在SpringMVC中,我可以使用JstlView的exposedContextBeanNames(或ExposeContextBeanSatAttribute)访问JSP中的bean。例如,我可以在我的JSP中写入(${properties.myProperty)。但是当同一个JSP是tiles视图的一部分时,这些属性是不可访问的。是否可以正确配置tiles或以其他方式访问这些属性

我正在使用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>
    <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.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);
    }

}
包es.kcsolutions.util.spring.servlet.view;
导入java.util.*;
导入javax.servlet.http.*;
导入org.springframework.web.context.support.ContextExposingTPServletRequest;
导入org.springframework.web.servlet.view.tiles2.TilesView;
公共类TileExposingBeansView扩展了TileView{
私有布尔值exposeContextBeanSatAttributes=false;
私有集exposedContextBeanNames;
public void setExposeContextBeanSatAttribute(布尔ExposeContextBeanSatAttribute){
this.exposeContextBeanSasatributes=exposeContextBeanSasatributes;
}
public void setExposedContextBeanNames(字符串[]exposedContextBeanNames){
this.exposedContextBeanNames=新哈希集(Arrays.asList(exposedContextBeanNames));
} 
受保护的HttpServletRequest getRequestToExpose(HttpServletRequest原始请求){
if(this.exposeContextBeanSatAttributes | | this.exposedContextBeanNames!=null)
返回新的ContextExposingttpServletRequest(originalRequest,getWebApplicationContext(),this.exposedContextBeanNames);
返回原始请求;
}
@凌驾
受保护的void RenderMergeDoutpModel(映射模型、HttpServletRequest请求、HttpServletResponse响应)引发异常{
HttpServletRequestToExpose=getRequestToExpose(请求);
exposeModelAsRequestAttributes(model,requestToExpose);
renderMergedOutputModel(model、requestToExpose、response);
}
}
弹簧配置:

<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>
    <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.renderMergedOutputModel。我已经做了一些测试,但可能需要做更多的测试。

正如您所注意到的,此功能是
InternalResourceViewResolver
InternalResourceView
的一部分,而Tiles内容直接从
U继承rlBasedViewResolver
AbstractUrlBasedView
,因此您无法使用它

看看代码,没有理由不把这些东西放到
AbstractUrlBasedView
中。魔法发生在
InternalResourceView.getRequestToExpose
中,它看起来也完全适用于
AbstractUrlBasedView


短期内,我建议将
UrlBasedViewResolver
TilesView
子类化,从
InternalResourceView
复制
getRequestToExpose
内容。从长期来看,我建议您提出一个问题,要求他们将此功能从类层次结构向上移动到
AbstractUrlBasedView,使其更广泛地可用。

从Spring 3.0开始,现在有了一个新版本

支持TileView的UrlBasedViewResolver的便利子类 (即瓷砖定义)及其自定义子类

此解析器生成的所有视图的视图类可以是 通过“viewClass”属性指定。请参阅UrlBasedViewResolver的 javadoc获取详细信息

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

自: 3.0作者:Juergen Hoeller

您是否尝试在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>


你在谷歌上搜索过spring tiles集成吗?是的,我在谷歌上搜索过。我在以前的版本中遇到了一些问题,但现在一切正常,除了这个问题。我搜索了它,但什么也没找到:(老兄,spring和apache必须为此给你写一份检查单;)很好的工作我尝试过类似的方法,但不起作用。我已经对JstlView进行了子类化,覆盖了initServletContext、checkResource和renderMergedOutputModel。我现在就试试你的想法。@Sinuhe:
JstlView
与Tile不兼容,机制根本不同。好吧,你的解决方案起作用了!我在做这件事的时候,我注意到我之前的想法不正确。在向SpringSource提交问题之前,我已经尝试了一点。谢谢!@skaffman您对“ServletContextAttributeExporter”有什么看法?我们不应该使用“ServletContextAttributeExporter”而不是扩展UrlBasedViewResolver的功能吗?直到ViewResolver无法像我一样解决问题在不添加exposedContextBeanNames属性的情况下,对UrlBasedViewResolver进行子类化。原始帖子和接受的答案仍然是获得成功的最佳方法。我使用它是因为它更易于实现。当然,这是添加会话bean的更优雅、更不引人注目的方法!我正要扩展Spring类,您的解决方案保存了我这几天的工作!谢谢!