首页 > 其他 > 详细

如何自定义标签

时间:2016-02-01 02:15:25      阅读:134      评论:0      收藏:0      [点我收藏+]

自定义标签的步骤:

1.创建一个自定义标签处理器类,实现SimpleTag接口

public class HelloSimpleMyTag implements SimpleTag {

2.在WEB-INF文件夹下新建一个.tld(标签库描述文件)为扩展名的xml文件.并拷入固定的部分:并对

description,display-name,tlib-version,short-name,uri做出修改

<?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">
  
  <!-- 描述TLD文件 -->
  <description>MyTag 1.0 core library</description>
  <display-name>MyTag core</display-name>
  <tlib-version>1.0</tlib-version>
  
  <!-- 建议在jsp页面上使用的前缀 -->
  <short-name>test</short-name>
  <!-- 作为tld文件的id,用来标示当前的tld文件,多个tld文件的uri不能重复,在
  JSP页面 通过 taglib 的属性 uri来引入tld文件     -->
  <uri>http://www.test.com/mytag/core</uri>
</taglib>

3.在tld文件中描述自定义的标签

<tag>
      <!-- 标签的名字,在jsp页面上使用标签的名字 -->
      <name>hello</name>
      <!-- 标签所在的全类名 -->
      <tag-class>com.java.tag.HelloSimpleMyTag</tag-class>
      <!-- 标签体类型 -->
     <body-content>empty</body-content>
  </tag>

4.在jsp页面使用自定义标签

<%@ taglib uri="http://www.atguigu.com/mytag/core" prefix="test" %>
<test:hello/>

使用自定义标签时,prefix可以自己定义,通常会推荐tld文件中的<short-name>

-------------------------------------------------------------------------------------

通过使用自定义标签,会发现,标签处理器类的 setJspContext(),doTag()会被调用

public class HelloSimpleMyTag implements SimpleTag {

    @Override
    public void doTag() throws JspException, IOException {
    }

    @Override
    public JspTag getParent() {
        return null;
    }

    @Override
    public void setJspBody(JspFragment arg0) {
    }
  //JSP引擎调用
    @Override
    public void setJspContext(JspContext arg0) {
    }

    @Override
    public void setParent(JspTag arg0) {
    }

}    

在调用setJspContext(JspContext arg0) 时传入JspContext 对象,

通过J2EE API 发现

javax.servlet.jsp
Class JspContext

java.lang.Object
javax.servlet.jsp.JspContext
Direct Known Subclasses:
PageContext

PageContext 是 JspContext的一个子类,

在setJspContext(JspContext arg0) 是传入一个PageContext对象,

    private PageContext pageContext;
  //JSP引擎调用,把实际代表PageContext对象传入 @Override
public void setJspContext(JspContext arg0) { this.pageContext = (PageContext)arg0; }

其中PageContext为JSP的一个隐含对象,通过PageContext可以获取JSP页面的其他8个隐含对象

即可以在doTag()中对页面进行输出

   //执行标签体逻辑实际应该编写到该方法中 
  @Override
public void doTag() throws JspException, IOException { pageContext.getOut().print("HelloWorld!");
HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
pageContext.getOut().println("Hello: "+request.getParameter("name"));
    }

 

标签的属性:

<atguigu:hello value="aaa" count="10"/>

在标签上使用属性以下几个步骤

1.需要在tld文件中添加标签属性的描述

<tag>
      <!-- 标签的名字,在jsp页面上使用标签的名字 -->
      <name>hello</name>
      <!-- 标签所在的全类名 -->
      <tag-class>com.java.tag.HelloSimpleMyTag</tag-class>
      <!-- 标签体类型 -->
     <body-content>empty</body-content>
     <attribute>
         <!--该属性的名字  -->
         <name>value</name>
         <!-- 该属性是否必须 -->
         <required>true</required>
         <!--rtexprvalue :runtime expression value 
         当前属性是否可以接受运行时表达式的动态值  -->
         <rtexprvalue>true</rtexprvalue>
     </attribute>
     <attribute>
         <name>count</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
     </attribute>
  </tag>
<!--rtexprvalue :runtime expression value 
         当前属性是否可以接受运行时表达式的动态值  -->
         <rtexprvalue>true</rtexprvalue>
可以动态赋值
<atguigu:hello value="${param.name }" count="10"/>

2.在标签处理器类中需要出现与上述属性名相同的成员变量

public class HelloSimpleMyTag implements SimpleTag {
    
    private String value;
    private String count;
    
    public void setValue(String value) {
        this.value = value;
    }
    public void setCount(String count) {
        this.count = count;
    }
    

当标签属性存在时会默认调用setXxx()

次需求为将value的值打印count次

<atguigu:hello value="${param.name }" count="10"/>
@Override
    public void doTag() throws JspException, IOException {
//        pageContext.getOut().println("HelloWorld!<br>");
//        HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
//        pageContext.getOut().println("Hello: "+request.getParameter("name"));
        JspWriter out  = pageContext.getOut();
        int c = Integer.parseInt(count);
        for(int i = 0;i<c;i++){
            out.print(value);
            out.print("<br>");
        }
    }

技术分享

 

如何自定义标签

原文:http://www.cnblogs.com/wq3435/p/5174237.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!