博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sitemesh的script提取
阅读量:6995 次
发布时间:2019-06-27

本文共 4852 字,大约阅读时间需要 16 分钟。


title: sitemesh的script提取 tags:

  • sitemesh
  • jsp
  • template
  • script categories: 工作日志 date: 2017-12-23 10:50:38

背景

前文交代了一些使用sitemesh的背景

那么本着怎么简单怎么来的原则首先创建了一个通用模板

 

实现

  1. 修改pom文件引入sitemesh
org.sitemesh
sitemesh
3.0.1
复制代码
 复制代码
  1. 修改webxml增加对应filter
sitemesh
org.sitemesh.config.ConfigurableSiteMeshFilter
sitemesh
/*
复制代码
 复制代码
  1. 新建sitemesh3.xml
text/html
application/vnd.wap.xhtml+xml
application/xhtml+xml
复制代码
  1. 我们除了登录之外的所有html页面进行装饰
  2. 定义模板文件
<%@ page contentType="text/html; charset=utf-8" %>        <%@ page language="java" pageEncoding="UTF-8" %>                                                    <sitemesh:write property='title'/>                        
复制代码
  1. 这样很轻易就定义了一套模板
  2. 我们的目的是将script下沉到body的结尾 因此考虑增加scipt的提取
  3. 在sitemesh3.xml定义如下
复制代码
 复制代码
  1. 新建sciptTag
/**         * @author qixiaobo         */        public class ScriptTagRuleBundle implements TagRuleBundle {            private static final String TAG_SCRIPT = "script";                     @Override            public void install(State defaultState, ContentProperty contentProperty, SiteMeshContext siteMeshContext) {                defaultState.addRule(TAG_SCRIPT, new ExportTagToContentRule(siteMeshContext, contentProperty.getChild(TAG_SCRIPT), false));            }                     @Override            public void cleanUp(State defaultState, ContentProperty contentProperty, SiteMeshContext siteMeshContext) {                     }        }复制代码
  1. 修改main.jsp为
<%@ page contentType="text/html; charset=utf-8" %>        <%@ page language="java" pageEncoding="UTF-8" %>                                                    <sitemesh:write property='title'/>                        
复制代码
 复制代码
  1. 不过考虑可能存在一些问题 scipt提取出来 那么其中的一些src要复写等等 还比较麻烦
  2. 重启服务后结果大失所望 script并没有被提取
  3. 检索发现也有国外小伙伴和我的思路一样  【不过已经是8年前的啦 当时还是sitemesh2吧】
  4. 考虑一下为啥script并没有被识别成tag呢?
  5. 查看源码后发现 sitemesh将script标签识别成
        
 {
            "
" { return TagTokenizer.Token.TEXT; } /* All comments unless they start with 
"           { return TagTokenizer.Token.TEXT; }             "
"          { return TagTokenizer.Token.TEXT; }             "
"     { return TagTokenizer.Token.TEXT; }             ""  { return TagTokenizer.Token.TEXT; }             "
" { return TagTokenizer.Token.TEXT; }             "
" { return TagTokenizer.Token.TEXT; }             [^<]+               { return TagTokenizer.Token.TEXT; }             "<"                 { yybegin(ELEMENT); return TagTokenizer.Token.LT; }             "
  1. 原来sitemesh不能支持script标签啊!
  2. 似乎走到了绝路
  3. 不过假设真的支持script 那么一些属性的设置也很麻烦啊 比如src 比如async等等
  4. 灵光一闪 既然script不支持 那么我们可以仿照jsp定义自己的标签啊!
  5. 定义f6scriprt标签 该标签表示f6script中的数据将会移到body的末尾
  6. 那么思路豁然开朗 我们将之前reference中的一些js拆分 【jQuery等依然可以放在前面加载 大部分js依赖】非必须js 比如百度统计 比如客服js等等我们放在f6script块中
  7. 改造scriptTag
package com.air.tqb.decorator;                 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;                 /**         * @author qixiaobo         */        public class ScriptTagRuleBundle implements TagRuleBundle {            private static final String TAG_SCRIPT = "f6script";                     @Override            public void install(State defaultState, ContentProperty contentProperty, SiteMeshContext siteMeshContext) {                defaultState.addRule(TAG_SCRIPT, new ExportTagToContentRule(siteMeshContext, contentProperty.getChild(TAG_SCRIPT), false));            }                     @Override            public void cleanUp(State defaultState, ContentProperty contentProperty, SiteMeshContext siteMeshContext) {                     }        }复制代码
  1. 修改模板文件为
<%@ page contentType="text/html; charset=utf-8" %>        <%@ page language="java" pageEncoding="UTF-8" %>                                                    <sitemesh:write property='title'/>                        
复制代码
 复制代码
  1. 在需要包装到结尾的js做如下处理 使用进行包装
  2. js会乖乖的跑到了body结束符前

转载地址:http://zgbvl.baihongyu.com/

你可能感兴趣的文章
Mac Jenkins 权限问题
查看>>
查找“CDN、负载均衡、反向代理”等大型网络真实IP地址的方法
查看>>
sketchup
查看>>
批处理中的echo命令图文详解
查看>>
Chrome 自动填充的表单是淡黄色的背景,有方法自定义
查看>>
hough变换中,直线方程从XY空间转换到参数空间的转换过程
查看>>
阿里云server该数据光盘安装操作
查看>>
Onedrive 明年初基础容量缩小到5G,执行这一步骤避免(保持30G)
查看>>
IOS中NSUserDefaults的用法(轻量级本地数据存储)
查看>>
大组合取模之:1<=n<=m<=1e6,1<=p<=1e9
查看>>
百度map android sdk3.5实现定位 并跳转的指定坐标,加入标记
查看>>
Oracle VM VirtualBox技巧
查看>>
怎样自己构建一个小型的Zoomeye----从技术细节探讨到实现
查看>>
Hadoop 2.7.1 源代码目录结构分析
查看>>
《转》 Openstack Grizzly 指定 compute node 创建 instance
查看>>
[转]PhoneGap使用PushPlugin插件实现消息推送
查看>>
DMA(STM32)
查看>>
最简单的基于FFMPEG的音频编码器(PCM编码为AAC)
查看>>
Boost.Asio基础(三)
查看>>
【转载】学习新东西的唯一方法
查看>>