sitemesh框架的简单使用(springboot+maven+jsp+sitemesh)

article/2025/9/26 10:09:45

一 简单介绍

  • sitemesh是一种模板框架,是为了解决页面重复代码而设计的
  • sitemesh的设计思想是装饰者设计模式

二 简单使用

目录结构,因为我这个项目本来是用来学习flowable的,后面为了方便快速学习,直接把sitemesh集成到这里了,读者只需关心下方红框的文件即可
在这里插入图片描述

  1. 引用依赖(由于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>
  1. 编写过滤器
    过滤器的作用:拦截所有的请求,默认通过读取/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 部分代码
在这里插入图片描述

  1. 编写resources/application.yml文件
spring:mvc:view:prefix: /WEB-INF/app-jsp/suffix: .jsp
  1. 编写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>
  1. 编写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时,不进行装饰.
页面效果:
在这里插入图片描述

  1. 编写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的内容

  1. 装饰器其它的配置参考sitemesh3.xml文件
不同的路径,使用同一个装饰器 或者 同一路径,启用多个装饰器等
  1. 自定义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 {@Overridepublic void install(State state, ContentProperty contentProperty, SiteMeshContext siteMeshContext) {state.addRule("myBody", new ExportTagToContentRule(siteMeshContext,contentProperty.getChild("myBody"), false));}@Overridepublic 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的简单用法,也足够了


http://chatgpt.dhexx.cn/article/TiCsYaqH.shtml

相关文章

SiteMesh3简介及使用

最近项目用到SiteMesh3&#xff0c;研究学习一段时间后决定写篇博文来记录收获。 SiteMesh SiteMesh 介绍工作原理配置及使用 下载1添加maven依赖2webxml中添加SiteMesh过滤器3创建一个装饰页面decorator page4创建一个被装饰页面content page5配置 1XML方式1Java方式 6查看…

sitemesh初步

sitemesh小项目 1.工程目录 2.需要的lib:sitemesh-2.4.2.jar http://wiki.sitemesh.org/wiki/display/sitemesh/Download 3.配置 decorators.xml[sitemesh的配置文件] <?xml version"1.0" encoding"ISO-8859-1"?><!-- 在defaultdir目录…

SiteMesh框架统一布局用法介绍

SiteMesh 是一个网页布局和修饰的框架&#xff0c;基于 Servlet 中的 Filter&#xff0c;类似于 ASP.NET 中的‘母版页’技术。 介绍&#xff1a; 1&#xff0c;SiteMesh是OpenSymphony团队开发的JEE框架之一,它是一个非常优秀的页面装饰器框架。它通过对所有的用户请求进行过…

SIteMesh介绍

转自:http://javauu.com/thread-27-1-1.html 一、SIteMesh介绍 一、SiteMesh简介 SiteMesh是由一个基于Web页面布局、装饰以及与现存Web应用整合的框架。它能帮助我们在由大量页面构成的项目中创建一致的页面布局和外观&#xff0c;如一致的导航条&#xff0c;一致的banner&a…

【CSRF】学习关于CSRF攻击和防范

文章目录 1.CSRF攻击是什么2.CSRF攻击如何实现2.1 使用GET请求的CSRF的攻击例子2.2 使用post请求的CSRF攻击 3.如何防御CSRF攻击3.1 什么是CSRF令牌3.2 反-CSRF令牌工作流程3.3 同站Cookie策略 4.结论 高质量原文&#xff1a; CSRF Attacks: Anatomy, Prevention, and XSRF To…

CSRF攻击简述

一.CSRF是什么&#xff1f; CSRF&#xff08;Cross-site request forgery&#xff09;&#xff0c;中文名称&#xff1a;跨站请求伪造&#xff0c;也被称为&#xff1a;one click attack/session riding&#xff0c;缩写为&#xff1a;CSRF/XSRF。 二.CSRF可以做什么&#xff…

如何防止CSRF攻击?

文章目录 一、什么是CSRF&#xff1f;二、CSRF的几种类型1、GET类型的CSRF2、POST类型的CSRF3、链接类型的CSRF 三、CSRF的特点四、防护策略1、同源检测如何阻止外域请求无法确认来源域名情况 2、CSRF Token原理1&#xff09;将CSRF Token输出到页面中2&#xff09;页面提交的请…

CSRF攻击原理以及防御方法

CSRF攻击原理以及防御方法 CSRF概念&#xff1a;CSRF跨站点请求伪造(Cross—Site Request Forgery)&#xff0c;跟XSS攻击一样&#xff0c;存在巨大的危害性&#xff0c;你可以这样来理解&#xff1a; 攻击者盗用了你的身份&#xff0c;以你的名义发送恶意请求&#xff0c;对服…

csrf攻击 java_Web常见攻击手段-CSRF攻击

什么是CSRF攻击&#xff1f; 跨站请求伪造(Cross-Site Request Forgery, CSRF)&#xff0c;恶意网站通过脚本向当前用户浏览器打开的其它页面的 URL 发起恶意请求&#xff0c;由于同一浏览器进程下 Cookie 可见性&#xff0c;导致用户身份被盗用&#xff0c;完成恶意网站脚本中…

什么是CSRF攻击?

什么是 CSRF 攻击&#xff1f; CSRF 概念&#xff1a;CSRF&#xff08;Cross-site request forgery&#xff09;跨站请求伪造&#xff0c;也被称为“One Click Attack”或者 Session Riding&#xff0c;通常缩写为 CSRF 或者 XSRF&#xff0c;是一种对网站的恶意利 用。 尽…

【Web 安全】CSRF 攻击详解

文章目录 一、CSRF 简介二、CSRF 原理三、CSRF 的危害四、CSRF 的攻击类型1. GET型2. POST型 五、CSRF 的防御1. 验证 HTTP Referer 字段2. 在请求地址中添加 token 并验证3. 在 HTTP 头中自定义属性并验证 六、WAF 防御 CSRF参考链接 一、CSRF 简介 CSRF&#xff08;Cross Si…

如何强制卸载软件,强制卸载的工具。

日常使用电脑过程中经常会遇到一些流氓捆绑软件&#xff0c;今天我们教大家如何轻松的强制卸载流氓软件。非常小巧而且强大的一款强制卸载工具&#xff0c;干净清爽。 工具/原料 Geek Uninstaller 方法/步骤 首先我们下载工具&#xff0c;百度输入geek点击搜索&#xff0c;如下…

HTML文件命名_没有删不掉的文件:强制终止、一键解锁,样样精通

微信搜一搜 麦克NO1 日常在使用电脑的时候&#xff0c;经常会遇到这样一个问题&#xff1a;想要删除某文件夹里的文件是&#xff0c;系统弹出&#xff1a;该文件无法删除、被系统占用等。那么&#xff0c;一旦遇到该问题该如何应对呢&#xff1f;以后不再担心&#xff0c;接下来…

使用管理员权限强制删除文件夹

1、鼠标右键要删除的文件&#xff0c;选择属性&#xff0c;如图所示&#xff1a;2、在界面中&#xff0c;切换到安全选项&#xff0c;点击编辑按钮&#xff0c;如图所示&#xff1a; 3、在窗口中&#xff0c;点击添加&#xff0c;接着在界面中输入对象名称来选择里面输入Admin…

强制删除鲁大师所有文件

方法一&#xff1a;“操作无法完成 文件已在windows文件资源管理器中打开”评论最多的解决办法 当出现拒绝访问的情况&#xff0c;可用方法二 方法二&#xff1a;Windows 10下删除鲁大师卸载后的残留文件夹 1.按住WinR&#xff0c;出现运行对话框&#xff0c;输入regedit&am…

win10 强制删除文件夹

在win10下编译代码时&#xff0c;发现无法通过delete删除build文件夹&#xff0c;提示需要用户权限&#xff0c;参考该教程&#xff0c;可以利用命令行进行删除。 在资源管理器中打开power shell 显示的powershell如下&#xff1a; 删除指定的文件夹或文件

Android 单元测试 一

最近在看软件TDD方面的知识&#xff0c;联想到android也有单元测试&#xff0c;所以就打算实践下&#xff0c;至于为啥要做单元测试&#xff0c;单元测试有那些好处&#xff0c;看官请移步 度娘和google。现在就记录下单元测试第一弹。我用的AS&#xff0c;AS在我们新建一个pro…

Docker版Jenkins持续集成环境部署

前提&#xff1a; 1、已配置java环境 2、已配置maven环境 3、已安装tomcat 一、Jenkins安装 1. jenkins部署 1.1 命令行启动方式 java -jar jenkins.war --httpPort80811.2 Tomcat 部署方式 将下载的jenkins.war包放到apache-tomcat-9.0.30/webapps目录下如果启动不想带ht…

java做简单的unitTest

一、单元测试准备 引入junit和mockito包 单元测试主要注解&#xff1a; SpringBoot RunWith 测试运行器 Before 在测试方法之前运行 Test 测试方法 After 测试方法之后运行 InjectMocks 待测试类 Mock 测试中需要使用到的类(模拟类) Spy 测试中需要使用到的类(真实类) 单元测…

网络编程懒人入门(一):快速理解网络通信协议(上篇)

1、写在前面 论坛和群里常会有技术同行打算自已开发IM或者消息推送系统&#xff0c;很多时候连基本的网络编程理论&#xff08;如网络协议等&#xff09;都不了解&#xff0c;就贸然定方案、写代码&#xff0c;显得非常盲目且充满技术风险。 即时通讯网论坛里精心整理了《[通俗…