Java Web总结十六之一自定义标签

一、自定义标签简介

  1、为什么要使用自定义标签?

    自定义标签主要用于移除Jsp页面中的<%java%>代码。

  2、开发自定义标签的步骤:

    1)开发自定义标签处理类,该类需要实现SimpleTag接口/SimpleTagSupport类,重写doTag()方法。

    2)编写标签库描述符(tld)文件,在tld文件中对自定义标签进行描述,并放置在WEB-INF/目录下。

    3)完成以上操作,即可在JSP页面中导入和使用自定义标签。

二、自定义标签描述

  1、实现SimpleTag接口的标签通常称为简单标签。简单标签共定义5个方法:

    1)setJspContext方法

    2)setParent和getParent方法

    3)setJspBody方法

    4)doTag方法

  2、setJspContext方法:用于把JSP页面的pageContext对象传递给标签处理器对象。

  3、setParent方法:用于把父标签处理器对象传递给当前标签处理器对象。

  4、getParent方法:用于获得当前标签的父标签处理器对象。

  5、setJspBody方法:用于把代表标签体的JspFragment对象(即标签体内容)传递给标签处理器对象。

  6、doTag方法:用于完成所有的标签逻辑,包括输出、迭代、修改标签体内容等。在doTag方法中可以抛出javax.servlet.jsp.SkipPageException异常,用于通知WEB容器不再执行JSP页面中位于结束标记后面的内容。

三、建立TLD文件

  1、TLD是Tag Library
Definition的缩写,即标签库定义,文件的后缀是tld,每个tld文件对应一个标签库,一个标签库中可包含多个标签。通常我们可以到Web容器下复制一个标签库定义文件,并在此基础上进行修改即可。例如Tomcat
7.0,在webapps\examples\WEB-INF\jsp2路径下包含了一个jsp2-example-taglib.tld文件,这就是一个TLD文件的范例。将该文件复制到Web应用的WEB-INF/路径下,或WEB-INF的任意子路径下,并对该文件进行简单修改,修改后的.tld文件代码如下:


<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>simple</short-name>
<uri>http://java.sun.com/jstl/simple</uri>

<tag>
<name>IP</name>
<tag-class>com.gnnuit.web.jsp.tag.IpTag</tag-class>
<body-content>empty</body-content>
</tag>

<tag>
<name>Execute</name>
<tag-class>com.gnnuit.web.jsp.tag.ExecuteTag</tag-class>
<body-content>scriptless</body-content>
</tag>

<tag>
<name>skip</name>
<tag-class>com.gnnuit.web.jsp.tag.SkipTag</tag-class>
<body-content>scriptless</body-content>
</tag>

<tag>
<name>for1</name>
<tag-class>com.gnnuit.web.jsp.tag.For1Tag</tag-class>
<body-content>scriptless</body-content>
</tag>

<tag>
<name>up</name>
<tag-class>com.gnnuit.web.jsp.tag.UpTag</tag-class>
<body-content>scriptless</body-content>
</tag>

<tag>
<name>for2</name>
<tag-class>com.gnnuit.web.jsp.tag.For2Tag</tag-class>
<body-content>scriptless</body-content>

<attribute>
<name>count</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>

</tag>

<tag>
<name>for3</name>
<tag-class>com.gnnuit.web.jsp.tag.For3Tag</tag-class>
<body-content>scriptless</body-content>

<attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>

<attribute>
<name>begin</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>

<attribute>
<name>end</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>

<attribute>
<name>step</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>

</tag>

<tag>
<name>referer</name>
<tag-class>com.gnnuit.web.jsp.tag.ReferenceTag</tag-class>
<body-content>scriptless</body-content>

<attribute>
<name>url</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>

<attribute>
<name>error</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>

  2、taglib下有如下三个子元素:

    1)tlib-version:指定该标签库实现的版本,这是一个作为标识的内部版本号,对程序没有太大的作用。

    2)short-name:该标签库的默认短名,该名称通常也没有太大的用处。

    3)uri:这个属性非常重要,它指定标签库的URI,相当于指定该标签库的唯一标识,JSP页面中使用标签库时就是根据该URI属性来定位标签库的。

  3、taglib元素可以包含多个tag元素,每个tag元素定义一个标签,tag元素下允许出现如下常用子元素。

    1)name:该标签库的名称,这个子元素很重要,JSP页面中就是根据该名称来使用此标签的。

    2)tag-class:指定标签的处理类,这个子元素很重要,它指定了标签由哪个标签处理类来处理。

    3)body-content:这个子元素也很重要,它指定标签体内容。该子元素的值可以是如下几个:

      a、tagdependent:指定标签处理类自己负责处理标签体。

      b、empty:指定该标签只能作为空标签使用。

      c、scriptless:指定该标签的标签体可以是静态HTML元素、表达式语言,但不允许出现JSP脚本。

      d、JSP:指定该标签的标签体可以使用JSP脚本。实际上该值不可以使用。

      e、dynamic-attributes:指定该标签是否支持动态属性。只有当定义动态属性标签时才需要该子元素。

  4、对于有属性的标签,需要为<tag.../>元素增加<attribute.../>子元素,每个attribute子元素定义一个标签属性。<attribute.../>子元素通常还需要指定如下几个子元素。

    1)name:设置属性名,子元素的值时字符串内容。

    2)required:设置该属性是否为必须属性,该子元素的值时true或false。

    3)fragment:设置该属性是否支持JSp脚本、表达式等动态内容,子元素的值是true或false。

四、案例:自定义标签的开发步骤:

