sitemesh框架的简单使用(springboot+maven+jsp+sitemesh)
程序员文章站
2022-06-19 17:44:43
一 简单介绍sitemesh是一种模板框架,是为了解决页面重复代码而设计的sitemesh的设计思想是装饰者设计模式二 简单使用目录结构,因为我这个项目本来是用来学习flowable的,后面为了方便快速学习,直接把sitemesh集成到这里了,读者只需关心下方红框的文件即可引用依赖(由于springboot默认使用的是themeleaf,不支持使用jsp,所以我们需要引入相关支持jsp的依赖,因为公司用的jsp,所以这里也是用jsp进行演示)...
一 简单介绍
- sitemesh是一种模板框架,是为了解决页面重复代码而设计的
- sitemesh的设计思想是装饰者设计模式
二 简单使用
目录结构,因为我这个项目本来是用来学习flowable的,后面为了方便快速学习,直接把sitemesh集成到这里了,读者只需关心下方红框的文件即可
- 引用依赖(由于springboot默认使用的是themeleaf,不支持使用jsp,所以我们需要引入相关支持jsp的依赖,因为公司用的jsp,所以这里也是用jsp进行演示)
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<!--用于编译jsp-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<!--<scope>provided</scope>-->
</dependency>
<!-- 支持jsp结果 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.sitemesh</groupId>
<artifactId>sitemesh</artifactId>
<version>3.0.0</version>
</dependency>
- 编写过滤器
过滤器的作用:拦截所有的请求,默认通过读取/WEB-INF/sitemesh3.xml的方式来进行配置,当然也可以通过写java代码进行配置(后面讲到)
import org.sitemesh.config.ConfigurableSiteMeshFilter;
import org.springframework.context.annotation.Configuration;
import javax.servlet.annotation.WebFilter;
@Configuration
@WebFilter(filterName="SitemeshFilter",urlPatterns="/*")
public class SitemeshFilter extends ConfigurableSiteMeshFilter {
}
附:ConfigurableSiteMeshFilter 部分代码
- 编写resources/application.yml文件
spring:
mvc:
view:
prefix: /WEB-INF/app-jsp/
suffix: .jsp
- 编写sitemesh3.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<sitemesh>
<!-- 默认装饰器,当下面的路径都不匹配时,启用该装饰器进行装饰 -->
<mapping decorator="/WEB-INF/app-jsp/decorators/header.jsp"/>
<!-- 排除,不进行装饰的路径 -->
<mapping path="/login" exclue="true"/>
<mapping path="/" exclue="true"/>
<!-- 对不同的路径,启用不同的装饰器 -->
<mapping path="/main" decorator="/WEB-INF/app-jsp/decorators/default.jsp" />
<!-- <mapping path="/decoratorsTest" decorator="/WEB-INF/app-jsp/decorators/decorators-test.jsp" />-->
<!-- 对不同的路径,使用同一个装饰器 -->
<mapping decorator="/WEB-INF/app-jsp/decorators/header.jsp">
<path>/decoratorsTest2</path>
<path>/decoratorsTest3</path>
<!-- <decorator>/WEB-INF/app-jsp/decorators/header.jsp</decorator>-->
</mapping>
<!-- 对同一路径,启用多个装饰器 -->
<!-- 注意事项:当需要对同一个路径配置多个装饰器时,会从上往下进行装饰,也就是先使用default.jsp进行装饰,
然后把装饰后的default.jsp的body作为整体被装饰的内容,再通过decorators-test.jsp进行装饰
-->
<mapping path="/testHb">
<!-- <path>/testHb/*</path>-->
<decorator>/WEB-INF/app-jsp/decorators/default.jsp</decorator>
<decorator>/WEB-INF/app-jsp/decorators/decorators-test.jsp</decorator>
</mapping>
<!-- Sitemesh3 默认只提供了 body,title,head 等 tag 类型,我们可以通过实现 TagRuleBundle 扩展自定义的 tag 规则 -->
<content-processor>
<tag-rule-bundle class="com.yzy.flowable.sitemesh.decorators.DecoratorsTag" />
</content-processor>
<!-- 使用自定义的tag -->
<mapping path="/decoratorsTest4" decorator="/WEB-INF/app-jsp/decorators/myTagTest.jsp" />
</sitemesh>
- 编写SitemeshController,新增访问路径login
@RequestMapping("login")
public String login(){
return "login";
}
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<title>登录页</title>
</head>
<body>
<h1>我是登录页面</h1>
</body>
</html>
对应sitemesh3.xml文件,访问路径为/login时,不进行装饰.
页面效果:
- 编写SitemeshController,新增访问路径main
@RequestMapping("main")
public String main(){
return "main";
}
main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<title>主页面</title>
</head>
<body>
<h1>我是主页面</h1>
</body>
</html>
对应sitemesh3.xml文件,访问路径为/main时,进行装饰.
default.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<title>
<sitemesh:write property='title'/>
</title>
</head>
<body>
<h3>我是默认的页面</h3>
<hr>
插入的内容:<br>
<sitemesh:write property='body'/><br/>
</body>
</html>
页面效果
分析:因为对/main进行了过滤,main.jsp的<title>和<body>内容被抽取出来,填充到default.jsp对应的位置上,最后,浏览器渲染的是default.jsp的内容
- 装饰器其它的配置参考sitemesh3.xml文件
不同的路径,使用同一个装饰器 或者 同一路径,启用多个装饰器等
- 自定义tag,参考sitemesh3.xml
<!-- Sitemesh3 默认只提供了 body,title,head 等 tag 类型,我们可以通过实现 TagRuleBundle 扩展自定义的 tag 规则 -->
<content-processor>
<tag-rule-bundle class="com.yzy.flowable.sitemesh.decorators.DecoratorsTag" />
</content-processor>
<!-- 使用自定义的tag -->
<mapping path="/decoratorsTest4" decorator="/WEB-INF/app-jsp/decorators/myTagTest.jsp" />
编写DecoratorsTag.java文件
import org.sitemesh.SiteMeshContext;
import org.sitemesh.content.ContentProperty;
import org.sitemesh.content.tagrules.TagRuleBundle;
import org.sitemesh.content.tagrules.html.ExportTagToContentRule;
import org.sitemesh.tagprocessor.State;
public class DecoratorsTag implements TagRuleBundle {
@Override
public void install(State state, ContentProperty contentProperty, SiteMeshContext siteMeshContext) {
state.addRule("myBody", new ExportTagToContentRule(siteMeshContext,contentProperty.getChild("myBody"), false));
}
@Override
public void cleanUp(State state, ContentProperty contentProperty, SiteMeshContext siteMeshContext) {
}
}
修改main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<title>主页面</title>
</head>
<body>
<h1>我是主页面</h1>
<myBody>我是自定义标签</myBody>
</body>
</html>
myTagTest.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<title><sitemesh:write property='title'/></title>
</head>
<body>
<h3>我是头部</h3>
<hr>
插入的内容:<br>
<sitemesh:write property='myBody'/><br/>
<!-- 引进尾部 -->
<jsp:include page="footer.jsp"></jsp:include>
</body>
</html>
页面效果
可知:myTagTest.jsp在进行装饰main.jsp时,只抽取了<myBody>标签的内容
以上就是sitemesh的简单用法,也足够了
本文地址:https://blog.csdn.net/qq_40564810/article/details/112007966
上一篇: 干货!网站推广主要营销技巧
下一篇: 网站怎么推广 网站推广详解