Thymeleaf 3.0 自定义标签方言属性的实例讲解
此篇文章内容仅限于描述thy3.0自定义标签的说明,所以你在看之前,请先会使用它。
直奔主题,以下代码是如何引用第三方标签的。说明:shrioDialect是Shiro官方为thy开发的自定义标签工具。和jsp的一样
RiskDialect是我写的自定义标签
首先看代码:
importjava.util.LinkedHashSet;
importjava.util.Set;
importorg.thymeleaf.dialect.AbstractProcessorDialect;
importorg.thymeleaf.processor.IProcessor;
importorg.thymeleaf.standard.StandardDialect;
/**
*@authorGarc
*@Date2017年2月16日上午11:42:51
*@infothymeleaf自定义标签属性
*@snise
**/
publicclassRiskDialectextendsAbstractProcessorDialect{
privatestaticfinalStringNAME="Risk";
privatestaticfinalStringPREFIX="risk";
publicRiskDialect(){
super(NAME,PREFIX,StandardDialect.PROCESSOR_PRECEDENCE);
}
@Override
publicSetgetProcessors(StringdialectPrefix){
returncreateStandardProcessorsSet(dialectPrefix);
}
privateSetcreateStandardProcessorsSet(StringdialectPrefix){
LinkedHashSetprocessors=newLinkedHashSet();
processors.add(newSansitiveEncryptProcessor(dialectPrefix));
returnprocessors;
}
}
我定义了RiskDialect类,并需要继承thymeleaf官方方言类
我定义的这个是为了做敏感数据加密用的。这是前段代码。
以下是实现自定义标签方言代码:
importstaticat.pollux.thymeleaf.shiro.processor.ThymeleafFacade.evaluateAsStringsWithDelimiter;
importstaticat.pollux.thymeleaf.shiro.processor.ThymeleafFacade.getRawValue;
importjava.util.List;
importorg.thymeleaf.context.ITemplateContext;
importorg.thymeleaf.engine.AttributeName;
importorg.thymeleaf.model.IModel;
importorg.thymeleaf.model.IModelFactory;
importorg.thymeleaf.model.IProcessableElementTag;
importorg.thymeleaf.processor.element.AbstractAttributeTagProcessor;
importorg.thymeleaf.processor.element.IElementTagStructureHandler;
importorg.thymeleaf.templatemode.TemplateMode;
importorg.unbescape.html.HtmlEscape;
importcom.hpay.utils.StringUtils;
/**
*@authorGarc
*@Date2017年2月16日上午11:48:34
*@info敏感加密标签
*@snise
**/
publicclassSansitiveEncryptProcessorextendsAbstractAttributeTagProcessor{
privatestaticfinalStringDELIMITER=",";
privatestaticfinalStringATTRIBUTE_NAME="sansiEncrypt";
privatestaticfinalintPRECEDENCE=300;
privatestaticfinalStringCARD="card";
privatestaticfinalStringMOBILE="mobile";
privatestaticfinalStringIDENTITY="identity";
privatestaticfinalStringCSN="csn";
protectedSansitiveEncryptProcessor(StringdialectPrefix){
super(
TemplateMode.HTML,//处理thymeleaf的模型
dialectPrefix,//标签前缀名
null,//Notagname:matchanytagname
false,//Noprefixtobeappliedtotagname
ATTRIBUTE_NAME,//标签前缀的属性例如:
true,//Applydialectprefixtoattributename
PRECEDENCE,//Precedence(insidedialect'sprecedence)
true);//Removethematchedattributeafterwards
}
@Override
protectedvoiddoProcess(ITemplateContextcontext,
IProcessableElementTagtag,AttributeNameattributeName,
StringattributeValue,IElementTagStructureHandlerstructureHandler){
finalStringrawValue=getRawValue(tag,attributeName);//获取标签内容表达式
Stringtype=null;
Stringexper=null;
if(StringUtils.isNotBlank(rawValue)){
type=rawValue.split(":")[0];//获取类型
exper=rawValue.split(":")[1];//获取表达式
}
//通过IStandardExpression解析器解析表达式获取参数
finalListvalues=evaluateAsStringsWithDelimiter(context,exper,DELIMITER);
finalStringelementCompleteName=tag.getElementCompleteName();//标签名
//创建模型
finalIModelFactorymodelFactory=context.getModelFactory();
finalIModelmodel=modelFactory.createModel();
//添加模型标签
model.add(modelFactory.createOpenElementTag(elementCompleteName));
for(Stringvalue:values){
//创建html5标签文本返回数据
if(CARD.equals(type)){
model.add(modelFactory.createText(HtmlEscape.escapeHtml5(getCardNo(value))));
}elseif(MOBILE.equals(type)){
model.add(modelFactory.createText(HtmlEscape.escapeHtml5(getMobile(value))));
}elseif(IDENTITY.equals(type)){
model.add(modelFactory.createText(HtmlEscape.escapeHtml5(getIdentity(value))));
}elseif(CSN.equals(type)){
model.add(modelFactory.createText(HtmlEscape.escapeHtml5(getCsn(value))));
}
}
//添加模型标签
model.add(modelFactory.createCloseElementTag(elementCompleteName));
//替换页面标签
structureHandler.replaceWith(model,false);
}
protectedStringgetCardNo(StringcardNo){
if(StringUtils.isNotBlank(cardNo)&&cardNo.length()>=9){
returncardNo.substring(0,4)+cardNo.substring(4,cardNo.length()-3).replaceAll("[0-9]","*")+cardNo.substring(cardNo.length()-4,cardNo.length());
}
returncardNo;
}
protectedstaticStringgetIdentity(Stringval){
if(org.apache.commons.lang.StringUtils.isBlank(val)||val.length()<9){
returnval;
}else{
returnval.substring(0,4)+val.substring(4,val.length()-4).replaceAll("[0-9]","*")+val.substring(val.length()-4,val.length());
}
}
/**
*前四后四显示
*@paramval
*@return
*/
protectedstaticStringgetMobile(Stringval){
if(org.apache.commons.lang.StringUtils.isBlank(val)||val.length()<9){
returnval;
}else{
returnval.substring(0,3)+val.substring(4,val.length()-3).replaceAll("[0-9]","*")+val.substring(val.length()-4,val.length());
}
}
/**
*星星显示
*@paramval
*@return
*/
protectedStringgetCsn(Stringval){
if(org.apache.commons.lang.StringUtils.isBlank(val)||val.length()<12){
returnval;
}else{
returnval.substring(0,2)+val.substring(2,val.length()-3).replaceAll("[0-9a-zA-Z]","*")+val.substring(val.length()-6,val.length());
}
}
}
以下代码是为了向SansitiveEncryptProcessor提供的解析表达式thymeleaf解析器,用来获取参数值的:
importorg.thymeleaf.context.ITemplateContext;
importorg.thymeleaf.engine.AttributeName;
importorg.thymeleaf.exceptions.TemplateProcessingException;
importorg.thymeleaf.model.IProcessableElementTag;
importorg.thymeleaf.standard.expression.IStandardExpression;
importorg.thymeleaf.standard.expression.IStandardExpressionParser;
importorg.thymeleaf.standard.expression.StandardExpressionParser;
importorg.thymeleaf.util.EvaluationUtils;
importorg.thymeleaf.util.StringUtils;
importjava.util.ArrayList;
importjava.util.List;
importstaticjava.util.Arrays.asList;
importstaticjava.util.Collections.unmodifiableList;
importstaticorg.thymeleaf.util.StringUtils.trim;
importstaticorg.thymeleaf.util.Validate.notEmpty;
importstaticorg.thymeleaf.util.Validate.notNull;
publicfinalclassThymeleafFacade{
privateThymeleafFacade(){
thrownewUnsupportedOperationException();
}
publicstaticStringgetRawValue(finalIProcessableElementTagelement,finalAttributeNameattributeName){
notNull(element,"elementmustnotbenull");
notNull(attributeName,"attributeNamemustnotbeempty");
finalStringrawValue=trim(element.getAttributeValue(attributeName));
notEmpty(rawValue,"valueof'"+attributeName+"'mustnotbeempty");
returnrawValue;
}
publicstaticStringgetRawValue(finalIProcessableElementTagelement,finalStringattributeName){
notNull(element,"elementmustnotbenull");
notEmpty(attributeName,"attributeNamemustnotbeempty");
finalStringrawValue=trim(element.getAttributeValue(attributeName));
notEmpty(rawValue,"valueof'"+attributeName+"'mustnotbeempty");
returnrawValue;
}
publicstaticObjectevaluateExpression(ITemplateContextarguments,Stringexpression)throwsTemplateProcessingException{
notNull(arguments,"argumentsmustnotbenull");
notEmpty(expression,"expressionmustnotbeempty");
finalIStandardExpressionParserparser=newStandardExpressionParser();
finalIStandardExpressionevaluableExpression=parser.parseExpression(arguments,expression);
returnevaluableExpression.execute(arguments);
}
publicstaticList
以上为后端代码实现内容,
页面标签使用方式:
card是需要加密的类型,我实现的代码里对身份证和手机号还有CSN加了密。
上面的内容讲的是标签传入数据并返回处理数据。
类似于if的标签属性,就不写了。
以上这篇Thymeleaf3.0自定义标签方言属性的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。