1.为什么需要自定义标签?

jsp的简单标签其实就是jsp的自定义标签,主要作用就是移除jsp页面中的java代码,使得jsp页面只有标签和EL表达式,而没有java代码。利用自定义标签,可以使软件开发人员和页面设计人员合理分工,页面设计人员可以把精力集中在使用标签(html,xml或jsp)创建网站上,而软件开发人员则可以将精力集中在实现底层功能上面。

2.什么是自定义标签?

用户定义的一种自定义的jsp标记。当一个含有自定义标签的jsp页面被jsp引擎编译成servlet时,tag标签被转化成了对一个称为标签处理类的对象的操作。于是,当jsp页面被jsp引擎转化为servlet后实际上tag标签被转化成了对tag处理类的操作。

3.标签库API

标签库API定义在javax.servlet.jsp.tagext包中,

左边的三个接口Tag接口,IterationTag接口和BodyTag接口以及两个实现类TagSupport类和BodyTagSupport类为传统标签(导入传统标签,右击项目,Build Path->Add Libraries->MyEclipse Library->next->JSTL...Library),右边的一个接口SimpleTag接口和一个实现类SimpleTagSupport类为自定义标签。即所有标签处理器类实现了Tag接口的标签为传统标签,实现SimpleTag接口的标签为简单标签。简单标签可以实现传统标签的一切功能,而且开发起来更容易。开发自定义标签核心就是要编写处理器类,需要继承的就是SimpleTagSupport类。SimpleTagSupport类实现了SimpleTag接口。

标签的形式:

  • 空标签:<hello/>
  • 带有属性的空标签:<max num="3" num2="5"/>
  • 带有内容的标签:<greeting>hello</greeting>
  • 带有内容和属性的标签:<greeting name="Tom">hello</greeting>

4.自定义标签的开发与应用步骤

  • 编写完成标签功能的java类(标签处理器)
  • 编写标签库描述(tld)文件,在tld文件中对自定义标签进行描述
  • 在jsp页面中导入和使用自定义标签

示例如下:

编写完成标签功能的java类:

HelloSimpleTag.java

  1. package com.javaweb.tag;
  2.  
  3. import java.io.IOException;
  4. import javax.servlet.jsp.JspContext;
  5. import javax.servlet.jsp.JspException;
  6. import javax.servlet.jsp.tagext.JspFragment;
  7. import javax.servlet.jsp.tagext.JspTag;
  8. import javax.servlet.jsp.tagext.SimpleTag;
  9.  
  10. public class HelloSimpleTag implements SimpleTag {
  11.  
  12. @Override
  13. public void doTag() throws JspException, IOException {
  14. // TODO Auto-generated method stub
  15. System.out.println("doTag");
  16. }
  17.  
  18. @Override
  19. public JspTag getParent() {
  20. // TODO Auto-generated method stub
  21. System.out.println("getParent");
  22. return null;
  23. }
  24.  
  25. @Override
  26. public void setJspBody(JspFragment arg0) {
  27. // TODO Auto-generated method stub
  28. System.out.println("setJspBody");
  29. }
  30.  
  31. @Override
  32. public void setJspContext(JspContext arg0) {
  33. // TODO Auto-generated method stub
  34. System.out.println("setJspContext");
  35. }
  36.  
  37. @Override
  38. public void setParent(JspTag arg0) {
  39. // TODO Auto-generated method stub
  40. System.out.println("setParent");
  41. }
  42.  
  43. }

编写标签库描述(tld)文件,在tld文件中对自定义标签进行描述:

helloTag.tld

  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <taglib xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
  6. version="2.1">
  7. <!-- 描述TLD文件 -->
  8. <description>MyTag 1.1 core library</description>
  9. <display-name>MyTag core</display-name>
  10. <tlib-version>1.1</tlib-version>
  11. <!-- 建议在jsp页面上使用的标签的前缀 -->
  12. <short-name>koala</short-name>
  13. <!-- 作为tld文件的id,用来唯一标识当前的TLD文件,多个TLD文件的URI不能重复,通过jsp页面的taglib标签的uri属性来引用 -->
  14. <uri>http://www.com.koala/jsp/jstl/core</uri>
  15. <!-- 描述自定义的HelloSimpleTag标签 -->
  16. <tag>
  17. <!-- 标签的名字 -->
  18. <name>hello</name>
  19. <!-- 标签所在的全类名(.java文件所在的全类名) -->
  20. <tag-class>com.javaweb.tag.HelloSimpleTag</tag-class>
  21. <!-- 标签体的类型 -->
  22. <body-content>empty</body-content>
  23. </tag>
  24. </taglib>

在jsp页面中导入和使用自定义标签:

