JSP2自定义标签

为什么要使用自定义标签呢?
主要是为了取代丑陋的jsp脚本。
在jsp2中开发标签库需要以下几个步骤:
1、开发自定义标签处理类
2、建立一个*.tld文件,每个tld文件对应一个标签库,每个标签库可包含多个标签
3、在jsp文件中使用自定义标签

1、开发自定义标签类

要求:
1、标签类若有属性,则必须有getter和setter方法
2、重写doTag方法
3、继承父类:javax.servlet.jsp.tagext.SimpleTagSupport
例如:
\src\helloworld.java

public class HelloWorld extends SimpleTagSupport
{
//该标签负责在页面上输出helloworld
public void doTag()throws JspException,IoException
{
getJspContext().getOut().write("helloworld"+new java.util.Date());
}
}
建立TLD文件

标签库定义文件根元素taglib,可以包含多个tag子元素,每个tag定义一个标签。
如下自定义一个标签库:
\src\mytaglib.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib 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"
    version="2.0">
    <tlib-version>1.0</tlib-version>
    <short-name>MyTaglib</short-name>
    <uri>MyTaglib</uri>
    <tag>
        <name>helloWorld</name>
        <tag-class>\src\helloworld.java</tag-class>
        <!--定义标签体为空-->
        <body-content>empty</body-content>
    </tag>
</taglib>

taglib下有如下三个子元素
1、tlib-version:指定该标签库实现的版本,没有太大的用处。
2、short-name:该标签库的默认短名,没啥用
3、uri:非常重要,该标签库的唯一标识,通过它找到使用的标签库
tag元素定义一个标签,有以下几个常用子元素:
1、name:该标签的名称,jsp页面根据该名称使用该标签。
2、tag-class:指定标签的处理类
3、body-content:重要,它指定了标签体内容,该元素的值有

  • tagdependent:指定标签处理类子集处理标签体
  • empty:该标签只能作为空标签使用
  • scriptless:该标签的标签体可以是静态的HTML元素、表达式语言,但不允许出现jsp脚本
  • JSP:可以使用JSP脚本,JSP2规范中不再使用

4、dynamic-attributes:指定该标签体是否支持动态属性。

使用标签库

1、导入标签库
2、使用标签

导入标签库
<%@ taglib uri="MyTaglib" prefix="s" %>

uri就是标签库中的URI
prefix指定标签库前缀,即在使用标签时使用该前缀将由此标签库处理

使用标签库

<前缀:标签名 属性名=属性值
属性名=属性值
·······>
<标签体/>
</前缀:标签名>
属性和标签体没有可省略
例子如下所示:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" %>
<%@ taglib uri="MyTaglib" prefix="s" %>
<html>
<head>
<meta content="text/html" charset="UTF-8" http-equiv="Content-Type">
<title>自定义标签库</title>
</head>
<body>							
<s:helloworld />
</body>
</html>

即可输出在标签处理类中的内容

2、带有属性的标签

介绍一个示例:
和简单标签一样,三大步骤
标签处理类,要有getter和setter方法
\src\mytaglib.java

