zoukankan      html  css  js  c++  java
  • 自定义标签

    百度百科:

    自定义标签

     编辑
    一般我们说自定义标签是指JSP自定义标签。自定义标签在功能上逻辑上与javaBean 类似,都封装Java 代码。自定义标签是可重用的组件代码,并且允许开发人员为复杂的操作提供逻辑名称。
    JSP开发人员使用标签库创建标签.标签库是按照功能或实现进行分组的自定义标签的集合。
    网络上常见的CMS内容管理系统都是采用模板的形式来实现,基本上所有的CMS系统都有一套自己的模板标签书写方法,简称自定义标签。

    基本概念

    编辑
    1.标签(Tag):
    标签是一种XML元素,通过标签可以使JSP网页变得简洁并且易于维护,还可以方便地实现同一个JSP文件支持多种语言版本。由于标签是XML元素,所以它的名称和属性都是大小写敏感的
    2.标签库(Tag library):
    由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。
    3.标签库描述文件(Tag Library Descriptor):
    标签库描述文件是一个XML文件,这个文件提供了标签库中类和JSP中对标签引用的映射关系。它是一个配置文件,和web.xml是类似的。
    4.标签处理类(Tag Handle Class):
    标签处理类是一个Java类,这个类继承了TagSupport或者扩展了SimpleTag接口,通过这个类可以实现自定义JSP标签的具体功能
     

    简单自定义标签实现:
     
    1.写自己要实现的标签功能,如打印一句话到jsp,添加一个标签类,extends javax.servlet.jsp.tagext.TagSupport类
    public class HelloWorldTag extends TagSupport{
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
    
        @Override
        public int doEndTag() throws JspException {
            // TODO Auto-generated method stub
            return super.doEndTag();
        }
    
        @Override
        public int doStartTag() throws JspException {
            JspWriter out = super.pageContext.getOut();
            try {
                out.println("hello,我是自定义标签的内容");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return TagSupport.SKIP_BODY;//0:直接结束标签
        }
        
        
    }

    2.在WebRoot(eclipse中是WebContent)目录下,新建helloworld.tld标签文件

    <?xml version="1.0" encoding="UTF-8" ?>
    
    <taglib 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 http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
        version="2.1">
        <tlib-version>1.0</tlib-version>
        <short-name>helloWorldTag</short-name>
        
      <!-- 自定义标签 -->
      <tag>
          <name>helloworld</name>
          <tag-class>com.mlxs.tag.HelloWorldTag</tag-class>
          <body-content>empty</body-content>
      </tag>
    </taglib>

    3.在jsp中使用自定义标签

    <%@ taglib prefix="mytag" uri="/mytag/helloworld.tld" %>
    
    <body>
        <!-- 使用自定义标签 -->
        <mytag:helloworld/>
      </body>

    4.访问页面验证

    hello,我是自定义标签的内容

     
     
    模仿一下集合遍历的标签:
     
    1.IteratorTag类
    /**
     * 模拟循环集合的标签类
     * @author Administrator
     *
     */
    public class IteratorTag extends TagSupport{
    
        //单个元素的名称
        private String var;
        //集合名称
        private String items;
        //迭代器
        private Iterator iter=null;
    
        //getter和setter,从前台获取数据
        public String getVar() {
            return var;
        }
        public void setVar(String var) {
            this.var = var;
        }
        public String getItems() {
            return items;
        }
        public void setItems(String items) {
            this.items = items;
        }
    
        /**
         * 标签头
         */
        @Override
        public int doStartTag() throws JspException {
            //获取集合的value
            Object value = super.pageContext.getAttribute(items);
            //判断
            if(value!=null && value instanceof List){
                this.iter = ((List)value) .iterator();
                if(iter.hasNext()){
                    this.pageContext.setAttribute(var, iter.next());//注意:此处的var不能加引号
                    return TagSupport.EVAL_BODY_INCLUDE; //执行标签体
                }
            }else{
                //其他如map省略
                return TagSupport.SKIP_BODY;//0:直接结束标签
            }
            
            return TagSupport.SKIP_BODY;//0:直接结束标签
        }
        
        /**
         * 标签体结束后执行
         */
        @Override
        public int doAfterBody() throws JspException {
            if(iter.hasNext()){
                this.pageContext.setAttribute(var, iter.next());
                return TagSupport.EVAL_BODY_AGAIN; //再执行一次标签体
            }else{
                return TagSupport.SKIP_BODY;//0:直接结束标签
            }
        }
    }

    2.tld文件中:

    <!-- 自定义标签 实现集合遍历 -->
      <tag>
          <name>iter</name>
          <tag-class>com.mlxs.tag.IteratorTag</tag-class>
          <body-content>JSP</body-content>
          <!-- 定义属性(参数) -->
          <attribute>
              <name>var</name>
              <required>true</required><!-- 是否必须传 -->
              <rtexprvalue>true</rtexprvalue><!-- 是否支持EL表达式 -->
          </attribute>
          <attribute>
              <name>items</name>
              <required>true</required><!-- 是否必须传 -->
              <rtexprvalue>true</rtexprvalue><!-- 是否支持EL表达式 -->
          </attribute>
      </tag>

    3.jsp访问

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ taglib prefix="mytag" uri="/mytag/helloworld.tld" %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        
        <title>My JSP 'index.jsp' starting page</title>
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
      </head>
      
      <body>
          <%
            List list = new ArrayList();
            list.add("0");
            list.add("2");
            list.add("44");
            list.add("10哈哈");
            //存储在application
            pageContext.setAttribute("list", list);
         %>
        <!-- 使用自定义标签 -->
        <mytag:iter items="list" var="result">
            <h2>${result }</h2>
        </mytag:iter>
      </body>
    </html>

    4.访问

    0

    2

    44

    10哈哈


    还有一种更简洁的方式,extends SimpleTagSupport,只需要重写doTag方法,然后再tld的标签中这样配置:<body-content>scriptless</body-content>

    /**
     * 模拟循环集合的标签类
     * @author Administrator
     *
     */
    public class IteratorSimpleTag extends SimpleTagSupport{
    
        //单个元素的名称
        private String var;
        //集合名称
        private String items;
        //迭代器
        private Iterator iter=null;
    
        //getter和setter,从前台获取数据
        public String getVar() {
            return var;
        }
        public void setVar(String var) {
            this.var = var;
        }
        public String getItems() {
            return items;
        }
        public void setItems(String items) {
            this.items = items;
        }
    
        /**
         * 标签
         */
        @Override
        public void doTag() throws JspException {
            //获取集合的value
            Object value = super.getJspContext().getAttribute(items);
            //判断
            if(value!=null && value instanceof List){
                this.iter = ((List)value) .iterator();
                while(iter.hasNext()){
                    this.getJspContext().setAttribute(var, iter.next());//注意:此处的var不能加引号
                    try {
                        this.getJspBody().invoke(null);//响应页面
                    } catch (IOException e) {
                        e.printStackTrace();
                    } 
                }
            }
        }
        
    }
    逃避不一定躲得过,面对不一定最难过
  • 相关阅读:
    奇怪的问题:Linux执行脚本碰到Permission denied问题(记录)
    MySQL中的显式锁---MySQL用户级锁函数
    使用Python的tenacity库实现异常重试机制
    json.net payload
    Eclipse Plugin
    MyEclipse web项目转换为eclipse web项目
    Nginx The system cannot find the path specified
    Spring Boot实战:静态资源无法访问
    WebService rwsp:NoRunningCommunicationPointAvailable
    Intellij IDEA 自动生成 serialVersionUID
  • 原文地址:https://www.cnblogs.com/yangzhenlong/p/5289991.html
Copyright © 2011-2022 走看看