simpletag.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <!-- 导入标签库(描述文件) -->
  3. <%@taglib uri="http://www.com.koala/jsp/jstl/core" prefix="koala" %>
  4. <%
  5. String path = request.getContextPath();
  6. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  7. %>
  8.  
  9. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  10. <html>
  11. <head>
  12. <base href="<%=basePath%>">
  13.  
  14. <title>My JSP 'simpletag.jsp' starting page</title>
  15.  
  16. <meta http-equiv="pragma" content="no-cache">
  17. <meta http-equiv="cache-control" content="no-cache">
  18. <meta http-equiv="expires" content="0">
  19. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  20. <meta http-equiv="description" content="This is my page">
  21. <!--
  22. <link rel="stylesheet" type="text/css" href="styles.css">
  23. -->
  24.  
  25. </head>
  26.  
  27. <body>
  28. <koala:hello/>
  29. </body>
  30. </html>

在jsp中导入和使用自定义标签时需注意:

<%@taglib uri="http://www.com.koala/jsp/jstl/core" prefix="koala" %>对应于.tld文件中的<uri>http://www.com.koala/jsp/jstl/core</uri>和<short-name>koala</short-name>,<koala:hello/>对应于.tld文件中的<short-name>koala</short-name>和<name>hello</name>。

在上面的例子中,

①创建一个标签处理类,实现了SimpleTag接口

  1. public class HelloSimpleTag implements SimpleTag {}

②在WEB-INF文件夹下新建一个.tld为扩展名的xml文件,并考入固定的部分,并对description,display-name,tlib-version,short-name,uri做出修改

  1. <description>MyTag 1.1 core library</description>
  2. <display-name>MyTag core</display-name>
  3. <tlib-version>1.1</tlib-version>
  4. <!-- 建议在jsp页面上使用的标签的前缀 -->
  5. <short-name>koala</short-name>
  6. <!-- 作为tld文件的id,用来唯一标识当前的TLD文件,多个TLD文件的URI不能重复,通过jsp页面的taglib标签的uri属性来引用 -->
  7. <uri>http://www.com.koala/jsp/jstl/core</uri>

③在tld文件中描述自定义标签

  1. <tag>
  2. <!-- 标签的名字 -->
  3. <name>hello</name>
  4. <!-- 标签所在的全类名(.java文件所在的全类名) -->
  5. <tag-class>com.javaweb.tag.HelloSimpleTag</tag-class>
  6. <!-- 标签体的类型 -->
  7. <body-content>empty</body-content>
  8. </tag>

⑤在jsp页面上使用自定义的标签

>使用taglib指令导入标签库描述文件:

  1. <%@taglib uri="http://www.com.koala/jsp/jstl/core" prefix="koala" %>

>使用自定义的标签

  1. <body>
  2. <koala:hello/>
    </body>

5.带属性的自定义标签

5.1 先在标签处理器中定义setter方法,建议把所有的属性类型都设置为String类型。

  1. package com.javaweb.tag;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.jsp.JspContext;
  6. import javax.servlet.jsp.JspException;
  7. import javax.servlet.jsp.JspWriter;
  8. import javax.servlet.jsp.PageContext;
  9. import javax.servlet.jsp.tagext.JspFragment;
  10. import javax.servlet.jsp.tagext.JspTag;
  11. import javax.servlet.jsp.tagext.SimpleTag;
  12.  
  13. public class HelloSimpleTag implements SimpleTag {
  14. private String value;
  15. private String count;
  16.  
  17. public void setCount(String count) {
  18. this.count = count;
  19. }
  20.  
  21. public void setValue(String value) {
  22. this.value = value;
  23. }
  24.  
  25. //标签体的逻辑实际应该编写到此方法中
  26. @Override
  27. public void doTag() throws JspException, IOException {
  28. JspWriter out=pageContext.getOut();
  29. int c=0;
  30. c=Integer.parseInt(count);
  31. for(int i=0;i<c;i++){
  32. out.print((i+1)+":"+value);
  33. out.print("<br>");
  34. }
  35. }
  36.  
  37. @Override
  38. public JspTag getParent() {
  39. System.out.println("getParent");
  40. return null;
  41. }
  42.  
  43. @Override
  44. public void setJspBody(JspFragment arg0) {
  45. System.out.println("setJspBody");
  46. }
  47. private PageContext pageContext;
  48. //JSP引擎调用,把代表jsp页面的PageContext对象传入
  49. @Override
  50. public void setJspContext(JspContext arg0) {
  51. System.out.println(arg0 instanceof PageContext);
  52. this.pageContext=(PageContext)arg0;
  53. }
  54.  
  55. @Override
  56. public void setParent(JspTag arg0) {
  57. System.out.println("setParent");
  58. }
  59.  
  60. }

5.2 在tld文件中描述属性

  1. <attribute>
  2. <!-- 属性名,需和标签处理器类的setter方法定义的属性相同 -->
  3. <name>value</name>
  4. <!-- 该属性是否被必须 -->
  5. <required>true</required>
  6. <!-- rtexprvalue:runtime expression value 当前属性是否可以接受运行时表达式的动态值 -->
  7. <rtexprvalue>true</rtexprvalue>
  8. </attribute>
  9.  
  10. <attribute>
  11. <name>count</name>
  12. <required>true</required>
  13. <rtexprvalue>true</rtexprvalue>
  14. </attribute>

