首先,我们定义一个总体的tiles视图 /tiles/mainTemplate.jsp 首先使用:<tiles:getAsString name="title"/>打印tiles配置文件中定义的字符串属性title 然后是分别加载header,content,footer三个jsp页面,共同组成mainTemplate.jsp
<% ... @ taglib uri = " http://jakarta.apache.org/struts/tags-tiles " prefix = " tiles " %> < html > < head > < title >< tiles:getAsString name ="title" /></ title > </ head > < body > the title is:< tiles:getAsString name ="title" />< br > < tiles:insert name ="header" />< br > < tiles:insert name ="content" />< br > < tiles:insert name ="footer" />< br > </ body > </ html >
header.content.footer页面如下:
< html > < head > </ head > < body > this is from header</ body > </ html > < html > < head > </ head > < body > this is from content</ body > </ html > < html > < head > </ head > < body > this is from footer</ body > </ html >
Spring MVC 控制类:
package Action; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import model.Student; import org.springframework.validation.BindException; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractCommandController; public class TilesHomeController extends AbstractCommandController ... { protected ModelAndView handle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, BindException arg3) throws Exception ... { return null ; } protected ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception ... { return new ModelAndView( " courseDetail " , "" , "" ); } }
当我们运行上面这个控制器时候,系统会自动去寻找courseDetail.jsp这个文件,但我们还没有定义这个文件,所以,我们要这样写tiles-def.xml
<! DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration//EN" "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd" > < tiles-definitions > < definition name ="template" page ="/tiles/mainTemplate.jsp" > < put name ="title" value ="default title" /> < put name ="header" value ="=" /tiles/header.jsp" /> < put name ="content" value ="/tiles/content.jsp" /> < put name ="footer" value ="/tiles/footer.jsp" /> </ definition > <!-- -以courseDetail命名的配置,覆盖了模板中的title和content对应的页面-> <definition name="courseDetail" extends="template"> <put name="title" value="courseDetail title"/> <put name="content" value="/tiles/courseContent.jsp"/> </definition> </tiles-definitions>
/title/courseContent.jsp
<% ... @ taglib uri = " http://jakarta.apache.org/struts/tags-tiles " prefix = " tiles " %> < html > < head > </ head > < body > this is courseContent </ body > </ html >
spring配置文件:
<? xml version="1.0" encoding="UTF-8" ?> <! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" > < beans > < bean id ="simpleUrlMapping" class ="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" > < property name ="mappings" > < props > < prop key ="/tiles.mvc" > TilesController </ prop > </ props > </ property > </ bean > < bean id ="TilesController" class ="Action.TilesHomeController" > </ bean > <!-- tiles页面解析器 --> < bean id ="viewResolver" class ="org.springframework.web.servlet.view.InternalResourceViewResolver" > < property name ="viewClass" > < value > org.springframework.web.servlet.view.tiles.TilesView </ value > </ property > </ bean > <!-- tiles配置器 --> < bean id ="tilesConfigurer" class ="org.springframework.web.servlet.view.tiles.TilesConfigurer" > < property name ="definitions" > < list > < value > /WEB-INF/train-def.xml </ value > </ list > </ property > </ bean > </ beans >
运行/title.mvc (mvc是我自定义的扩展名)我们可以看到如下结果:
courseDetail title this is from header this is courseDetail this is from footer
如果我们需要在每一个页面的header部分显示一些我们从数据库里读取的数值,我们可以在不同的控制器中加入访问数据库的代码,但这样显得很啰唆,因为header部门在每个页面都是公用的,也就是说不同的页面只有content部分不同,这样,我们就会有很多冗余代码,未解决这个问题,我们可以使用spring为我们提供的ComponentControllerSupport
package Action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import model.Student; import org.apache.struts.tiles.ComponentContext; import org.springframework.web.servlet.view.tiles.ComponentControllerSupport; public class HeaderTilesController extends ComponentControllerSupport ... { protected void doPerform(ComponentContext context, HttpServletRequest request, HttpServletResponse response) throws Exception ... { Student stu = new Student(); stu.setName( " gaoxiang " ); stu.setSex( " male " ); // tiles context中存放简单数据 context.putAttribute( " name " , stu.getName()); context.putAttribute( " sex " , stu.getSex()); // tiles context中存放对象 context.putAttribute( " student " , stu); // request中存放数据 request.setAttribute( " requestname " , stu.getName() + " -request " ); request.setAttribute( " requestsex " , stu.getSex() + " -request " ); } }
改写train-def.xml
<! DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration//EN" "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd" > < tiles-definitions > < definition name ="template" page ="/tiles/mainTemplate.jsp" > < put name ="title" value ="default title" /> < put name ="header" value =".header" /> < put name ="content" value ="/tiles/content.jsp" /> < put name ="footer" value ="/tiles/footer.jsp" /> </ definition > < definition name ="courseDetail" extends ="template" > < put name ="title" value ="courseDetail title" /> < put name ="content" value ="/tiles/courseContent.jsp" /> </ definition > < definition name =".header" page ="/tiles/header.jsp" controllerClass ="Action.HeaderTilesController" > </ definition > </ tiles-definitions >
改header.jsp
<% ... @ taglib uri = " http://jakarta.apache.org/struts/tags-tiles " prefix = " tiles " %> <% ... @page import = " model.Student " %> < html > < head > </ head > < body > < tiles:importAttribute name ="student" /> < tiles:useAttribute id ="student" name ="student" scope ="request" />< br >< br > this is header class from TileContext:${requestScope.student.name }+${requestScope.student.sex }< br >< br > this is header date from TileContext: < tiles:getAsString name ="name" /> + < tiles:getAsString name ="sex" />< br >< br > this is header date from request:${requestname }+${requestsex }< br >< br > </ body > </ html >
运行结果:
the title is:courseDetail titlethis is header class from TileContext:gaoxiang+male this is header date from TileContext: gaoxiang+male this is header date from request:gaoxiang-request+male-request this is courseContent this is footer
附:web.xml
<? xml version="1.0" encoding="UTF-8" ?> < web-app version ="2.4" xmlns ="http://java.sun.com/xml/ns/j2ee" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" > < context-param > < param-name > contextConfigLocation </ param-name > < param-value > /WEB-INF/train-servlet.xml </ param-value > </ context-param > < servlet > < servlet-name > train </ servlet-name > < servlet-class > org.springframework.web.servlet.DispatcherServlet </ servlet-class > < load-on-startup > 0 </ load-on-startup > </ servlet > < servlet-mapping > < servlet-name > train </ servlet-name > < url-pattern > *.mvc </ url-pattern > </ servlet-mapping > < listener > < listener-class > org.springframework.web.context.ContextLoaderListener </ listener-class > </ listener > < filter > < filter-name > character </ filter-name > < filter-class > Action.CharacterFilter </ filter-class > </ filter > < filter-mapping > < filter-name > character </ filter-name > < url-pattern > /* </ url-pattern > </ filter-mapping > < welcome-file-list > < welcome-file > index.jsp </ welcome-file > </ welcome-file-list > </ web-app >