首先,我们定义一个总体的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
>