版权声明:作者:她如花似玉 转载请标明出处,原文地址: http://blog.csdn.net/qq_32566003 https://blog.csdn.net/qq_32566003/article/details/84716685
java版飞机大战代码
为啥不用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中
这里大家可以看到我是用来shiro的控制,但是没自由找到可以动态显示的,就想起jsp 的自定义标签发现thymeleaf3也有方言就是这样,希望对你有帮助