Java EE入门教程系列第二章JSP(六)——JSP标准标签和自定义标签的配置与使用

2.6 JSP的标签

2.6.1 标签简介

标签就是把一段具体业务的Java代码封装起来,然后以标记语言的形式在页面文件中对它进行调用,增强页面文件和Java程序的独立性。

目前标签库有两种形式:标准标签库和自定义标签

JSP标准标签(JSTL)是一个可以实现Web应用程序中常用功能的定制标签库集,这些功能包括迭代和条件判断、数据管理格式化、XML操作,以及数据库访问等,就像是一个库函数,是事先定义好的东西,开发者可以直接使用其中的标签。

自定义标签是指用户可以根据自己的业务需求,把一些java语言写出来的业务程序封装在标签里,形成自己的标签库。

从标签的使用形式上看,它是以XML形式表示的JSP语言元素,可以理解为是对JSP标准动作标记的一种扩展。

2.5.2 标准标签库JSTL

无论什么版本,一般来说,标准标签库都需要下载两个安装包:jstl.jar和standard.jar,必须把它们放到自己项目中的classpath中才可以用。

如果页面需要使用标签库,则需要在每个JSP文件头部包含<taglib>标签,格式如下:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

具体配置步骤:

从官方下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/下载 jakarta-taglibs-standard-1.1.2.zip 包并解压,将 jakarta-taglibs-standard-1.1.2/lib/ 下的两个 jar 文件:standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下

接下来可以配置web.xml也可以不配置,因为我看的教材接下来没有详细叙述,所以我暂且不配置,如果之后有地方需要深入学习,再来补充。

创建测试代码jspc1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id="date" class="java.util.Date"/>
<c:out value="${date}"/>
</body>
</html>

截图:

2.6.3 自定义标签

前面介绍过,标签内包含的其实是一个java程序应用。因此,要创建一个自定义标签,首先需要建立一个java文件,这个文件就是标签所封装的功能,然后还要创建一个扩展名为.tld的标签库描述符文件,它的作用相当于建立一个自己的标签库,并由它把java文件和具体的标签名关联起来,然后用户就可以在JSP页面中调用了。

要注意的是,这几个文件在eclipse中创建的位置,因为位置问题找错了一个晚上,所以大家一定要先看下面的位置布局。

举例:第一步SayHi.java

这一步我们要先创建一个包,在这个包里创建java程序,因为eclipse项目中的java程序都有个默认包,但是默认包在配置中没法调用会产生错误。

这里是我创建好的情况,cy是我新创的包,没创建好的时候这里显示的是default package,右键—NEW-package,在名字一栏填写cy,然后右键这个包建立java程序SayHi.java(就是一个实现父类方法的过程,这个程序就是我们要封装的功能)

package cy;

import javax.servlet.jsp.tagext.TagSupport;
import java.io.*;
import javax.servlet.jsp.JspWriter;
public class SayHi extends TagSupport{
	public int doStartTag() {
		try {
		JspWriter	JspWriterOutput=pageContext.getOut();
		JspWriterOutput.print("Hi");
		}catch(IOException ioEx) {
			System.out.println(ioEx);
		}
		return(SKIP_BODY);
	}
	public int doEndTag() {return EVAL_PAGE;}
}

第二步  firsttlib.tld

位置是在WEB-INF下建立的,右键new——other,选择XML file,在文件名填写firstlib.tld

代码为

<?xml version="1.0" encoding="UTF-8"?>
<!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>hi</short-name>
  <uri>/WEB-INF/firstlib.tld</uri>
  <tag>
    <name>sayHi</name>
    <tag-class>cy.SayHi</tag-class>
    <body-content>empty</body-content>
    <small-icon></small-icon>
    <large-icon></large-icon>
    <description></description>
    <example></example>
  </tag>
</taglib>

其实看标签名就能大致理解他们的作用了

第三步,创建hi.jsp 进行使用,这个文件的位置和之前创建jsp文件的位置没有区别

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib prefix="hi" uri="/WEB-INF/firstlib.tld" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>引用标签库</h1>
<hi:sayHi/>
</body>
</html>

项目整体结构为:

结果截图:

自定义标签的原理

1)当服务器打开时,就会加载WEB-INF下的资源文件,包括web.xml 和 tld文件,把它们加载到内存

2)我们在浏览器输入http://localhost:8080/JSPLab/hi.jsp来访问jsp页面

3)服务器读取jsp里的内容,当读到

  <%@ taglib prefix="hi" uri="/WEB-INF/firstlib.tld" %>

这一句的时候,就会在内存中找是否存在uri为/WEB-INF/firstlib.tld的tld文件,找不到就会报错

4)继续读取jsp页面,读到<hi:sayHi/>这个标签的时候,就会通过uri去找到tld文件,在tld文件中找到mytab是否被定义,是的话就得到它的tag-class的内容,然后去找到它对应的标签处理程序

5)实例化标签处理程序,利用生成的对象调用它里面的方法

这里服务器对标签处理程序里的方法也有一定的调用顺序

A)void setPageContext(PageContext pc)  --传入pageContext对象

B)void setParent(Tag t)              --如果有父标签,传入父标签对象,如果没有,则传入null

C)int doStartTag()                 --开始执行标签时调用。

D)int doEndTag()                --结束标签时调用

E)void release()                  --释放资源

如果你没有重写上面的方法,系统将会调用它的父类里的方法~

还有一种改进的简单标签方法,这一篇http://www.cnblogs.com/vmax-tam/p/4145334.html很不错,可以看看实现原理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值