自定义标签入门
自定义标签简介
自定义标签主要用于移除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页面中导入和使用自定义标签。
by hacket

浙公网安备 33010602011771号