此篇文章內容僅限于 描述 thy3.0 自定義標簽的說明,所以你在看之前,請先會使用它。
直奔主題,以下代碼是如何引用 第三方標簽的。說明: shrioDialect 是Shiro 官方為thy開發的自定義標簽工具。和jsp的一樣
RiskDialect 是我寫的自定義標簽
1
2
3
4
5
6
7
8
9
10
|
< bean id = "templateEngine" class = "org.thymeleaf.spring3.SpringTemplateEngine" > < property name = "templateResolver" ref = "templateResolver" /> < property name = "additionalDialects" > < set > <!-- thymeleaf 使用shiro標簽 --> < bean class = "at.pollux.thymeleaf.shiro.dialect.ShiroDialect" /> < bean class = "com.hpay.risk.boss.common.RiskDialect" /> </ set > </ property > </ bean > |
首先看代碼:
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
|
import java.util.LinkedHashSet; import java.util.Set; import org.thymeleaf.dialect.AbstractProcessorDialect; import org.thymeleaf.processor.IProcessor; import org.thymeleaf.standard.StandardDialect; /** *@author Garc *@Date 2017年2月16日 上午11:42:51 *@info thymeleaf 自定義標簽屬性 *@snise **/ public class RiskDialect extends AbstractProcessorDialect { private static final String NAME = "Risk" ; private static final String PREFIX = "risk" ; public RiskDialect() { super (NAME, PREFIX, StandardDialect.PROCESSOR_PRECEDENCE); } @Override public Set<IProcessor> getProcessors(String dialectPrefix) { return createStandardProcessorsSet(dialectPrefix); } private Set<IProcessor> createStandardProcessorsSet(String dialectPrefix) { LinkedHashSet<IProcessor> processors = new LinkedHashSet<IProcessor>(); processors.add( new SansitiveEncryptProcessor(dialectPrefix)); return processors; } } |
我定義了 RiskDialect 類,并需要繼承 thymeleaf 官方 方言類
我定義的這個是為了做敏感數據加密用的。 這是前段代碼。
以下是實現自定義標簽方言 代碼:
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
|
import static at.pollux.thymeleaf.shiro.processor.ThymeleafFacade.getRawValue; import java.util.List; import org.thymeleaf.context.ITemplateContext; import org.thymeleaf.engine.AttributeName; import org.thymeleaf.model.IModel; import org.thymeleaf.model.IModelFactory; import org.thymeleaf.model.IProcessableElementTag; import org.thymeleaf.processor.element.AbstractAttributeTagProcessor; import org.thymeleaf.processor.element.IElementTagStructureHandler; import org.thymeleaf.templatemode.TemplateMode; import org.unbescape.html.HtmlEscape; import com.hpay.utils.StringUtils; /** *@author Garc *@Date 2017年2月16日 上午11:48:34 *@info 敏感加密標簽 *@snise **/ public class SansitiveEncryptProcessor extends AbstractAttributeTagProcessor{ private static final String DELIMITER = "," ; private static final String ATTRIBUTE_NAME = "sansiEncrypt" ; private static final int PRECEDENCE = 300 ; private static final String CARD= "card" ; private static final String MOBILE= "mobile" ; private static final String IDENTITY= "identity" ; private static final String CSN= "csn" ; protected SansitiveEncryptProcessor( String dialectPrefix) { super ( TemplateMode.HTML, // 處理thymeleaf 的模型 dialectPrefix, // 標簽前綴名 null , // No tag name: match any tag name false , // No prefix to be applied to tag name ATTRIBUTE_NAME, // 標簽前綴的 屬性 例如:< risk:sansiEncrypt=""> true , // Apply dialect prefix to attribute name PRECEDENCE, // Precedence (inside dialect's precedence) true ); // Remove the matched attribute afterwards } @Override protected void doProcess(ITemplateContext context, IProcessableElementTag tag, AttributeName attributeName, String attributeValue, IElementTagStructureHandler structureHandler) { final String rawValue = getRawValue(tag, attributeName); //獲取標簽內容表達式 String type= null ; String exper= null ; if (StringUtils.isNotBlank(rawValue)){ type=rawValue.split( ":" )[ 0 ]; //獲取類型 exper=rawValue.split( ":" )[ 1 ]; //獲取表達式 } //通過IStandardExpression 解析器 解析表達式獲取參數 final List<String> values = evaluateAsStringsWithDelimiter(context, exper, DELIMITER); //創建模型 final IModelFactory modelFactory = context.getModelFactory(); final IModel model = modelFactory.createModel(); //添加模型 標簽 model.add(modelFactory.createOpenElementTag(elementCompleteName)); for (String value : values) { //創建 html5標簽 文本返回數據 if (CARD.equals(type)){ model.add(modelFactory.createText(HtmlEscape.escapeHtml5(getCardNo(value)))); } else if (MOBILE.equals(type)){ model.add(modelFactory.createText(HtmlEscape.escapeHtml5(getMobile(value)))); } else if (IDENTITY.equals(type)){ model.add(modelFactory.createText(HtmlEscape.escapeHtml5(getIdentity(value)))); } else if (CSN.equals(type)){ model.add(modelFactory.createText(HtmlEscape.escapeHtml5(getCsn(value)))); } } //添加模型 標簽 model.add(modelFactory.createCloseElementTag(elementCompleteName)); //替換頁面標簽 structureHandler.replaceWith(model, false ); } protected String getCardNo(String cardNo) { if (StringUtils.isNotBlank(cardNo) && cardNo.length() >= 9 ) { return cardNo.substring( 0 , 4 ) + cardNo.substring( 4 , cardNo.length() - 3 ).replaceAll( "[0-9]" , "*" ) + cardNo.substring(cardNo.length() - 4 , cardNo.length()); } return cardNo; } protected static String getIdentity(String val){ if (org.apache.commons.lang.StringUtils.isBlank(val)||val.length()< 9 ){ return val; } else { return val.substring( 0 , 4 )+ val.substring( 4 , val.length()- 4 ).replaceAll( "[0-9]" , "*" ) + val.substring(val.length()- 4 , val.length()); } } /** * 前四后四顯示 * @param val * @return */ protected static String getMobile(String val){ if (org.apache.commons.lang.StringUtils.isBlank(val)||val.length()< 9 ){ return val; } else { return val.substring( 0 , 3 )+ val.substring( 4 , val.length()- 3 ).replaceAll( "[0-9]" , "*" ) + val.substring(val.length()- 4 , val.length()); } } /** * 星星顯示 * @param val * @return */ protected String getCsn(String val){ if (org.apache.commons.lang.StringUtils.isBlank(val)||val.length()< 12 ){ return val; } else { return val.substring( 0 , 2 )+ val.substring( 2 , val.length()- 3 ).replaceAll( "[0-9a-zA-Z]" , "*" ) + val.substring(val.length()- 6 , val.length()); } } } |
以下代碼是為了向SansitiveEncryptProcessor 提供的解析表達式 thymeleaf解析器,用來獲取參數值的:
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
|
import org.thymeleaf.context.ITemplateContext; import org.thymeleaf.engine.AttributeName; import org.thymeleaf.exceptions.TemplateProcessingException; import org.thymeleaf.model.IProcessableElementTag; import org.thymeleaf.standard.expression.IStandardExpression; import org.thymeleaf.standard.expression.IStandardExpressionParser; import org.thymeleaf.standard.expression.StandardExpressionParser; import org.thymeleaf.util.EvaluationUtils; import org.thymeleaf.util.StringUtils; import java.util.ArrayList; import java.util.List; import static java.util.Arrays.asList; import static java.util.Collections.unmodifiableList; import static org.thymeleaf.util.StringUtils.trim; import static org.thymeleaf.util.Validate.notEmpty; import static org.thymeleaf.util.Validate.notNull; public final class ThymeleafFacade { private ThymeleafFacade() { throw new UnsupportedOperationException(); } public static String getRawValue( final IProcessableElementTag element, final AttributeName attributeName) { notNull(element, "element must not be null" ); notNull(attributeName, "attributeName must not be empty" ); final String rawValue = trim(element.getAttributeValue(attributeName)); notEmpty(rawValue, "value of '" + attributeName + "' must not be empty" ); return rawValue; } public static String getRawValue( final IProcessableElementTag element, final String attributeName) { notNull(element, "element must not be null" ); notEmpty(attributeName, "attributeName must not be empty" ); final String rawValue = trim(element.getAttributeValue(attributeName)); notEmpty(rawValue, "value of '" + attributeName + "' must not be empty" ); return rawValue; } public static Object evaluateExpression(ITemplateContext arguments, String expression) throws TemplateProcessingException { notNull(arguments, "arguments must not be null" ); notEmpty(expression, "expression must not be empty" ); final IStandardExpressionParser parser = new StandardExpressionParser(); final IStandardExpression evaluableExpression = parser.parseExpression(arguments, expression); return evaluableExpression.execute(arguments); } public static List<Object> evaluateAsIterable(ITemplateContext arguments, String rawValue) throws TemplateProcessingException { notNull(arguments, "arguments must not be null" ); notEmpty(rawValue, "rawValue must not be empty" ); final Object evaluatedExpression = evaluateExpression(arguments, rawValue); return EvaluationUtils.evaluateAsList(evaluatedExpression); } public static List<Object> evaluateAsIterableOrRawValue(ITemplateContext arguments, String rawValue) { notNull(arguments, "arguments must not be null" ); notEmpty(rawValue, "rawValue must not be empty" ); final List<Object> result = new ArrayList<Object>(); try { result.addAll(evaluateAsIterable(arguments, rawValue)); } catch (TemplateProcessingException ex) { result.add(rawValue); } return unmodifiableList(result); } public static List<String> evaluateAsStringsWithDelimiter(ITemplateContext arguments, String rawValue, String delimiter) { notNull(arguments, "arguments must not be null" ); notEmpty(rawValue, "rawValue must not be empty" ); notEmpty(delimiter, "delimiter must not be empty" ); final List<String> result = new ArrayList<String>(); final List<Object> iterates = evaluateAsIterableOrRawValue(arguments, rawValue); for (Object o : iterates) { result.addAll(asList(StringUtils.split(o, delimiter))); } return unmodifiableList(result); } |
以上為 后端代碼實現內容,
頁面標簽使用方式:
<td risk:sansiEncrypt="card:${data.payerCardNo}"></td>
card 是需要 加密的類型,我實現的代碼里 對身份證和 手機號還有 CSN 加了密。
上面的內容講的是 標簽傳入數據 并返回處理數據。
類似于 if 的標簽屬性,就不寫了。
以上這篇Thymeleaf 3.0 自定義標簽方言屬性的實例講解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/Qensq/article/details/55258104