thymeleaf

为啥不用jsp自定义标签

jsp自定义标签很强大,但是只适用于jsp页面,在html中就不行了。

准备,首先需要把springboot1.5.4默认的thymeleaf升级为3.0,不然使用不了
也就是springboot1.5.4,thymeleaf3.0
在posm.xml文件中插入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring4</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/nz.net.ultraq.thymeleaf/thymeleaf-layout-dialect -->
<dependency>
<groupId>nz.net.ultraq.thymeleaf</groupId>
<artifactId>thymeleaf-layout-dialect</artifactId>
<version>2.0.0</version>
</dependency>

这里升级很危险,必须所有依赖jar包全部都给下载了

前面准备好就开始写代码,我直接帖代码

TagDialect

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import org.thymeleaf.dialect.AbstractProcessorDialect;
import org.thymeleaf.processor.IProcessor;
import org.thymeleaf.standard.StandardDialect;
import org.thymeleaf.standard.processor.StandardXmlNsTagProcessor;
import org.thymeleaf.templatemode.TemplateMode;

import java.util.HashSet;
import java.util.Set;

/**
* @ClassName CustomLabel
* @Description 按钮权限自定义标签名:tags
* @Author asus
* @Date Created by asus on 2018/11/2112:02
* @Version 1.0
**/
public class TagDialect extends AbstractProcessorDialect{

public TagDialect() {
super("Tags Dialect", "tags", 1000);
}
/**
*@Author asus
*@Descript元素处理器:“matter”标签。
*@Date 16:05 2018/11/21
*@Param [s]
*@return java.util.Set<org.thymeleaf.processor.IProcessor>
**/
@Override
public Set<IProcessor> getProcessors(final String dialectPrefix) {
final Set<IProcessor> processors = new HashSet<>();
processors.add(new DictMyTagProcessor(dialectPrefix));//添加我们定义的标签
processors.add(new StandardXmlNsTagProcessor(TemplateMode.HTML, dialectPrefix));
return processors;
}
}