//此标签类从数据库中取出数据放在表格
public class mytaglib extends SimpleSupport
//定义成员变量代表标签属性
private String driver;
private String url;
private String user;
private String pass;
private String sql;
//执行数据库访问的对象
private Connection conn=null;
private Statement stmt=null;
private ResultSet rs=null;
private ResultMetaDta rsmd=null;
//省略了getter和setter方法
·······
public void doTag()throws JSPException,IOException
{
try{
//注册驱动
Class.forName(driver);
//获取数据库连接
conn=DriverManager.getConnection(url,user,pass);
//创建Statement对象
stmt=conn.CreateStatement();
//执行查询
rs=stmt.executeQuery(sql);
rsmd=rs.getMetaData();
//获取列目数
int columnCount=rsmd.getColumnCount();
//获取页面输出流
Write out=getJspContext().getOut();
//在页面输出表格,在后面Struts2可以使用自带的标签库输出表格
out.write("<table border='1' bgColor='#9999cc' width='400'>");
//遍历结果集
while(rs.next())
{
out.write("<tr>");
for(int i=0;i<columnCount;i++)
{
out.write("<td>");
out.write(rs.getString(i));
out.write("</td>");
}
out.write("</tr>");
}
}catch(ClassNotFoundException e)
{
e.printStackTrace();
throw new JspExcepton("自定义标签错误"+e.getMessage());
}catch(SQLException e)
{
e.printStackTrace();
throw new JspException("自定义标签错误"+e.getMessage());
}
finally{
try
{
if(rs!=null)
rs.close();
if(stmt!=null)
stmt.close();
if(conn!=null)
conn.close();
}catch(SQLException e)
{
e.printStackTrace();
}
}
}

建立tld标签库
带有属性的标签库配置与普通标签库有所不同
在上面的标签库中增加一个标签
\src\mytaglib.tld

<!--定义第二个标签-->
<tag>
<name>query</name>
<tag-class>src.mytaglib</tag-class>
<body-content>empty</body-content>
<!-- 定义属性-->
<attribute>
<name>driver</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
<attribute>
<name>url</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
<attribute>
<name>user</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
<attribute>
<name>pass</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
<attribute>
<name>sql</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
</tag>

required:设置该属性是否是必须属性
fragment:设置该属性是否支持JSP,表达式等动态内容
使用标签
主要代码

<%@  taglib uri="MyTaglib"  prefix="s"%>
<!-- 省略html内容-->
····
<s:query 
             driver="com.mysql.jdbc.Driver"
             uri="jdbc:mysql://localhost:3306/mydata"
             user="root"
             pass="123456"
             sql="select *from student"
\>

不推荐在标签处理类中使用访问数据库,标签库是表现层,不该有业务逻辑
JSTL是sun提供的一套标签库。
DisplayTag是Apache组织下的一套开源标签库

3、带有标签体的标签

可以在标签内嵌入其他内容(包括静态的html内容和动态的JSP脚本)
下面以一个迭代器标签为例,每循环一次,为表格添加一行,并填入内容
标签处理类
\src\iterator.java

public class iterator extends SimpleTagSupport
{
private String jihe;   //将表现层集合的属性名赋给jihe
private String item;  //将集合中值作为属性值保存在此属性中
······  //省略getter和setter方法
public void doTag()throw JspException,IoException
{
Collection itemList=(Collection)getJspContext().getAttribute(jihe);
for(Object s:itemList)
{
getJspContext().setAttribute(item,s);  //将集合中的元素设置到page范围内
getJspBody().invoke(null);  //输出标签体,执行JspFragment对象的invoke方法
}
}
}

建立tld标签库
\src\mytaglib.tld

<!-- 在标签库中定义第三个标签-->
<tag>
<name>iterator</name>
<tag-class>src.iterator</tag-class>
<!--该标签的标签体可以是静态的HTML元素、表达式语言,但不允许出现jsp脚本-->
<body-content>scriptless</body-content>
<!-- 定义属性-->
<attribute>
<name>jihe</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
<attribute>
<name>item</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
</tag>

使用标签

···
<body>
<% 
//创建一个集合
List<String> a=new ArrayList<String>();
a.add("你的酒馆对我打了洋");
a.add("子弹在我心头上了膛");
a.add("请告诉我今后怎么抗")
//将List对象放入Page范围内
pageContext.setAttribute("a",a);
%>
<table border="1" bgcolor="#aaaadd" width="300">
<s:iterator jihe="a"  item="item">
<tr>
<td>${pageScope.item}</td>
</tr>
</s:iterator>
</table>
</body>
4、以页面片段作为属性的标签

标签处理类
在标签处理类中定义一个JspFragment类型的属性,即表明该标签允许使用页面片段类型的属性
\src\fragmentTag.java

