天天看点

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/>
           

好了,现在就可以运行;

如有不对之处,欢迎指正,转载贴上原文链接即可,谢谢!