一、使用背景
1、当JSP的内置标签和JSTL标签库中的标签都满足不了我们的业务需求时,我们就需要使用自定义标签来方便快捷地帮助我们完成业务需求。
2、自定义标签就是让我们以标签的形式在JSP页面中去调用Java代码,每一个标签在背后都对应一个标签处理器类,有时候我们需要一些个性化的需求,所以我们还需要在JSP动作标签以外,来自定义标签。
二、开发自定义标签
这里模拟地做一个权限控制的自定义标签,我们可以在页面使用该标签的时候,从页面传过来一个权限的主键ID,通过后台判断当前用户使用有此权限ID,来控制该按钮是否暴露给当前用户
- 1、编写一个普通的Java类,继承TagSupport类
package com.gyxy.goods.common.tag; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.TagSupport; /** * 自定义标签 * * @author lizhou * */ public class PermissionTag extends TagSupport { private static final long serialVersionUID = 1L; /** * 权限主键ID */ private String resourceId; /** * jsp内置对象,jsp页面的域对象 */ private PageContext pageContext; @Override public void setPageContext(PageContext pageContext) { this.pageContext = pageContext; } /** * 重写父类的doStartTag方法,这里就是自定义标签的核心了 */ @Override public int doStartTag() throws JspException { try { // 如果接收到的权限ID为hello,就输出:Hello World!!! if("hello".equals(resourceId)) { pageContext.getResponse().getWriter().write("Hello World!!!"); } // 否则输出:Sorry,No permission!!! else { pageContext.getResponse().getWriter().write("Sorry,No permission!!!"); } } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } return super.doStartTag(); } /** * getter方法 */ public String getResourceId() { return resourceId; } /** * setter方法 */ public void setResourceId(String resourceId) { this.resourceId = resourceId; } }
- 2、在WEB-INF目录下新建一个test.tld文件
<?xml version="1.0"?> <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"> <!-- 标签库的版本号 --> <tlib-version>1.0</tlib-version> <!-- 标签库的简称 --> <short-name>lizhouTagLibrary</short-name> <!-- 标签库的引用uri --> <uri>http://lizhou.com/jsp/mytag/core</uri> <tag> <!-- 标签的名称 --> <name>permissions</name> <!-- 对应的标签处理器地址 --> <tag-class>com.gyxy.goods.common.tag.PermissionTag</tag-class> <!-- 标签体内容的格式 --> <body-content>JSP</body-content> <attribute> <!-- 标签传递的参数名 --> <name>resourceId</name> <!-- 是否必须 --> <required>true</required> <!-- 是否能够利用JSP表达式 --> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
- 3、新建一个JSP文件,引入标签库
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://lizhou.com/jsp/mytag/core" prefix="lizhou"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>自定义标签测试页面</title> </head> <body> <lizhou:permissions resourceId="hello"></lizhou:permissions> </body> </html>
注意:需要在JSP文件中引入你的自定义标签库的地址,即:
<%@ taglib uri="http://lizhou.com/jsp/mytag/core" prefix="lizhou" %>
prefix="lizhou"是你的标签库的前缀,和JSTL中使用c作为前缀是一样的,引入的标签即为:
<lizhou:permissions resourceId="hello1"></lizhou:permissions>
三、启动项目,测试
当传递的 resourceId="hello"时,页面输出:
Hello World!!!
当传递的 resourceId="he"时,页面输出:
Sorry,No permission!!!
四、自定义标签控制内容显示或者隐藏
- 1、自定义标签的处理器类如下:
package com.gyxy.goods.common.tag; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.TagSupport; /** * 自定义标签 * * @author lizhou * */ public class PermissionTag extends TagSupport { private static final long serialVersionUID = 1L; /** * 权限主键ID */ private String resourceId; /** * 重写父类的doStartTag方法,这里就是自定义标签的核心了 */ @Override public int doStartTag() throws JspException { // 如果传递过来的权限ID为hello,则输出标签体内容 if("hello".equals(resourceId)) { return TagSupport.EVAL_BODY_INCLUDE; } // 否则隐藏标签体内容 return TagSupport.SKIP_BODY; } /** * getter方法 */ public String getResourceId() { return resourceId; } /** * setter方法 */ public void setResourceId(String resourceId) { this.resourceId = resourceId; } }
- 2、test.tld文件无变化
- 3、jsp页面为:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://lizhou.com/jsp/mytag/core" prefix="lizhou"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>自定义标签测试页面</title> </head> <body> <lizhou:permissions resourceId="he"> hello World!!! </lizhou:permissions> </body> </html>
- 4、测试
当传递的 resourceId="hello"时,页面输出:
Hello World!!!
当传递的 resourceId="he"时,页面输出为空,也就达到了我们控制按钮显示或隐藏的目的了
JavaWeb项目JSP中关于自定义标签的使用就已经全部结束,自定义标签可以帮助我们完成很多的事情,所以,很有必要认真学习一下。