1 写一个标签处理类
//标签处理类
public class IpTag implements SimpleTag
{
private PageContext pageContext;
//Web容器调用NO1
public void
setJspContext(JspContext pc)
{
System.out.println("setJspContext()");
pageContext = (PageContext)
pc;
}
//Web容器调用NO2
public void doTag() throws JspException,
IOException
{
System.out.println("doTag()");
//取得HttpServletRequest请求对象
HttpServletRequest
request = (HttpServletRequest)
pageContext.getRequest();
//取得客户端的IP地址
String ip =
request.getRemoteAddr();
//取得out(JspWriter)对象
JspWriter out =
pageContext.getOut();
//向浏览器输出
out.write("<font size=‘44‘
color=‘red‘>"+ip+"</font>");
}
...
}

2 在/WEB-INF/目录下,写一个*.tld文件,目的是让Web容器知道自定义标签和标签处理类的对应关系
<?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>simple</short-name>

<uri>http://java.sun.com/jsp/jstl/simple</uri>
<tag>

<name>ip</name>

<tag-class>cn.itcast.web.jsp.tag.IpTag</tag-class>

<body-content>empty</body-content>

</tag>
</taglib>

3 在JSP页面中,通过<%@taglib%>指令引用标签库
<%@ page language="java"
pageEncoding="UTF-8"%>
<%@ taglib
uri="http://java.sun.com/jsp/jstl/simple" prefix="simple" %>
<!DOCTYPE
HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>

<body>
客户端IP为:<simple:ip/>

</body>
</html>

4 部署web应用,访问simple.jsp即可

Java Web总结十六之一自定义标签,布布扣,bubuko.com

时间: 2024-10-13 00:17:53

Java Web总结十六之一自定义标签的相关文章

java web 学习十六(JSP指令)

一.JSP指令简介 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令: page指令 Include指令 taglib指令 JSP指令的基本语法格式:<%@ 指令 属性名="值" %> 例如: 1 <%@ page contentType="text/html;charset=gb2312"%> 如果一个指令有多个属性,

Java Web总结十八文件的上传和下载

一.实现Web开发中的文件上传功能,需完成如下两步操作: 1.在web页面中添加上传输入项. 2.在Servlet中读取上传文件的数据,并保存到本地硬盘中. 二.如何在web页面中添加上传输入项? 1.<input type="file">标签用于在web页面中添加文件上传输入项,设置文件上传输入项时须注意: 1)必须设置input输入项的name属性,否则浏览器将不会发送上传文件的数据. 2)必须把form的enctype属性值设为multipart/form-data.

201671010140. 2016-2017-2 《Java程序设计》java学习第十六周

java学习第十六周         本周对十三章:"部署java应用程序"进行了课堂学习,在老师思路牵引下,对这一章知识进行学习,对实例程序运行和注释,对比课前对书本上知识的浅显预习,半知半解,课堂学习后,对这部分知识的理解也更加深入,尤其是在JAR文件这部分,感觉掌握的不错,对Java程序为何要打包成JAR文件,如何去做都有了进一步学习,认知,之前并不理解如何使用jar程序制作JAR文件,在课堂上同学的演示下,也理解了这部分知识.在对JAR文件中的包的密封,属性映射等方面的知识掌握

Java Web项目发布及使用自定义域名

详细讲解的网址: http://wenku.baidu.com/link?url=-ACZxKUcfrbhrMRUP3Ov-Q_c-Q9JPrA9D1fzHjHuJsWwZfRsVDVQ2qBtoY7Ly5Os_iNgQTIjepSxK5DGEl1OF2UM1hjXnxNMlL6l5tdNXpS Java Web项目发布及使用自定义域名的方法: 第一步:拷贝Java Web项目工程名至Tomcat7.x安装目录/webapps下:如下 C:\WebServer\apache-tomcat-7.0

Java web基础总结九之—— jsp标签

Java web基础总结九之-- jsp标签 JSP标签也称之为Jsp Action,在前面讲过,jsp的设计目的就是作为表现层.我们希望JSP页面仅用作数据显示模块,不要嵌套任何java代码引入任何业务逻辑,但在实际开发中不引入一点业务逻辑是不可能的,但引入业务逻辑会导致页面出现难看java代码.jsp的标签就是为了解决这个问题.所以jsp页面中也内置了一些标签(这些标签叫做jsp标签),开发人员使用这些标签可以完成页面的一些业务逻辑.我们也可以开发自定义标签,使jsp页面不出现一行java代

Java Web总结十九Filter过滤器

一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,Web开发人员通过Filter技术,对Web服务器管理的所有Web资源:例如Jsp,Servlet,静态图片文件或静态HTML文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.自动登录.压缩响应信息等一些高级功能. Servlet API中提供了一个Filter接口,开发Web应用时,如果编写的Java类实现了这个接口,则把这个Java类称之为过滤器Filter.通过

Java web基础总结六之—— Cookie与Session

Java web基础总结六之-- Cookie与Session 当我们在使用浏览器与服务器进行会话的过程中,就必然会产生一些数据.这个时候就需要对数据进行保存.比如常见的购物网站购物车信息的保存.保存客户端与服务器会话数据的两种技术是Cookie与Session. 一.Cookie 1.什么是Cookie? Cookie是保存在客户端的,以name,value的形式保存.当用户使用浏览器访问服务器产生数据时,服务器程序把每个用户的数据以cookie的形式写给用户各自的浏览器.当用户使用浏览器再去

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第七十六章:静态.非静态内部类访问权限 下一章 "全栈2019"Java第七十七章:抽象内部类与抽象静态内部类详解 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"J

“全栈2019”Java多线程第二十六章:同步方法生产者与消费者线程

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第二十六章:同步方法生产者与消费者线程 下一章 "全栈2019"Java多线程第二十七章:Lock获取lock/释放unlock锁 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorha