在项目中,涉及到细粒度的权限管理,需要控制按钮级别的显示与隐藏,由于需要达到可配置,不能写死在页面中,因此想到了使用自定义标签来实现。
实现的大概思路是,在后台判断用户是否具有相应的按钮权限,如果有,则显示按钮,如果没有则隐藏按钮。(这种方法对于安全性要求不够高,因为懂得编程的人都能够通过执行特定的方法来调用后端接口,因此需要在后端继续做一层用户的判断,此处不多介绍。)
一、新建java web项目
此处不做过多解释,有需要查看我另一篇介绍ssm 框架整合的文章,很详细,点击文章链接进入详细介绍。
此演示项目的结构如下:
二、定义标签的逻辑处理java文件
因为自定义标签需要实现特定的功能,因此不得不在java做一些逻辑业务的处理。在此演示的目的是述说如何自定义标签,因此这里也不做相应的逻辑处理,而降我们最熟悉的 hello world 换成 hello my tag 输出在页面上。废话不多说,直接上代码,代码中有介绍。
HelloTag.java
package com.mytag; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.TagSupport; import java.io.IOException; public class HelloTag extends TagSupport { @Override public int doStartTag() throws JspException { PageContext pg = super.pageContext; JspWriter out=pg.getOut(); try{ out.println("hello my tag"); }catch(IOException e){ } // 此处return返回值标记接下来需要做什么样的效果处理。有以下几种: // 1、EVAL_BODY_INCLUDE:把Body读入存在的输出流中,doStartTag()函数可用 // 2、EVAL_PAGE:继续处理页面,doEndTag()函数可用 // 3、SKIP_BODY:忽略对Body的处理,doStartTag()和doAfterBody()函数可用 // 4、SKIP_PAGE:忽略对余下页面的处理,doEndTag()函数可用 return TagSupport.EVAL_BODY_INCLUDE; } }
三、定义tag 标签 tld文件
自定义标签内容如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>mytag</short-name> <!-- 以下定义的uri用于在jsp页面中引入自定义标签库,需要特别注意一致。--> <uri>mytag-lib</uri> <tag> <name>hello</name> <!-- 标签在jsp中使用名称 --> <tag-class>com.mytag.HelloTag</tag-class><!-- 标签指向的class文件 --> <body-content>empty</body-content><!-- 标签内容为空 --> </tag> </taglib>
有了java和tld文件,这样一个自定义标签就定义好了。
四、使用自定义标签
自定义标签和jstl标签的使用方法一样,首先需要引入标签所在的库,然后自定义别名,然后在jsp页面进行引用。
index.jsp如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%-- 以下是引入自定义标签的库,注意uri 的地址是在tld 中定义的uri 的值,不能随意写一个uri,会出现位置错误。--%> <%@taglib prefix="mytag" uri="mytag-lib" %> <html> <head> <title>$Title$</title> </head> <body> <%-- 自定义标签使用 --%> tag 标签输出内容:<mytag:hello></mytag:hello> </body> </html>
如上所示,需要注意的注释都已经注明。
启动项目,页面输出内容:
出现想要的结果,证明自定义标签成功。
五、出现的错误及解决办法
1、org.apache.jasper.JasperException: java.lang.ClassNotFoundException: org.apache.jsp.index_jsp
此时我的jsp页面如下:
问题原因:网上有很多的说是自己在项目引用的javax.servlet库和Tomcat 本身的版本冲突导致的,博主为此困扰很多时间,最后问题定位的原因在于 在jsp中引入的错误。在第三步中红色字体标记的注释就是博主为此特地需要提醒的地方,一定在jsp 中使用在这里定义的uri作为引入路径,网上很多人说通过/WEB-INF/taglib 来引入,这是错误的。将其修改为uri中的路径,问题得到解决。运行结果如下:
项目源码已经上传至csdn,点击下载