国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Thymeleaf 3.0 自定義標簽方言屬性,簡單實例??焖賹W習!

2019-11-08 18:51:26
字體:
來源:轉載
供稿:網友

此篇文章內容僅限于 描述 thy3.0 自定義標簽的說明,所以你在看之前,請先會使用它。

直奔主題,以下代碼是如何引用 第三方標簽的。說明: shrioDialect 是Shiro 官方為thy開發的自定義標簽工具。和jsp的一樣

RiskDialect 是我寫的自定義標簽

 <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>

首先看代碼:

 

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 官方 方言類

我定義的這個是為了做敏感數據加密用的。 這是前段代碼。

以下是實現自定義標簽方言 代碼:

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解析器,用來獲取參數值的:

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 的標簽屬性,就不寫了,由于在上班,就寫這么多,如果想了解更多,可以加QQ群 119170668:親自找我,我為你指導。群主就是我!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 普格县| 开鲁县| 江安县| 溧水县| 连江县| 温泉县| 巨鹿县| 赫章县| 贵港市| 峡江县| 定安县| 武清区| 安国市| 会泽县| 宁远县| 孙吴县| 浑源县| 万荣县| 隆林| 永宁县| 马公市| 大荔县| 汨罗市| 富锦市| 会东县| 临漳县| 三门峡市| 米林县| 张北县| 铜山县| 岫岩| 大厂| 县级市| 龙岩市| 舒城县| 乌拉特前旗| 荥阳市| 五大连池市| 弥渡县| 麦盖提县| 崇义县|