2012-07-18 269 views
1

我有Spring MVC項目,我想在使用Apache Tiles的應用程序中構建視圖。我已經添加了一些依賴到我的pom.xml文件。我想知道我有太多的東西,但是我有一些關於缺少類的例外,所以我在一些包中找到它們並將它們添加到classpath中。如何在Spring MVC中正確配置TilesViewResolver?

<!-- Tiles --> 
    <dependency> 
     <groupId>org.apache.tiles</groupId> 
     <artifactId>tiles-extras</artifactId> 
     <version>2.2.2</version> 
    </dependency>   
    <dependency> 
     <groupId>org.apache.tiles</groupId> 
     <artifactId>tiles-jsp</artifactId> 
     <version>2.2.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.tiles</groupId> 
     <artifactId>tiles-core</artifactId> 
     <version>2.2.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.tiles</groupId> 
     <artifactId>tiles-servlet</artifactId> 
     <version>2.1.4</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-digester3</artifactId> 
     <version>3.2</version> 
     <classifier>with-deps</classifier> 
    </dependency> 
    <dependency> 
     <groupId>commons-beanutils</groupId> 
     <artifactId>commons-beanutils</artifactId> 
     <version>1.8.3</version> 
    </dependency> 

這是我在調度Servlet上下文ViewResolvers配置。我想知道如何正確配置它們在一起。

<beans:bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"> 
    <beans:property name="definitions"> 
     <beans:list> 
      <beans:value>/WEB-INF/tiles-definitions.xml</beans:value> 
     </beans:list> 
    </beans:property> 
</beans:bean> 

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

<beans:bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <beans:property name="prefix" value="/WEB-INF/views/" /> 
    <beans:property name="suffix" value=".jsp" /> 
    <beans:property name="order" value="1" /> 
</beans:bean> 

我已閱讀此問題和答案:How to use multiple ViewResolvers in Spring?但它對我沒有幫助。在這一刻上面的配置jsp意見工作正常,但瓷磚地址我得到HTTP Status 404

編輯

這是我的控制器。與「家」連接的視圖正在工作,但其他 - 瓷磚不工作。

@RequestMapping(value = "/", method = RequestMethod.GET) 
public String home(Locale locale, Model model) {   
    return "home"; 
} 

@RequestMapping(value = "/pets", method = RequestMethod.GET) 
public String pets(Locale locale, Model model) { 
    return "pets-tiles"; 
} 

@RequestMapping(value = "/dogs", method = RequestMethod.GET) 
public String dogs(Locale locale, Model model) { 
    return "dogs-tiles"; 
} 

@RequestMapping(value = "/cats", method = RequestMethod.GET) 
public String cats(Locale locale, Model model) { 
    return "cats-tiles"; 
} 

這是我tiles-definitions.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE tiles-definitions PUBLIC 
    "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN" 
    "http://tiles.apache.org/dtds/tiles-config_2_0.dtd"> 
<tiles-definitions> 

    <definition name="template-main" template="/WEB-INF/views/layouts/main.jsp"> 
    <put-attribute name="banner-content" value="/WEB-INF/views/sections/banner.jsp" /> 
    <put-attribute name="title-content" value="Pet Type" /> 
    <put-attribute name="primary-content" value="" /> 
    <put-attribute name="footer-content" value="/WEB-INF/views/sections/footer.jsp" /> 
    </definition> 

    <definition name="template-detail" template="/WEB-INF/views/layouts/detail.jsp"> 
    <put-attribute name="banner-content" value="/WEB-INF/views/sections/banner.jsp" /> 
    <put-attribute name="title-content" value="Pet Type" /> 
    <put-attribute name="subtitle-content" value="" /> 
    <put-attribute name="primary-content" value="" /> 
    <put-attribute name="footer-content" value="/WEB-INF/views/sections/footer.jsp" /> 
    </definition> 

    <definition name="pet-tiles" extends="template-main"> 
    <put-attribute name="primary-content" value="/WEB-INF/views/contents/pets.jsp" /> 
    </definition> 

    <definition name="dog-tiles" extends="template-detail"> 
    <put-attribute name="subtitle-content" value="Canines" /> 
    <put-attribute name="primary-content" value="/WEB-INF/views/contents/dogs.jsp" /> 
    </definition> 

    <definition name="cat-tiles" extends="template-detail"> 
    <put-attribute name="subtitle-content" value="Felines" /> 
    <put-attribute name="primary-content" value="/WEB-INF/views/contents/cats.jsp" /> 
    </definition> 

</tiles-definitions> 

他們來自本教程:http://krams915.blogspot.com/2010/12/spring-mvc-3-tiles-2-integration.html但不是爲我工作。

+0

你可以發佈你的Tiles配置文件和控制器類的一些代碼嗎? – davioooh 2012-07-18 14:35:24

+0

我剛剛編輯了我的問題。你能看看嗎? – woyaru 2012-07-19 06:38:03

回答

1

我解決了我的問題。我不知道爲什麼它不起作用,但在這一刻,一切似乎都沒有問題。

我發現從這個網址實現AutoTilesView類:http://forum.springsource.org/showthread.php?78312-Spring-MVC-Noob-help-with-site-templates

爲什麼默認TilesView不能正常工作? AutoTilesView類的樣子:

public class AutoTilesView extends TilesView { 

private static final String PREFIX = "/WEB-INF/views/"; 
private static final String SUFFIX = ".jsp"; 

@Override 
protected void renderMergedOutputModel(Map<String, Object> model, 
     HttpServletRequest request, HttpServletResponse response) 
     throws Exception { 

    ServletContext servletContext = getServletContext(); 
    TilesContainer container = ServletUtil.getContainer(servletContext); 

    if (container == null) { 
     throw new ServletException("Tiles container is not initialized. " + 
       "Have you added a TilesConfigurer to your web application context?"); 
    } 

    AttributeContext attributeContext = container.getAttributeContext(request, response); 

    StringBuilder builder = new StringBuilder(); 
    builder.append(PREFIX); 
    builder.append(this.getUrl()); 
    builder.append(SUFFIX);  

    attributeContext.putAttribute("body", Attribute.createTemplateAttribute(builder.toString())); 

    super.renderMergedOutputModel(model, request, response); 
} 
} 

這是從我的Serlvet調度上下文代碼:

<beans:bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"> 
    <beans:property name="definitions"> 
     <beans:list> 
      <beans:value>/WEB-INF/tiles-definitions.xml</beans:value> 
     </beans:list> 
    </beans:property> 
</beans:bean> 

<beans:bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
    <beans:property name="viewClass" value="cos.tam.AutoTilesView" /> 
</beans:bean> 

我已刪除org.springframework.web.servlet.view.InternalResourceViewResolver

+1

這是Tiles 2.2.2的解決方案。我想知道如何爲Tiles 3.0。 – woyaru 2012-07-20 06:39:54