首页 > 代码库 > servlet的自定义标签的开发步骤

servlet的自定义标签的开发步骤

1.为什么需要使用自定义标签
  (1)与JSP页面整体统一
  (2)还具有一定的业务逻辑功能,例如:循环,判段。。。 

  (3)替代原JSP页面中<%%> 

2.自定义标签开发步骤(3步):

(1)自定义一个标签处理类,实现SimpleTag接口

package cn.wenhao.www.web.serlvet.el;

import java.io.IOException;

import javax.servlet.ServletRequest;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTag;

/**
 *类的作用:定义的标签处理类
 * 
 * 
 *@author 一叶扁舟
 *@version 1.0
 *@创建时间: 2014-9-9 上午10:25:32
 */
public class IpTag implements SimpleTag {

	private PageContext context;

	// web容器第二步会调用的顺序
	@Override
	public void doTag() throws JspException, IOException {
		System.out.println("执行doTag的顺序……");
		ServletRequest request = context.getRequest();
		String addr = request.getRemoteAddr();
		String host = request.getRemoteHost();
		int port = request.getRemotePort();

		JspWriter out = context.getOut();
		out.write("<font size='36' color='blue'>" + addr + ":" + host + ":"
				+ port + "</font>");

	}

	@Override
	public JspTag getParent() {
		System.out.println("执行doTag的顺序……");
		return null;
	}

	@Override
	public void setJspBody(JspFragment arg0) {
		System.out.println("执行setJspContext的顺序……");
	}

	// web容器首先会调用的,第一步
	@Override
	public void setJspContext(JspContext pc) {
		System.out.println("执行setJspContext的顺序……");
		context = (PageContext) pc;
	}

	@Override
	public void setParent(JspTag arg0) {
		System.out.println("执行setParent的顺序……");
	}

}


(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.wenhao.www.web.serlvet.el.IpTag</tag-class>
    <body-content>empty</body-content>
  </tag>
   
</taglib>

(3). 在JSP页面中,通过<%@taglib%>指令引用标签库

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/simple" prefix="simple" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
   
  </head>
  
  <body> 
  自定义标签,客户端的IP地址:<simple:ip></simple:ip>
   
  </body>
</html>

运行的结果图:


3.SimpleTag方法介绍

(1).setJspContext方法
                     用于把JSP页面的pageContext对象传递给标签处理器对象 
(2).setParent方法
                     用于把父标签处理器对象传递给当前标签处理器对象 
(3).getParent方法
                     用于获得当前标签的父标签处理器对象 
(4).setJspBody方法
                    用于把代表标签体的JspFragment对象(即标签体内容)传递给标签处理器对象 
(5)doTag方法
                    用于完成所有的标签逻辑,包括输出、迭代、修改标签体内容等。在doTag方法中可以抛出javax.servlet.jsp.SkipPageException异常,用于通知WEB容器不再执行JSP页面中位于结束标记后面的内容。

4.SimpleTag接口方法的执行顺序

(1).当web容器开始执行标签时,会调用如下方法完成标签的初始化

      WEB容器调用标签处理器对象的setJspContext方法,将代表JSP页面的pageContext对象传递给标签处理器对象。

      WEB容器调用标签处理器对象的setParent方法,将父标签处理器对象传递给这个标签处理器对象。

       注意,只有在标签存在父标签的情况下,WEB容器才会调用这个方法。

       如果调用标签时设置了属性,容器将调用每个属性对应的setter方法把属性值传递给标签处理器对象。如果标签的属性值是EL表达式或脚本表达式,则WEB 

        容器首先计算表达式的值,然后把值传递给标签处理器对象。

      如果简单标签有标签体,容器将调用setJspBody方法把代表标签体的JspFragment对象传递进来。

(2).执行标签时:
容器调用标签处理器的doTag()方法,开发人员在方法体内通过操作JspFragment对象,就可以实现是否执行、迭代、修改标签体的目的。

servlet的自定义标签的开发步骤