public class fragmentTag extends SimpleTagSupport
{
private JspFragment fragment;
//省略setter和getter方法
···
public void doTag()throw IoException,JspException
{
JspWriter out=getJspContext().getOut();
out.println("<div style='padding:10px;border:1px soild black;'>");
//调用并输出页面片段
fragment.invoke(null);
out.println("</div>");
}
}

建立tld标签库
\src\mytaglib.tld

<!-- 在标签库中定义第四个标签-->
<tag>
<name>fragment</name>
<tag-class>src.fragmentTag</tag-class>
<body-content>empty</body-content>
<!-- 定义属性-->
<attribute>
<name>fragment</name>
<required>true</required>
<fragment>true</fragment>
</tag>

使用标签
在使用标签,传入属性值时,要用到<jsp:attribute …>动作指令

···
<s:fragment>
<jsp:attribute name="fragment">
<!-- 动态的jsp页面片段-->
<s:helloworld/>
</jsp:attribute>
</s:fragment>

注意,由于标签体为空,所以<s:fragment></s:fragment>中只能有<jsp:attribute …>,注释都不允许

5、动态属性的标签

传入自定义的标签数量和标签名不确定
动态属性标签比普通标签多了两个额外的要求:
1、标签处理类要实现DynamicAttribute接口
2、配置标签时通过<dynamic-attribute…/>指定标签支持动态属性
标签处理类
\src\dynamicTag.java

public class dynamicTag extends SimpleTagSupport implements DynamicAttribute
{
//设置一个集合保存属性名
private ArrayList<String> keys=new ArrayList<String>();
//设置一个集合保存属性值
private ArrayList<String>values=new ArrayList<String>();
@Override
public void doTag()throw IoException,JspException
{
JspWriter out=getJspContext().getOut();
out.println("<ol>");
for(int i=0;i<keys.size();i++)
{
String key=keys.get(i);
Object value=values.get(i);
out.println("<li>"+key+"="+value+"</li>");
}
out.println("</ol>");
}
@Override
public void setDynamicAttribute(String uri,String localName,Object value)
{
//添加属性名
keys.add(localName);
//添加属性值
values.add(value);
}
}

建立tld标签库
\src\mytablib.tld

···
<tag>
<name>dynamic</name>
<tag-class>src.dynamicTag</tag-class>
<body-content>empty</body-content>
<dynamic-attributes>true</dynamic-attributes>
</tag>

使用标签

···
<s:dynamic firstatt="11" secondatt="222">
<s:dynamic oneatt="1111"  twoatt="2222" threeatt="3333">
Tag File的支持

Tag File是自定义标签的简易用法,无需定义标签处理类和标签库文件

1、建立一个tag文件

tag代替了标签处理类,格式如Jsp文件
Tag File有5个编译指令
1、taglib:用于导入其他标签库
2、include:用于导入其他jsp或者静态页面
3、tag:类似于page指令,用于设置页面编码等属性
4、attribute:设置自定义标签的属性
5、variable:用于设置自定义标签的变量
只有如下几个内置对象
request、response、session、application、config、out
与jsp脚本中对象对应
下面定义了一个简单的迭代器标签
/weballpication/iterator.tag

<%@tag pageEncoding="GBK" import="java.util.List"%>
<%@ attribute name="bgColor">
<table border="1" bgcolor="${bgColor}">
<% List <String> list=(List<String>request.getAtrribute("a"));
for(Object value:list)
{
%>
<tr>
<td><%=value></td>
</tr>
<%}%>
</table>
2、Jsp中使用标签
···
<!-- 导入标签库-->
<%@taglib prefix="s" tagdir="/weballpication/iterator" %>
···
···
<!--使用标签-->
List<String> list=new List<String>();
list.add("first");
list.add("second");
request.setAttribute("a",list);
<s:iterator bgColor="#99dd99">
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值