自定义标签,顾名思义,就是自己定义的标签。那么我们为什么要自己定义一些标签呢?
我们知道,如果要在JSP中获取数据我们可以采用通过JSP的隐式对象request来获取相应的请求参数或者属性,也可以通过脚本<% Java 代码%>来进行相应的处理,当然还可以使用EL表达式进行相关数据的操作。
这里,我们主要来谈一下在JSP中使用自定义标签。那么我们为什么要自定义一些标签呢?我们知道,JSP中标签的使用使得Web应用的显示层与业务逻辑层分开。在JSP使用标签,可以移除JSP中的java代码使得JSP页面更加的整洁和便于维护。然而,在JSP中定义的一些标签又是有限的或者是我们所不需要的,这时,我们就可以同过自定义标签的形式将相应的操作封装在标签中,只需在JSP中调用相应的标签即可。这样就简化了我们的JSP页面也便于页面操作人员维护了。下面,我们就来了解一下自定义标签、如何定义自己的标签,以及在JSP中如何引用自己定义的标签。
自定义JSP标签就是程序员定义的一种JSP标签,这种标签把那些信息显示逻辑封装在一个单独的Java类中,通过一个XML文件来描述它的使用。当页面中需要使用类似的显示逻辑时,就可以在页面中插入这个标签,从而完成相应的功能。
使用自定义标签,可以分离程序逻辑和表示逻辑,将Java代码从HTML中剥离,便于美工维护页面;自定义标签也提供了可重用的功能组件,能够提高工程的开发效率。
自定义标签主要用于移除Jsp页面中的java代码。
当一个含有自定义标签的JSP页面被JSP引擎(Web容器)转译成Servlet时,JSP引擎遇到自定义的标签,会把这个自定义标签转化成对一个称为“标签处理类”的调用。之后,当这个JSP页面被执行时,JSP引擎就会调用这个“标签处理类”对象,并执行其内部定义的相应操作方法,从而完成相应的功能。
使用Java处理类来开发自定义JSP标签时,主要分为下几个步骤:
创建标签的处理类(Tag Handle Class)。这个类实现Tag接口,用来定义标签的行为,并在JSP引擎遇到自定义标签时调用执行。
创建标签库描述(tld)文件(Tag Library Descriptor File),在tld文件中对标签处理器类进行描述。
在JSP文件中用taglib指令引入标签库,然后使用标签库描述文件中指定的标签名来使用它。
要想定义自己的标签,必须要定义一个实现了Tag接口或是继承实现了改接口的子类的类(这里,我们主要通过继承实现了Tag接口的TagSupport类来介绍),然后把相应的操作封在相应的方法中即可。
例:
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
publicclass CustomTagIP extends TagSupport {
}
定义标签库文件其实就是定义一个用于描述标签处理类和JSP文件之间关系的一个扩展名为”.tld”的文件。标签库描述符文件是一个以“.tld”结尾的标准XML文档,用来记录一个标签库内拥有哪些标签、每个标签包含哪些属性等。
注:这个 ”.tld”文件一定要放在WEB-INF文件夹下否则在JSP解析引擎将JSP文件解析成Servlet时会因所要解析的自定义标签找不到对应的标签处理类而导致该处理类无法被加载而产生错误。
例:
xml version="1.0" encoding="UTF-8"?>
//XML声明
<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/j2eehttp://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
//指明改文件中所使用的标签的名称空间以及其//约束文件所在的具体位置
<description>A tag library exercising SimpleTag handlers.description>
//这是
<tlib-version>1.0tlib-version>
//
<short-name>lijizhshort-name>
//
//指令中可作为首选的前缀名使用。
<uri>http://www.hbsi.comuri>
//
<tag>
//
<description>OutputsHello, Worlddescription>
<name>Hname>
//
<tag-class>www.hbsi.web.tag.CustomTagIPtag-class>
//
<body-content>emptybody-content>
//
//为:EMPTY JSP scriptless tagdepentend
tag>//结束标签
taglib>
还有一些其他的标签的介绍:
<display-name>:为标签库指定一个简短的别名。
虽然在上面已经定义好了标签处理类和相应的库描述文件但是要想在JSP中使用自定义标签还需要使用JSP中的指令原素进行引用才可使用。
例:
<%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.hbsi.com"prefix="lijizh" %>
<body>
<lijizh:H>
SKIP_PAGE
This is my JSPpage. <br>
lijizh:H>
aaaaaaaa<br/>
body>
html>
再综合来看一个具体的实例:
使用标签输出客户机IP。
1、 标签处理类:
package www.hbsi.web.tag;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
publicclass CustomTagIP extends TagSupport {
@Override
publicint doStartTag() throwsJspException {
HttpServletRequest request =(HttpServletRequest) this.pageContext.getRequest();
//同过this.pageContext获取一个PageContext类型的对象
//通过该对象可以调用其他八大隐式对象
JspWriter out = this.pageContext.getOut();
try {
out.println(request.getRemoteAddr());
} catch(IOException e) {
thrownew RuntimeException(e);
}
returnthis.EVAL_BODY_INCLUDE;
// doStartTag()根据这个返回值来进一步确定是否显示
//标签体中的内容。其中,returnthis.SKIP_BODY;忽略标签体中的内容不执行;returnthis.EVAL_BODY_INCLUDE;显示标签体中的内容。
}
}
2.定义标签描述库
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/j2eehttp://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>A taglibrary exercising SimpleTag handlers.description>
<tlib-version>1.0tlib-version>
<short-name>lijizhshort-name>
<uri>http://www.hbsi.comuri>
<tag>
<description>index.jspdescription>
<name>Hname>
<tag-class>www.hbsi.web.tag.CustomTagIPtag-class>
<body-content>emptybody-content>
tag>
taglib>
3.JSP文件中引用自定义标签
<%@ pagelanguage="java" import="java.util.*"pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.hbsi.com"prefix="lijizh" %>
<body>
您当前的IP地址是<br>
<lijizh:H/>
body>
html>
效果如图:
这样你就可以在JSP中使用自定义标签来封装自己的Java代码了。自己试一试吧!