自定义JSP标签

来源:互联网 发布:app端口的作用 编辑:程序博客网 时间:2024/06/14 00:24

一、自定义JSP标签概述

       自定义JSP标签就是程序员定义的一种JSP标签,这种标签把那些信息显示逻辑封装在一个单独的Java类中,通过 一个XML文件来描述它的使用。当页面中需要使用类似的显示逻辑时,就可以在页面中插入这个标签,从而完成相应的功能。
       使用自定义标签,可以分离程序逻辑和表示逻辑,将Java代码从HTML中剥离,便于美工维护页面;自定义标签也  提供了可重用的功能组件,能够提高工程的开发效率。
自定义标签主要用于移除Jsp页面中的java代码

二、自定义JSP标签的开发流程

使用Java处理类来开发自定义JSP标签时,主要分为下几个步骤:
1. 创建标签的处理类(Tag Handle Class)。这个类实现Tag接口,用来定义标签的行为,并在JSP引擎遇到自定义标  签时调用执行。
2. 创建标签库描述 (tld) 文件(Tag Library Descriptor File),在tld文件中对标签处理器类进行描述。
3.在JSP文件中用taglib指令引入标签库,然后使用标签库描述文件中指定的标签名来使用它。

三、Tag接口的执行流程

1.编写一个java类,实现Tag接口,并覆盖其中的doStartTag方法

