天天看點

taglib,自定義JSP

1.标記處理器;(自定義标記發生時的處理動作,一般是實作了javax.servlet.jsp.tagext包的Tag或BodyTag接口的類)

2.标記庫描述檔案;(是一個tld字尾的的檔案)【TLD,顧名思義:taglib description】

3.在web.xml中定義要定位的tld檔案位置

4.在JSP中使用taglib(<%@taglib uri="tagLibraryURI" prefix="tagPrefix"%>)

下面是我在操作步驟,與遇到的一些問題:

我是先做的第二步然後再做的第一步寫的實作類。

a)建立文本文檔,字尾.tld,位置(WEB-INF/tlds/hello.tld)【路徑中的檔案夾還有檔案是建立的】

hello.tld 内容如下:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE taglib
          PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
      "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"><taglib>
	<tlibversion>1.0</tlibversion><!-- 标記庫版本号,N.N.N.N 形式,不能省略第一個N -->
	<jspversion>1.1</jspversion><!-- 與該标記庫相容的JSP規範版本号,預設為1.1 -->
	<shortname>mine</shortname><!-- 标記庫預設明明空間字首,一般與taglib指令中的prefix字首一緻,個人覺得沒必要做太明确的要求,畢竟用标記的時候,很少有人會看定義,都是自己定義字首的-->
	<info>标記庫描述資訊</info><!-- 标記庫的描述資訊 -->
	
	<!-- 其中shortname與tlibversion是必須的 -->
	
	<tag>
		<name>hello</name><!-- 标記名稱/jsp使用時的名稱 -->
		<tagclass>com.fsh.practice_001_JSP.HelloTag</tagclass><!-- 此為标記的處理類 -->
		<bodycontent>empty</bodycontent><!-- 取值有三:JSP;empty;tagdependent;分别表示Servlet容器對體内容求值;主體必須為空;由标記處理程式對體内容求值; -->
		<info>Just Says Hello</info><!-- 标記的描述資訊 -->
	</tag>
</taglib>
           

b)實作類HelloTag内容如下:

package com.fsh.practice_001_JSP;


import java.io.IOException;
import java.util.Date;


import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.*;


public class HelloTag extends TagSupport{


	/**
	 * 
	 */
	private static final long serialVersionUID = -2180087106968634833L;


	@Override
	public int doEndTag() throws JspException {
		String dateString = new Date().toString();
		try{
			pageContext.getOut().write("HelloWorld.<br/>");
			pageContext.getOut().write("My name is:"+getClass().getName()
					+"and it's " + dateString + "<p/>");
		}catch(IOException ex){
			throw new JspTagException("Fatal error:hello tag could not write to JSP out");
		}
		return EVAL_PAGE;
	}


	@Override
	public int doStartTag() throws JspException {
		return EVAL_BODY_INCLUDE;
	}
	
	


}
           

c)在web.xml中的定義:(這裡有一個需要注意的地方就是版本,2.4以後都是需要在<jsp-config>标簽中定義,2.3應該是 不需要的,直接使用<taglib>标簽就好)

  <!-- 增加taglib自定義檔案 增加了新的文法規則,就是jsp-config-->
  <jsp-config>
	  <taglib>
		<taglib-uri>/hello</taglib-uri>
		<taglib-location>/WEB-INF/tlds/hello.tld</taglib-location>
	  </taglib>
  </jsp-config>
           

d)在JSP中使用:

<%@ taglib uri="/hello" prefix="mineTest"%>
           
<mineTest:hello/>
           

好了,現在就可以運作;

如有不對之處,歡迎指正,轉載貼上原文連結即可,謝謝!