DictMyTagProcessor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.thymeleaf.context.ITemplateContext;
import org.thymeleaf.model.IModel;
import org.thymeleaf.model.IModelFactory;
import org.thymeleaf.model.IProcessableElementTag;
import org.thymeleaf.processor.element.AbstractElementTagProcessor;
import org.thymeleaf.processor.element.IElementTagStructureHandler;
import org.thymeleaf.spring4.context.SpringContextUtils;
import org.thymeleaf.templatemode.TemplateMode;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
* @ClassName DictMyTagProcessor
* @Description 按钮权限自定义标签:功能类
* @Author asus
* @Date Created by asus on 2018/11/2111:53
* @Version 1.0
**/
public class DictMyTagProcessor extends AbstractElementTagProcessor{

private static final String TAG_NAME = "tag";//标签名 tag 这个玩意就是 自定义标签的 : tag, 应该是可以定义多个标签
private static final int PRECEDENCE = 1000;//优先级

public DictMyTagProcessor(final String dialectPrefix) {
super(
TemplateMode.HTML, // 此处理器将仅应用于HTML模式
dialectPrefix,// 要应用于名称的匹配前缀
TAG_NAME, // 标签名称:匹配此名称的特定标签
true,// 没有应用于标签名的前缀
null,// 无属性名称:将通过标签名称匹配
false, // 没有要应用于属性名称的前缀
PRECEDENCE// 优先(内部方言自己的优先
);
}
/**
*@Author asus
*@Descript context 页面上下文 tag 标签
*@Date 10:27 2018/11/23
*@Param [context, tag, structureHandler]
*@return void
**/
@Override
protected void doProcess(
final ITemplateContext context,
final IProcessableElementTag tag,
final IElementTagStructureHandler structureHandler) {
//获取应用程序上下文。
ApplicationContext appCtx = SpringContextUtils.getApplicationContext(context);
ZnlyOperatorService znlyOperatorService=appCtx.getBean(ZnlyOperatorService.class);
ZnlyUserService znlyUserService=appCtx.getBean(ZnlyUserService.class);
/**
*@Author asus
*@Descript 从标签读取“menuId”“operatorType”“tabIndex”属性。标签中的这个可选属性将告诉我们需要什么样的数据
*@Date 16:24 2018/11/21
*@Param [context, tag, structureHandler]
*@return void
**/
final String menuId= tag.getAttributeValue("menuId");//菜单id
final String operatorType= tag.getAttributeValue("operatorType");//按钮类型
final String tabIndex= tag.getAttributeValue("tabIndex");//标签页
String roleIds = "";//角色id
// 1.创建输出的html的流
StringBuffer sb = new StringBuffer();
//此处开始替换要输出的内容

BaseController b=new BaseController();
ZnlyUser znlyUser=b.getUser();
List<ZnlyRole> znlyRoleList=znlyUserService.findZnlyUserRoleList(znlyUser.getId());//获取当前用户角色id
//编译角色id
for (int i = 0; i < znlyRoleList.size(); i++) {
if (i == 0) {
roleIds += znlyRoleList.get(i).getRoleId();
}else {
roleIds += ","+znlyRoleList.get(i).getRoleId();
}
}
List<Map<String, Object>> operList =new ArrayList<>();
try {
//获取当前用户的操作
operList = znlyOperatorService.getOptionByPageName(roleIds,menuId,operatorType,tabIndex);
}catch (Exception e){
e.printStackTrace();
}
String operatorButtonType="submit";
if(operatorType.equals("1")){
for (Map<String, Object> oper : operList) {//<button type="submit" class="btn btn-primary">查询</button>
Integer buttonType=Integer.parseInt(oper.get("operator_button_type").toString());
if(1!=buttonType){
operatorButtonType="button";
}
sb.append("<button type='"+operatorButtonType+"' class='btn "+oper.get("operator_class")+"'>"+oper.get("operator_name")+"</button>");
}
}else if(operatorType.equals("2")){
for (Map<String, Object> oper : operList) {//<button type="submit" class="btn btn-primary">查询</button>
Integer buttonType=Integer.parseInt(oper.get("operator_button_type").toString());
if(1!=buttonType){
operatorButtonType="button";
}
sb.append("<button type='"+operatorButtonType+"' class='btn btn-xs "+oper.get("operator_class")+"'>"+oper.get("operator_name")+"</button>");
}
}
//此处结束替换要输出的内容
/**
*@Author asus
*@Descript 创建将替换自定义标签的DOM结构。logo将显示在“<div>”标签内,因此必须首先创建,然后必须向其中添加一个节点。
*@Date 16:25 2018/11/21
*@Param [context, tag, structureHandler]
*@return void
**/
final IModelFactory modelFactory = context.getModelFactory();
final IModel model = modelFactory.createModel();
model.add(modelFactory.createText(sb));
/**
*@Author asus
*@Descript指示引擎用指定的模型替换整个元素。
*@Date 16:33 2018/11/21
*@Param [context, tag, structureHandler]
*@return void
**/
structureHandler.replaceWith(model, false);
}
}

最后在Application.java中添加

1
2
3
4
@Bean
public TagDialect tagDialect(){
return new TagDialect();
}

页面引用
在顶部的html中
html01
tags

这里大家可以看到我是用来shiro的控制,但是没自由找到可以动态显示的,就想起jsp 的自定义标签发现thymeleaf3也有方言就是这样,希望对你有帮助

2019年8月14日 更新

最近使用新的springboot控件,但是原来的springboot1.5.4版本有点老了,怎么办升级嘛!
但是之前讲过springboot和thymeleaf3.0的匹配版本很重要经过最终尝试这里使用的springboot版本为2.1.5.RELEASE;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/nz.net.ultraq.thymeleaf/thymeleaf-layout-dialect -->
<dependency>
<groupId>nz.net.ultraq.thymeleaf</groupId>
<artifactId>thymeleaf-layout-dialect</artifactId>
<version>2.0.0</version>
</dependency>

如果本文对您有所帮助,请打赏给我吧,我先送个你也红包往下看,你可以把扫到红包打赏个我哦!
红包

本文标题:thymeleaf

文章作者:範範

发布时间:2019年08月14日 - 11:08

最后更新:2019年08月14日 - 12:08

原始链接:http://www.trhsy.top/thymeleaf.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------The End-------------
範範 wechat
欢迎关注微信公众号,孬蛋等着你!
坚持原创技术分享,您的支持将鼓励我继续创作!