自定义标签
1. 步骤
* 标签处理类(标签也是一个对象,那么就需要先有类!)
* tld文件,它是一个xml
* 页面中使用<%@taglib%>来指定tld文件的位置
2. 标签处理类
SimpleTag接口:
void doTag();//每次执行标签时都会调用这个方法; JspTag getParent();//返回父标签(非生命周期方法) void setParent(JspTag);//设置父标签 void setJspBody(JspFragment);//设置标签体 void seetJspContext(JspContext);//设置jsp上下文对象,它儿子是PageContex
其中doTag()会在其他三个方法之后被tomcat调用。
代码:
public class TagDemo extends SimpleTagSupport { public void doTag(){ //获取JSP页面的PageContext PageContext pc =(PageContext) this.getJspContext(); //根据PageContext获得requset HttpServletRequest requset=(HttpServletRequest) pc.getRequest(); //获得IP String ip = requset.getRemoteAddr(); //使用out把IP输入到页面上 JspWriter out=pc.getOut(); try { out.print(ip); } catch (IOException e) { e.printStackTrace(); } } }
3. 配置tld文件
tld文件一般都放到WEB-INF之下,这样保证客户端访问不到!
<?xml version="1.0" encoding="UTF-8"?> <taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee web-jsptaglibrary_2_1.xsd"> <tlib-version>1.0</tlib-version> <short-name>demo</short-name> <uri>www.it.com/demo</uri> <!--如果是在描述页面的需要使用的标签,在tld文件中需要使用tag标签来描述--> <tag> <!-- 页面需要使用名字ip --> <name>ip</name> <!--引入当前指定的那个类 --> <tag-class>cn.it.add.TagDemo</tag-class> <!--定义当前的标签体中的 是否可以书写其他内容? empty: 单标签 没有内容 JSP: 标签体中书写JSP相关的所有的内容 scriptless:标签体无脚本代码 tagdependent: 可以有子标签 --> <body-content>empty</body-content> </tag> </taglib>
4. 页面中指定tld文件位置
<%@ taglib prefix="it" uri="/WEB-INF/tlds/itcast-tag.tld" %>
导标签库,就是为页面指定tld文件的位置!
-------------------------------
进阶
标签体内容
* empty:无标签体!
* JSP:jsp2.0已经不在支持这个类型了!表示标签体内容可以是:java脚本,可以是标签,可以是el表达式
* scriptless:只能是EL表达式,也可以是其他的标签!
* tagdependent:标签体内容不会被执行,而是直接赋值标签处理类!
不在执行标签下面内容的标签!
在标签处理类中的doTag()中使用SkipPageException来结束!
Tomcat会调用标签处理类的doTag()方法,然后Tomcat会得到SkipPageException,它会跳过本页面其他内容!
---------------
标签属性
步骤:
1. 给你的标签处理类添加属性!
为标签处理类添加属性,属性至少要且一个set方法!这个set方法会在doTag()方法之前被tomcat执行!所在doTag()中就可以使用属性了。
2. 在tld文件中对属性进行配置
<attribute> <name>test</name> <!--指定属性名--> <required>true</required><!-- 指定属性是否为必需的--> <rtexprvalue>true</rtexprvalue><!-- 指定属性是否可以使用EL--> </attribute>