5.3 在jsp页面中使用属性

属性名同tld文件中定义的名字(<name>value</name>)。

  1. <koala:hello value="koala" count="8"/>

搜索微信公众号“程序员考拉”欢迎关注!

  1.  

来看看javaweb的自定义标签的更多相关文章

  1. JavaWeb -- Jsp 自定义标签的使用

    Jsp中不要有一行Java代码, 需要的Java代码都要封到自定义标签中. 自定义标签的作用: a.  自定义标签除了可以移除jsp页面java代码外,它也可以实现以上功能. b.  控制jsp页面某 ...

  2. javaweb框架--自定义标签与freemaker结合

    http://blog.csdn.net/myfmyfmyfmyf/article/details/8960299 很有用但是不不知道怎么说,写个例子,总之方便多了,并且容易管理,重复利用强 1.自定 ...

  3. Javaweb自定义标签

    项目中用到自定义的标签文件,但是却在web.xml中没有看到相关的标签配置,原来如果web应用使用servelet2.4以上的版本就不需要在web.xml中定义了,servelet会自动加载tld文件 ...

  4. javaweb学习总结(二十三)——jsp自定义标签开发入门

    一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 packag ...

  5. javaweb(二十三)——jsp自定义标签开发入门

    一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 packag ...

  6. javaweb基础(23)_jsp自定义标签

    一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 packag ...

  7. javaweb回顾第八篇如何创建自定义标签

    前言:在javaweb开发中自定义标签的用处还是挺多的.今天和大家一起看自定义标签是如何实现的. 1:什么是标签 标签是一种XML元素,通过标签可以使JSP页面变得简介易用,而且标签具有很好的复用性. ...

  8. Javaweb学习笔记——(十三)——————JSTL、JSTL核心标签库、自定义标签、有标签体的标签、带有属性的标签、MVC、Javaweb三层框架

    JSTLApache提供的标签库 jar包:jstl-1.2.jar,如果传MyEclipse,他会在我们导入jar包,无需自己导入,如果没有使用MyEclipse那么需要自行导入.--------- ...

  9. javaweb学习6——自定义标签

    声明:本文只是自学过程中,记录自己不会的知识点的摘要,如果想详细学习JavaWeb,请到孤傲苍狼博客学习,JavaWeb学习点此跳转 本文链接:https://www.cnblogs.com/xdp- ...

随机推荐

  1. [BZOJ2049] [SDOI2008] 洞穴勘测

    题目描述 辉辉热衷于洞穴勘测. 某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假 ...

  2. Mysql创建、删除用户[转]

    MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 登录MYSQL: @>mysql -u root -p @>密码 ...

  3. win10安装express遇到的问题。

    昨天在centos上成功安装了express,今天想在win10上面装一个,死活安装不了 express可以正常安装,但是每次安装express-generator的时候一直报错 659 silly ...

  4. [转]iOS系列译文:深入理解 CocoaPods

    Cocoapods是 OS X 和 iOS 下的一个第三方库管理工具.你能使用CocoaPods添加被称作“Pods”的依赖库,并轻松管理它们的版本,而不用考虑当前的时间和开发环境. Cocoapod ...

  5. opencv学习笔记(七)---图像金字塔

    图像金字塔指的是同一图像不同分辨率的子图的集合,有向下取样金字塔,向上取样金字塔,拉普拉斯金字塔....它是图像多尺度表达的一种,最主要的是用于图像的分割 向下取样金字塔指高分辨率图像向低分辨率图像的 ...

  6. openstack的部署与运维

    来公司几个月了,除了搭建了kvm虚拟机,使用3台虚拟机组合成一个openstack的网络环境.还没有正式将openstack搭建起来过.时间都在开发web程序.不过openstack也是要学习的.只能 ...

  7. 大数据平台-java、mysql安装

    补充: 对于ssh登录不是特定端口22的,进行文件修改 vim /etc/ssh/sshd_config Port 61333 简化后序命令输入,修改文件如下:  一.java环境安装 一共5台服务器 ...

  8. 高阶篇:4.4)FMEA手册的疑问与不足(个人观点)

    本章目的:如题,述说FMEA手册第四版的疑问与不足. 1.前言 作者接触FMEA,并真正将其作为可靠性设计方法,也是在近几年的时候,所以不能说算是一个FMEA专家吧. 但作者也有一些自己的优势,就是自 ...

  9. Java - n的阶乘计算

    用递归方法,求10!的阶乘 分析: f(n) = n * f(n-1)           n != 1        -----        递推公式 f(n) = 1               ...

  10. 3dsmax2018卸载/安装失败/如何彻底卸载清除干净3dsmax2018注册表和文件的方法

    3dsmax2018提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装3dsmax2018失败提示3dsmax2018安装未完成,某些产品无法安装,也有时候想重新 ...