首先,我们定义一个总体的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 title
this 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>
本文介绍了如何在Spring MVC中集成Struts Tiles,通过定义一个总的tiles视图,如/mainTemplate.jsp,并利用tiles标签加载header、content和footer页面。内容中详细展示了配置过程,包括控制器、Spring配置文件和tiles定义。通过ComponentControllerSupport减少冗余代码,实现header部分的动态展示,例如从数据库获取数据。示例运行结果证明了这种方式的有效性。

78

被折叠的 条评论
为什么被折叠?



