springboot+thymeleaf3.0自定义方言

版权声明:作者:她如花似玉 转载请标明出处,原文地址: http://blog.csdn.net/qq_32566003 https://blog.csdn.net/qq_32566003/article/details/84716685

为啥不用jsp自定义标签

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

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

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

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


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中添加

@Bean
    public TagDialect tagDialect(){
        return new TagDialect();
    }

页面引用
在顶部的html中
html01.pnghtml01.png

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

猜你喜欢

转载自blog.csdn.net/qq_32566003/article/details/84716685