【 <一> 炼丹初探:JavaWeb 的起源与基础】之 JSP 标签库:自定义标签的开发与应用
<前文回顾>
<今日更新>
一、JSP 标签库:开发者的“瑞士军刀”
JSP 标签库[1],说白了就是一套“瑞士军刀”,里头装着各种实用的工具,比如 JSTL、自定义标签 这些。JSP 标签库能让开发者在 JSP 页面里用标签代替 Java 代码,写起来“顺手”,看起来“清爽”。
1. JSTL:标准标签库
JSTL[2] 是 JSP 的标准标签库,里头装着各种常用的标签,比如循环、条件判断、格式化啥的。JSTL 虽然好用,但有时候“不够用”,这时候就得用自定义标签了。
Jsp Code |
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:forEach var="item" items="${list}"> <p>${item}</p> </c:forEach> |
2. 自定义标签:开发者的“独门武器”
自定义标签是开发者自己写的标签,能“量身定制”功能,比如分页、权限验证啥的。自定义标签虽然“复杂”,但用起来“顺手”,写起来“清爽”。
Jsp Code |
<%@ taglib prefix="my" uri="/WEB-INF/tags/mytags.tld" %> <my:pagination page="${page}" /> |
二、自定义标签的“开发流程”
自定义标签的开发流程,说白了就是“三步走”:写标签类、写标签描述文件、在 JSP 里用标签。
1. 写标签类
标签类是自定义标签的“核心”,里头写着标签的逻辑。标签类得继承 TagSupport 或者 SimpleTagSupport,重写 doStartTag 或者 doTag 方法。
Jsp Code |
public class PaginationTag extends TagSupport { private int page;
public void setPage(int page) { this.page = page; }
public int doStartTag() throws JspException { try { JspWriter out = pageContext.getOut(); out.print("<div class='pagination'>"); out.print("<a href='?page=" + (page - 1) + "'>上一页</a>"); out.print("<a href='?page=" + (page + 1) + "'>下一页</a>"); out.print("</div>"); } catch (IOException e) { throw new JspException(e); } return SKIP_BODY; } } |
2. 写标签描述文件
标签描述文件是自定义标签的“说明书”,里头写着标签的名字、类名、属性啥的。标签描述文件得放在 WEB-INF/tags 目录下,后缀是 .tld。
XML Code |
<taglib> <tlib-version>1.0</tlib-version> <short-name>my</short-name> <uri>/WEB-INF/tags/mytags.tld</uri> <tag> <name>pagination</name> <tag-class>com.example.PaginationTag</tag-class> <body-content>empty</body-content> <attribute> <name>page</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib> |
3. 在 JSP 里用标签
在 JSP 里用自定义标签,得先引入标签库,再用标签。引入标签库用 <%@ taglib %>,用标签就跟用 HTML 标签一样。
Jsp Code |
<%@ taglib prefix="my" uri="/WEB-INF/tags/mytags.tld" %> <my:pagination page="${page}" /> |
三、自定义标签的“复杂使用示例”
自定义标签虽然“复杂”,但用起来“顺手”,写起来“清爽”。比如,用自定义标签实现分页、权限验证啥的,都能“搞定”。
1. 分页标签
分页标签是自定义标签的“经典应用”。比如,用分页标签显示分页链接,用户点一下就能翻页。
Java Code |
public class PaginationTag extends TagSupport { private int page; private int total;
public void setPage(int page) { this.page = page; }
public void setTotal(int total) { this.total = total; }
public int doStartTag() throws JspException { try { JspWriter out = pageContext.getOut(); out.print("<div class='pagination'>"); if (page > 1) { out.print("<a href='?page=" + (page - 1) + "'>上一页</a>"); } for (int i = 1; i <= total; i++) { if (i == page) { out.print("<span>" + i + "</span>"); } else { out.print("<a href='?page=" + i + "'>" + i + "</a>"); } } if (page < total) { out.print("<a href='?page=" + (page + 1) + "'>下一页</a>"); } out.print("</div>"); } catch (IOException e) { throw new JspException(e); } return SKIP_BODY; } } |
Jsp Code |
<%@ taglib prefix="my" uri="/WEB-INF/tags/mytags.tld" %> <my:pagination page="${page}" total="${total}" /> |
2. 权限验证标签
权限验证标签是自定义标签的“高级应用”。比如,用权限验证标签控制页面元素的显示,用户没权限就“看不见”。
Java Code |
public class AuthTag extends TagSupport { private String role;
public void setRole(String role) { this.role = role; }
public int doStartTag() throws JspException { HttpServletRequest req = (HttpServletRequest) pageContext.getRequest(); HttpSession session = req.getSession(); String userRole = (String) session.getAttribute("role"); if (role.equals(userRole)) { return EVAL_BODY_INCLUDE; } else { return SKIP_BODY; } } } |
Jsp Code |
<%@ taglib prefix="my" uri="/WEB-INF/tags/mytags.tld" %> <my:auth role="admin"> <p>只有管理员能看到这段话,嗝~</p> </my:auth> |
四、自定义标签的“历史”:从 JSP 1.1 到 JSP 2.3
自定义标签从 JSP 1.1 开始就有了,虽然现在 JSP 2.3 已经“普及”了,但自定义标签的“核心功能”依然没变。
1. JSP 1.1:初代“瑞士军刀”
JSP 1.1 在 1999 年发布,自定义标签是它的“初代瑞士军刀”。虽然功能简单,但已经能满足大部分开发需求了。
2. JSP 2.0:引入 SimpleTag
JSP 2.0 在 2003 年发布,引入了 SimpleTag,让自定义标签的开发更加“简单”。SimpleTag 的引入,让自定义标签的“玩法”更加丰富。
Java Code |
public class MySimpleTag extends SimpleTagSupport { public void doTag() throws JspException, IOException { getJspContext().getOut().print("Hello, World!"); } } |
3. JSP 2.3:最后的“辉煌”
JSP 2.3 在 2013 年发布,是 JSP 的“最后版本”。虽然自定义标签的功能已经很强大了,但 JSP 的“辉煌”已经过去了,因为大家都开始用 Spring Boot、Vue.js 这些新技术了。
专有名词解释
- JSP 标签库:一套用于在 JSP 页面中代替 Java 代码的标签集合。
- JSTL:JavaServer Pages Standard Tag Library,JSP 的标准标签库,提供常用的标签功能。