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