package mytag;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.jsp.JspException;import javax.servlet.jsp.PageContext;import javax.servlet.jsp.tagext.Tag;public class IPTag implements Tag{//声明接收pageContext的属性private PageContext pageContext;//WEB容器执行完自定义标签的标签体后,//就会接着去执行自定义标签的结束标记,//此时,WEB容器会去调用标签处理器的doEndTag方法@Overridepublic int doEndTag() throws JspException {System.out.println("-------------doEndTag--------------");return 0;}//调用了setPageContext方法和setParent方法之后,//WEB容器执行到自定义标签的开始标记时,//就会调用标签处理器的doStartTag方法@Overridepublic int doStartTag() throws JspException {System.out.println("-----------------doStartTag-----------------");//进行处理操作//获取request对象HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();//通过request对象 获取ip地址String addr = request.getRemoteAddr();HttpServletResponse response = (HttpServletResponse) pageContext.getResponse();PrintWriter out=null;try {out = response.getWriter();out.write(addr);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return 0;}@Overridepublic Tag getParent() {System.out.println("--------------------getParent---------------------");return null;}//通常WEB容器执行完自定义标签后//,标签处理器会驻留在内存中,为其它请求服务,//直至停止web应用时,web容器才会调用release方法@Overridepublic void release() {// TODO Auto-generated method stub}//JSP引擎实例化标签处理器后,//将调用setPageContext方法//将JSP页面的pageContext对象传递给标签处理器,//标签处理器以后可以通过这个pageContext对象与JSP页面进行通信。@Overridepublic void setPageContext(PageContext pc) {System.out.println("------------------setPageContext-------------");  this.pageContext=pc;}//setPageContext方法执行完后,//WEB容器接着调用的setParent方法//将当前标签的父标签传递给当前标签处理器,//如果当前标签没有父标签,//则传递给setParent方法的参数值为null。@Overridepublic void setParent(Tag t) {System.out.println("-------------setParent------------------");}}

2.在web工程的Web-INF目录中新建一个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>myTag</short-name><uri>http://www.csdn.com</uri><tag>  <name>ip</name>  <tag-class>mytag.IPTag</tag-class>  <body-content>empty</body-content>//tld文件中的四种标签体类型 EMPTY  JSP  scriptless  tagdepentend        </tag></taglib>



3.在jsp页面中导入并使用上面开发的标签

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib uri="http://www.csdn.com" prefix="myTag" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>           <title>My JSP 'index.jsp' starting page</title>  </head>    <body>     <%-- <%@ include file="/2.jsp" %> --%>    <%--       <jsp:forward page="1.jsp">             <jsp:param value="12" name="id"/>      </jsp:forward> --%>               <!-- 输出客户机的ip地址 -->        <%--    <%       String addr = request.getRemoteAddr();      %>      <%=addr %> --%>            <myTag:ip/>  </body></html>


四、Tag Handle

1.创建标签Tag Handle的处理类(Class)。
                       这个类实现Tag接口,用来定义标签的行为,并在JSP引擎遇到自定义标签时调用执行。
                       例如:
                  class IPTag implements Tag{}
                  class MyTag1 extends TagSupport {}
                  MyTag3 extends BodyTagSupport{}
                  
        说明TAG接口中的常量:
                   Tag.SKIP_PAGE:跳过其它处理(控制整个jsp页面是否执行)
                   Tag.EVAL_PAGE:继续执行其它处理
                      //控制jsp页面某一部分内容是否执行
                       if(x==1){
                            return Tag.EVAL_PAGE;
                        }else{
                            return Tag.SKIP_BODY;
                        }
                    Tag.EVAL_BODY_INCLUDE:  传入现有输出流
                    
                    Tag.SKIP_BODY:跳过标签体.
                    
   BodyTag接口中:
                    BodyTag.EVAL_BODY_BUFFERED:创建新的缓冲区,并且创建BodyContent
                    
                    
   IterationTag 接口中:  
                     IterationTag.EVAL_BODY_AGAIN:重复执行       
                     
                     
           其它简单标签的使用:
             MyTag1 extends  SimpleTagSupport{}     
 

例:

package simpletag;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.jsp.JspContext;import javax.servlet.jsp.JspException;import javax.servlet.jsp.PageContext;import javax.servlet.jsp.tagext.JspFragment;import javax.servlet.jsp.tagext.JspTag;import javax.servlet.jsp.tagext.SimpleTagSupport;public class MyTag1 extends SimpleTagSupport {@Overridepublic void doTag() throws JspException, IOException {System.out.println("---------------doTag----------------");PageContext pageContext = (PageContext) this.getJspContext();HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();String addr = request.getRemoteAddr();HttpServletResponse response = (HttpServletResponse) pageContext.getResponse();PrintWriter out = response.getWriter();out.write(addr);super.doTag();}@Overrideprotected JspFragment getJspBody() {System.out.println("========================simpleTagSupport-----getJspBody");return super.getJspBody();}@Overrideprotected JspContext getJspContext() {System.out.println("======================simpleTagSupport-----getJspcontext");return super.getJspContext();}@Overridepublic JspTag getParent() {System.out.println("--------------------getParent-----------------");return super.getParent();}@Overridepublic void setJspBody(JspFragment jspBody) {System.out.println("----------------setJspBody-------------------");super.setJspBody(jspBody);}@Overridepublic void setJspContext(JspContext pc) {System.out.println("------------setJspContext------------------");super.setJspContext(pc);}@Overridepublic void setParent(JspTag parent) {System.out.println("--------------setParent---------------------");super.setParent(parent);}}


2.创建标签库描述 (tld) 文件(Tag Library Descriptor File),在tld文件中对标签处理器类进行描述。

<taglib>元素是标签库描述符的根元素,它包含12个子元素,详细介绍如下。
(1)<description>:标签库的一个文本描述。
(2)<tlib-version>:指定标签库的版本。
(3)<short-name>:为标签定义简短的名字,在taglib指令中可作为首选的前缀名使用。
(4)<uri>:定义一个URI,用于唯一地标识此标签库。
(5)<tag>:用于指定自定义标签的相关信息。
(6)<display-name>:为标签库指定一个简短的别名。
(7)<small-icon>:为标签库指定大小为16×16的小图标(gif或jpeg格式),该图标可在图形界面工具中显示。
(8)<large-icon>:为标签库指定大小为32×32的大图标(gif或jpeg格式),该图标可在图形界面工具中显示。
(9)<validator>:为标签库提供一个验证器。
(10)<listener>:为标签库提供一个监听器。
(11)<tag-file>:用于描述标签文件。
(12)<function>:用于指定在表达式语言中使用的函数。


0 0
原创粉丝点击