自定义标签入门

自定义标签简介
  
  自定义标签主要用于移除Jsp页面中的<% java %>代码。
  
  快速入门:使用自定义标签输出客户机IP
  1.传统方式
1 <%
2           //传统方式获取客户机ip地址
3           String ip = request.getRemoteAddr();
4           out.print("ip:"+ip);
5   %> 

   2.实现 SimpleTag接口的自定义标签方式

    1)写一个标签处理类

package cn.zengfansheng.simpletag;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
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;

public class SimpleTagDemo implements SimpleTag {

	private PageContext pageContext;
	@Override
	//Web容器调用NO1
	public void setJspContext(JspContext jspContext) {
			
		System.out.println("No1:setJspContext()");
		pageContext = (PageContext) jspContext;
	}
	@Override
	//Web容器调用NO2
	public void doTag() throws JspException, IOException {
		
		System.out.println("No2:doTag()");
		//取得HttpServletRequest请求对象
		HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
		//取得客户端的IP地址
		String ip = request.getRemoteAddr();
		//取得out(JspWriter)对象
		JspWriter out = pageContext.getOut();
		//向浏览器输出
		out.print("ip : "+ip);
	}
	@Override
	public JspTag getParent() {
		return null;
	}
	@Override
	public void setJspBody(JspFragment arg0) {

	}
	@Override
	public void setParent(JspTag arg0) {
	}
}

    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://www.zengfansheng.cn/jstl/simple</uri>
	  <tag>
		    <name>lip</name>
		    <tag-class>cn.zengfansheng.simpletag.SimpleTagDemo</tag-class>
		    <body-content>empty</body-content>
	  </tag>
	  <tag>
	  		<name>skip</name>
	  		<tag-class>cn.zengfansheng.simpletag.SimpleDemoSkip</tag-class>
	  		<body-content>scriptless</body-content>
	  </tag>
</taglib>

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

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/simple" prefix="simple" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <body>
  	客户端IP为:<simple:ip/>
  </body>
</html>

  3.SimpleTagSupport类  

    1)处理类

package cn.zengfansheng.simpletag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
//<simple:skip>标签处理类
public class SimpleDemoSkip extends SimpleTagSupport {
	public void doTag() throws JspException, IOException {
		//取得标签体的内容
		JspFragment jspFragment = this.getJspBody();
		//执行标签体的内容,并将其输出到浏览器,null表示浏览器
		jspFragment.invoke(null);
		//抛出SkipPageExcetion,导到标签体后的内容不执行
		throw new SkipPageException();
	}
}

    2)在/WEB-INF/目录下,写一个*.tld文件,目的是让Web容器知道自定义标签和标签处理类的对应关系

<tag>
	  		<name>skip</name>
	  		<tag-class>cn.zengfansheng.simpletag.SimpleDemoSkip</tag-class>
	  		<body-content>scriptless</body-content>
 </tag>

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

     <simple:skip>
  	 	哈哈,出来了!
  	 </simple:skip>
  	 这是标签后面的内容,出来了么、

  

   移除jsp页面中的java代码,只需要完成两个步骤:
•实现SimpleTag接口/SimpleTagSupport类,重写doTag()方法。
•编写标签库描述符(tld)文件,在tld文件中对自定义标签进行描述,并放置在WEB-INF/目录下。
•完成以上操作,即可在JSP页面中导入和使用自定义标签。
 
posted @ 2013-04-09 00:25  hacket520  阅读(172)  评论(0)    收藏  举报