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很不错,可以看看实现原理。