Spring MVC集成Struts Tiles使用方法

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,我们定义一个总体的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>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值