自定义标签


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>
posted @ 2017-06-19 10:07  晓梦蝶  阅读(282)  评论(0编辑  收藏  举报