Spring 4.2.2 and apache tiles 3.0.5 整合
阿新 • • 發佈:2018-12-30
記錄 Spring 4.2.2 整合 apache tiles 3.0.5 的步驟
- pom.xml
<dependency> <groupId>org.apache.tiles</groupId> <artifactId>tiles-extras</artifactId> <version>3.0.5</version> </dependency>
- web.xml
<listener> <listener-class>org.apache.tiles.extras.complete.CompleteAutoloadTilesListener</listener-class> </listener>
<servlet> <servlet-name>Tiles Dispatch Servlet</servlet-name> <servlet-class>org.apache.tiles.web.util.TilesDispatchServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Tiles Dispatch Servlet</servlet-name> <url-pattern>*.tiles</url-pattern> </servlet-mapping>
- Spring 配置
<!-- 自動將靜態資源導向 --> <!-- <mvc:resources mapping="/resources/**" location="/resources/" /> --> <!-- Order 的意義:意思是說,當有多個 view resovler 的時候,按照 order 的數字大小,由小到大依次解析;很關鍵 --> <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.tiles3.TilesViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView"></property> <property name="order" value="0"></property> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> <property name="order" value="1"></property> </bean> <!-- 又是一個坑,Spring 4.2.2 預設啟動時不會初始化 bean,而之前 3.x 會自動初始化, 所以這裡需要設定 lazy-init="false",讓 TilesConfigurer 在 Spring 容器啟動時就初始化,否則,titlesConfigurer 載入 definitions 失敗 --> <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer" lazy-init="false"> <property name="definitions"> <list> <value>/WEB-INF/layout/layouts.xml</value> <value>/WEB-INF/layout/views.xml</value> </list> </property> <property name="preparerFactoryClass" value="org.springframework.web.servlet.view.tiles3.SpringBeanPreparerFactory" /> </bean>
- 工程目錄
- layouts.xml
<tiles-definitions> <definition name="education.default_template" template="/WEB-INF/views/education/common/template.jsp"> <put-attribute name="title" value="education tutorial homepage" /> <put-attribute name="header" value="/WEB-INF/views/education/common/header.jsp" /> <put-attribute name="menu" value="/WEB-INF/views/education/common/menu.jsp" /> <!-- remain the body as blank, let its inheritance to fill it up --> <put-attribute name="body" value="" /> <put-attribute name="footer" value="/WEB-INF/views/education/common/footer.jsp" /> </definition> </tiles-definitions>
> template.jsp
模板檔案
> title, menu, header, body, footer 全部是用來填充 template.jsp 的
> 因為 body 未填充,所以 education.default_template 是抽象模板,可以被繼承模板實現 - views.xml 子模板
<tiles-definitions> <!-- defined for education --> <definition name="education_spittle_home" extends="education.default_template"> <put-attribute name="body" value="/WEB-INF/views/education/home_body.jsp" /> </definition> <definition name="education_spittle_view" extends="education.default_template"> <put-attribute name="body" value="/WEB-INF/views/education/view.jsp" /> </definition> <!-- defined for education --> </tiles-definitions>
- Controller
然後,瀏覽器可以直接通過 http://localhost:8080/home 訪問模板頁面。@RequestMapping("/home") public String home(){ // by using TilesView to render this page. the full template path should be education_spittle_home.tiles. return "education_spittle_home"; }
- 坑,
中文亂碼,在 template.jsp 中設定了 UTF-8,結果內容顯示還是亂碼,後來發現,在每一個模板檔案中,比如 header.jsp, menu.jsp, body.jsp 還有 footer.jsp 中,都要新增如下程式碼
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>