最近在做东西,要求使用Tiles框架。就简单总结了一下。
一、什么是Tiles框架?
Tiles 是一种JSP布局框架,主要目的是为了将复杂的jsp页面作为一个的页面的部分机能,然后用来组合成一个最终表示用页面用的,这样的话,便于对页面的各个机能的变更及维护。
二、为什么使用Tiles框架
你可能觉得,Tiles跟jsp:include标签一样的作用。当然,Tiles实现了jsp:include的功能,但是我认为它比jsp:include更灵活。使用Tiles大大提高了视图层程序代码的可重用性、可扩展性和可维护性。但也增加了视图创建的难度,所以,建议Tiles应用于有一定规模的网页制作。
三、具体使用。
初步准备:由于本人使用的spring ,先在配置文件中定义如下:
<bean id="tilesViewResolver" class="org.springframework.web.servlet.view.tiles3.TilesViewResolver">
<property name="order" value="1"></property>
</bean>
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
<property name="definitions">
<list>
<value>/layout/layout.xml</value>
</list>
</property>
</bean>
value指定了接下来使用的layout.xml的位置。order设置了优先级(数字越小优先级越高),springmvc配置文件中有多个视图解析器,优先级高的视图解析器会优先调用。
(1) 对于一个超级简单的页面,会由三部分组成。header,body,footer。
而很多的页面公用header与footer,这时候,就可以将这两者摘出来,放在单独的jsp文件中,在body.jsp的地方引用这两者,这通过jsp:include可以实现。
那个Tiles框架又如何实现这种功能呢?
首先:需要创建一个layout.xml,注意头部,这些约束不能少。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
"http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions> <definition name="layout" template="/jsp/mainLayout.jsp">
</definition>
<definition name="myView" extends="layout">//这是使用的继承,也可以直接使用上面的template。
<put-attribute name="header" expression="/jsp/header.jsp" />
<put-attribute name="body" expression="/jsp/body.jsp"></put-attribute>
<put-attribute name="footer" expression="/jsp/footer.jsp"/>
</definition>
</tiles-definitions>
这里面定义的内容相当于定义了默认模板。它引用了footer.jsp,body.jsp与header.jsp.
具体的mainLayout.jsp,定义了基本的网页布局。注意,这些头不可少。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<%@ taglib uri="http://tiles.apache.org/tags-tiles-extras" prefix="tilesx" %>
<%@ taglib prefix="title" uri="http://tiles.apache.org/tags-tiles" %>
<div>
<tiles:insertAttribute name="header"></tiles:insertAttribute>
<tiles:insertAttribute name="body"></tiles:insertAttribute>
<title:insertAttribute name="footer"></title:insertAttribute>
</div>
这样,网页的显示就是header,body,footer组合在一起的内容了。
具体访问方式。
@RequestMapping("/test")
public String test(Model model){
model.addAttribute("body","other");
return "myView";
}
访问的对象为定义的模板的名称。
2)如果其他的页面想使用mainLayout.jsp布局,比如在other.jsp,可以这样写。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<%@ taglib uri="http://tiles.apache.org/tags-tiles-extras" prefix="tilesx" %>
<%@ taglib prefix="title" uri="http://tiles.apache.org/tags-tiles" %>
<tiles:insertDefinition name="myView"> <tiles:putAttribute name="body"> others </tiles:putAttribute> </tiles:insertDefinition>
其中,如果name对应的模板内的内容被重新修改,会覆盖原来的内容。如果不修改就会保持模板初始的内容。
访问:
@RequestMapping("/test")
public String test(Model model){
model.addAttribute("body","other");
return "other";
}
访问的是other.jsp,不再是模板的名称。
这样,访问的结果会有
header.jsp other.jsp footer.jsp组合在一起的内容
3)tiles的强大的地方,假设10w个页面使用同样的布局,如果按照jsp:include的形式,每个页面都需要引入(那得累死)。
但是通过tiles,可以简化这个操作。
首先,在layout.xml中如下定义
<definition name="myView" extends="layout">
<put-attribute name="header" expression="/jsp/header.jsp" />
<put-attribute name="body" expression="/jsp/${body}.jsp"></put-attribute>
<put-attribute name="footer" expression="/jsp/footer.jsp"/>
</definition>
注意,body的内容,这时候使用类似于el表达式的形式,
public String test(Model model){
model.addAttribute("body","other");
return "myView";
}
对应的后台的代码,其中body名称与layout.xml的body一致。添加名称为other,返回值为定义的模板的名称myView,这样,当访问的时候,body的内容就相当于访问的/jsp/other.jsp了。就算有10w+的页面,也不用每一个都写jsp:include了。