自定义taglib示例

1.自定义标签库要编写一个类实现Tag接口,实现它的方法
通常我们只需要继承Tag的实现TagSupport或SimpleTagSupport,重写它的doStart()方法即可

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

/**
 * TagSupport内部会通过setPageContext(PageContext pageContext)传入相应的pageContext
 * 有了pageContext我们就可以操作当前应用的所有对象
 *
 */
public class ViewIPTag extends TagSupport {

	private static final long serialVersionUID = 6754089233531337844L;

	@Override
	public int doStartTag() throws JspException {
		HttpServletRequest request = (HttpServletRequest) this.pageContext.getRequest();
		JspWriter out = this.pageContext.getOut();
		
		String ip = request.getRemoteAddr();
		try {
			out.print(ip);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		
		return super.doStartTag();
	}
}

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

//比起TagSupport更容易操作标签体
public class SimpleTagDemo extends SimpleTagSupport {
	//标签属性,要有对应的set方法
	private int count;

	public int getCount() {
		return count;
	}

	public void setCount(int count) {
		this.count = count;
	}

	@Override
	public void doTag() throws JspException, IOException {
		//获取标签体的内容
		JspFragment jf = this.getJspBody();
		for (int i=0; i<count; i++) {
			jf.invoke(this.getJspContext().getOut());//或jf.invoke(null);为null时默认写向浏览器
		}
	}
}

2.编写tld文件(其实本质是一个xml文件,只是后缀名为tld),此文件要放在WEB-INF/下,

可从$tomat/webapps/examples/WEB-INF/jsp2下找到tld文件
<?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>boco</short-name><!--prefix-->
	<uri>http://www.boco.com/lhp</uri><!--uri-->
	<tag>
		<name>viewIP</name><!--tagName-->
		<tag-class>com.boco.lhp.ViewIPTag</tag-class>
		<body-content>empty</body-content>
	</tag>
    <tag>
        <name>demo</name>
        <tag-class>com.boco.lhp.SimpleTagDemo</tag-class>
        <body-content>scriptless</body-content>
        <attribute>
            <name>count</name><!-- 属性名 -->
            <required>true</required><!-- 是否为必有属性 -->
            <rtexprvalue>true</rtexprvalue><!-- 是否支持 运行时rt表达式expr值value -->
        </attribute>
    </tag>
</taglib>

<body-content>有4个属性:JSP/empty/scriptless/tagdependent;意思是,在使用标记时,标记中可包含的内容。JSP表示标记中可包 含java代码;empty表示标记中不可包含任何内容,必须为空;scriptless表示标记中不能包含java代码,可包含EL、JSP动作代 码;tagdependent表示标记包含的内容由标记决定
继承SimpleTagSuppor的,<body-content>要写empty,scriptless,不能写JSP

3.jsp中的应用,要通过<%taglib uri="uri" prefix="prefix" />引入,并通过<prefix:tagName />

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://www.boco.com/lhp" prefix="boco" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>viewIp</title>
  </head>
  	<boco:viewIP/>
    <boco:demo count="6"><!-- count的值也可以通过EL表达式或JSP表达式来赋值,原因是tld文件中指定了rtexprvalue为true -->
        这里的内容会被输出6次
    </boco:demo>
  <body>
  </body>
</html>

标记库文件打包成jar文件的方法:
创建一个临时文件夹temp,把需要打包的标记库类的class文件(在tomcat中webapps文件夹下对应项目的web-inf目录下) 放入temp文件夹中(注意要带上完整的package),并在temp下创建META-INF文件夹用以存放编辑好的tld文件,    之后通过cmd在temp目录下  运行【jar -cvf jarName.jar *】即可,jarName是自定义的jar文件名,*表示temp文件下的所有文件

或者也可以通过myEclipse来导出jar包:
1.新建普通的java project
2.将需要打包的类文件复制到src目录下
3.在project下新建META-INF目录
4.将tld文件复制到META-INF目录下
5.File-->Export-->Java-->JAR file-->忽略.classpath .project,并指定导出路径-->finish


你可能感兴趣的:(自定义taglib示例)