博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jsp改造之sitemesh修改tagRule
阅读量:5822 次
发布时间:2019-06-18

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


title: jsp改造之sitemesh修改tagRule tags:

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

背景

上篇说了一些sitemesh的注意事项

事实上我们最开始的目的很简单 其实需要把script放到页面最下

同时考虑针对页面布局将来可以有更好的整体切换方案【面对产品经理的需求】

方案

上篇说了也提到了使用ExportTagToContentRule的一些弊端,那么如果我们有多块js需要默认放到页面末尾如何处理呢?

sitemesh默认提供了一些常用的rule

可以看到其实可以选择

/**     * Extracts the contents of any elements that look like     * 
...
and write the contents * to a page property (page.foo). * *

This is a cheap and cheerful mechanism for embedding multiple components in a * page that can be used in different places in decorators.

* * @author Joe Walnes */ public class ContentBlockExtractingRule extends BasicBlockRule
{ private final ContentProperty propertyToExport; public ContentBlockExtractingRule(ContentProperty propertyToExport) { this.propertyToExport = propertyToExport; } @Override protected String processStart(Tag tag) throws IOException { tagProcessorContext.pushBuffer(); return tag.getAttributeValue("tag", false); } @Override protected void processEnd(Tag tag, String tagId) throws IOException { propertyToExport.getChild(tagId).setValue(tagProcessorContext.currentBufferContents()); tagProcessorContext.popBuffer(); } }复制代码

修改ScriptTagRuleBundle处理如下

public class ScriptTagRuleBundle implements TagRuleBundle {             @Override        public void install(State defaultState, ContentProperty contentProperty, SiteMeshContext siteMeshContext) {            defaultState.addRule("content", new ContentBlockExtractingRule(contentProperty.getChild("page")));        }             @Override        public void cleanUp(State defaultState, ContentProperty contentProperty, SiteMeshContext siteMeshContext) {             }    }复制代码

用法很简单使用content作为tag默认填上tag即可

比如

复制代码

在模板中这样

    
复制代码

这样就可以很简单的放入到任意位置!!!

弊端

这样虽然很简单 但是也存在一些问题 开发如果需要增加新的content必须要要到母版页【对的 其实sitemesh不就像是asp.net中的母版页么】

增加对应的sitemesh:write标签

propertyToExport.getChild(tagId).setValue(tagProcessorContext.currentBufferContents());复制代码

并且上述代码中同样存在覆盖的问题 比如多处使用了同样的tagId

解决

sitemesh似乎没有提供直接用来拼接多个的tagRule

如果有需求将某块元素放入到末尾 可以考虑增加tagRule

在processEnd时直接将对应的元素直接append

最终可以直接输出~

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

你可能感兴趣的文章
记录一次蚂蚁金服前端电话面试
查看>>
RecyclerView预加载机制源码分析
查看>>
直播源码开发视频直播平台,不得不了解的流程
查看>>
Ubuntu上的pycrypto给出了编译器错误
查看>>
聊聊flink的RestClientConfiguration
查看>>
在CentOS上搭建git仓库服务器以及mac端进行克隆和提交到远程git仓库
查看>>
測試文章
查看>>
Flex很难?一文就足够了
查看>>
【BATJ面试必会】JAVA面试到底需要掌握什么?【上】
查看>>
微服务b2b b2c o2o电子商务云平台
查看>>
上手kubernetes之前,你应该知道这6件事
查看>>
CollabNet_Subversion小结
查看>>
mysql定时备份自动上传
查看>>
Windows Thin PC安装功能组件
查看>>
Linux 高可用集群解决方案
查看>>
[install-pear-installer] Error 127 安装PHP时错误
查看>>
17岁时少年决定把海洋洗干净,现在21岁的他做到了
查看>>
CBO中 SMON 进程与 col_usage$ 的维护
查看>>
linux 启动oracle
查看>>
TeamCity 持续集成在LINUX的安装
查看>>