一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|

服務器之家 - 編程語言 - JAVA教程 - Thymeleaf 3.0 自定義標簽方言屬性的實例講解

Thymeleaf 3.0 自定義標簽方言屬性的實例講解

2020-09-19 00:31Garc JAVA教程

這篇文章主要介紹了Thymeleaf 3.0 自定義標簽方言屬性的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

此篇文章內容僅限于 描述 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.evaluateAsStringsWithDelimiter;
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 String elementCompleteName = tag.getElementCompleteName(); //標簽名
     //創建模型
     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

延伸 · 閱讀

精彩推薦
  • JAVA教程基于java查找最長字符串代碼實例

    基于java查找最長字符串代碼實例

    這篇文章主要介紹了基于java查找最長字符串代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以...

    墨問浮生2002020-09-16
  • JAVA教程Java 敏感信息加密處理

    Java 敏感信息加密處理

    本文主要介紹了Java 敏感信息加密處理的相關知識:1)敏感信息加密處理我們要實現什么;2)敏感信息加密處理我做了些什么;3)敏感信息加密實現方法...

    SZBright2412020-08-30
  • JAVA教程用java WebSocket做一個聊天室

    用java WebSocket做一個聊天室

    這篇文章主要為大家詳細介紹了用java WebSocket做一個聊天室,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    小二少爺1892020-06-24
  • JAVA教程JavaWeb后臺購物車類實現代碼詳解

    JavaWeb后臺購物車類實現代碼詳解

    這篇文章主要介紹了JavaWeb后臺購物車類實現代碼詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以...

    MrDong先生2272020-07-26
  • JAVA教程Java實現表達式二叉樹

    Java實現表達式二叉樹

    這篇文章主要為大家詳細介紹了如何利用Java實現表達式二叉樹,感興趣的小伙伴們可以參考一下 ...

    my筆觸1262020-06-03
  • JAVA教程Java 判斷一個時間是否在另一個時間段內

    Java 判斷一個時間是否在另一個時間段內

    這篇文章主要介紹了Java 判斷一個時間是否在另一個時間段內的相關資料,需要的朋友可以參考下...

    l44323212042020-06-23
  • JAVA教程java獲取文件編碼,jsoup獲取html純文本操作

    java獲取文件編碼,jsoup獲取html純文本操作

    這篇文章主要介紹了java獲取文件編碼,jsoup獲取html純文本操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    256g的胃4372020-08-19
  • JAVA教程java Mail郵件接收工具類

    java Mail郵件接收工具類

    這篇文章主要介紹了java Mail郵件接收工具類,本文直接給出類實現代碼和使用示例,需要的朋友可以參考下 ...

    junjie3872019-12-10
主站蜘蛛池模板: 91精品免费国产高清在线 | 亚洲精品国产精麻豆久久99 | 美女扒开胸罩露出胸大乳 | 精品久久洲久久久久护士免费 | 免费高清特黄a 大片 | 亚洲性久久久影院 | 国内精品久久久久小说网 | 欧美日韩一区二区中文字幕视频 | 久久AV国产麻豆HD真实乱 | 秋霞午夜伦午夜高清福利片 | 6080欧美一区二区三区四区 | 国产酒店自拍 | 欧美娇小性xxxx | 毛片免费全部免费观看 | 亚洲va在线va天堂成人 | 九九精品视频在线观看 | 欧美大片一区 | 亚洲精品卡1卡二卡3卡四卡 | 99久久精品国产免费 | 法国贵妇一级伦理hd | 2022国产麻豆剧传媒古装 | 国产一区二区三区欧美 | 国产九九视频在线观看 | 日本高清在线观看天码888 | 四虎在线观看 | 国产精品第页 | 精品欧美一区二区三区久久久 | 朝鲜女人free性xxe | 韩国理论片最新第一页 | 韩国禁片在线观看久 | 亚洲精品www久久久久久 | 青草草视频在线观看 | 我的好妈妈7中字在线观看韩国 | 国产免费视| 精品欧美一区二区在线观看欧美熟 | 嫩草影院地址一地址二 | 视频一区二区三区欧美日韩 | 精品四虎 | 日韩精品一区二区三区中文字幕 | 亚洲第一网站免费视频 | 成人在线免费观看 |