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


    1、标签库的运作离不开tld文件
    2、标签库的标签是定义在tld中的tag标签内(助手类)

    标签的语言特点

      <开始标签 属性="属性值">标签体</结束标签>


    3. 自定义标签的开发及使用步骤
    3.1 创建一个标签助手类(继承BodyTagSupport)
    标签属性必须助手类的属性对应、且要提供对应get/set方法

    3.2 创建标签库描述文件(tld),添加自定义标签的配置
    注:tld文件必须保存到WEB-INF目录或其子目录
    3.3 在JSP通过taglib指令导入标签库,并通过指定后缀
    访问自定义标签

    4.标签生命周期


    SKIP_BODY:跳过主体
    EVAL_BODY_INCLUDE:计算标签主体内容并[输出]
    EVAL_BODY_BUFFERED:计算标签主体内容并[缓存]
    EVAL_PAGE:计算页面的后续部分
    SKIP_PAGE:跳过页面的后续部分
    EVAL_BODY_AGAIN:再计算主体一次

    作业:

    foreach标签的助手类:

    package com.tag;
    
    import java.util.List;
    
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.tagext.BodyTagSupport;
    
    public class ForeachTag extends BodyTagSupport{
    
        /**
         * 
         */
        private static final long serialVersionUID = -961767522031795797L;
    
        private List<Object> itmes;
        private String var;
        
        public ForeachTag(List<Object> itmes, String var) {
            super();
            this.itmes = itmes;
            this.var = var;
        }
        
        public ForeachTag() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        public List<Object> getItmes() {
            return itmes;
        }
        public void setItmes(List<Object> itmes) {
            this.itmes = itmes;
        }
        public String getVar() {
            return var;
        }
        public void setVar(String var) {
            this.var = var;
        }
        @Override
        public int doStartTag() throws JspException {
            // TODO Auto-generated method stub
            if (itmes==null) {
                return SKIP_BODY;
            }
            return EVAL_BODY_INCLUDE;
        }
    }

    if标签的助手类:

    package com.tag;
    
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.tagext.BodyTagSupport;
    
    public class IfTag extends BodyTagSupport {
    
    
        /**
         * 
         */
        private static final long serialVersionUID = -5147827787787703458L;
    
        private boolean test;
        
        public boolean isTest() {
            return test;
        }
        public void setTest(boolean test) {
            this.test = test;
        }
        @Override
        public int doStartTag() throws JspException {
            if (!test) {
                return SKIP_BODY;//不显示标签中间的内容
            }
            return EVAL_BODY_INCLUDE;//显示标签中的内容
        }
    }

    out标签的助手类:

    package com.tag;
    
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.JspWriter;
    import javax.servlet.jsp.tagext.BodyTagSupport;
    
    public class OutTag extends BodyTagSupport{
    
        /**
         * 
         */
        private static final long serialVersionUID = -2971786012488394710L;
        
        private Object value;
    
        public Object getValue() {
            return value;
        }
    
        public void setValue(Object value) {
            this.value = value;
        }
    
        @Override
        public int doStartTag() throws JspException {
            JspWriter out = pageContext.getOut();
            try {
                out.write(value.toString());
            } catch (Exception e) {
                // TODO Auto-generated catch block
                throw new RuntimeException(e);
            }
            return SKIP_BODY;
        }
    }

    set标签的助手类:

    package com.tag;
    
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.JspWriter;
    import javax.servlet.jsp.tagext.BodyTagSupport;
    
    public class SetTag extends BodyTagSupport{
           
        /**
         * set标签
         */
        private static final long serialVersionUID = -5972588683307720977L;
        private Object value;
        
          public Object getValue() {
            return value;
        }
    
        public SetTag(Object value) {
            super();
            this.value = value;
        }
    
        public void setValue(java.lang.Object value) {
              this.value=value;
        }
            
          public void setTarget(java.lang.Object target) {
              this.value=target;
        }
         @Override
        public int doStartTag() throws JspException {
             JspWriter out = pageContext.getOut();
                try {
                    out.write(value.toString());
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    throw new RuntimeException();
                }
                return SKIP_BODY;
        }
          
    }

    自定义标签库:

    <?xml version="1.0" encoding="UTF-8" ?>
    
    <taglib xmlns="http://java.sun.com/JSP/TagLibraryDescrtiptor">
    
        <tlib-version>1.1</tlib-version>
        <jsp-version>1.2</jsp-version>
        <short-name>Simple Tags</short-name>
        <uri>/lingerqi</uri>
    
    
      <tag>
        <name>out</name>
        <tag-class>com.tag.OutTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
            <name>var</name>
            <required>false</required>
            <rtexprvalue>false</rtexprvalue>
        </attribute>
      </tag>
      
      <tag>
        <name>Foreach</name>
        <tag-class>com.tag.ForeachTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
            <name>var</name>
            <required>false</required>
            <rtexprvalue>false</rtexprvalue>
        </attribute>
      </tag>
       
      <tag>
        <name>if</name>
        <tag-class>com.tag.IfTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
            <name>var</name>
            <required>false</required>
            <rtexprvalue>false</rtexprvalue>
        </attribute>
      </tag>
      <tag>
          <name>set</name>
          <tag-class>com.tag.SetTag</tag-class>
          <body-content>JSP</body-content>
          <attribute>
              <name>value</name>
              <required>true</required>
              <rtexprvalue>true</rtexprvalue>
          </attribute>
      </tag>
    </taglib>

    调用标签:

    <%@page import="java.util.ArrayList"%>
    <%@page import="java.util.List"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        <%@ taglib prefix="z" uri="/lingerqi" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <%--  <%
            List<String> ls = new ArrayList<>();
            ls.add("zc");
            ls.add("ls");
            ls.add("ww");
            ls.add("zl");
            ls.add("so");
            ls.add("wl");
            pageContext.setAttribute("ls", ls);
        %>
        <ol>
            <l:foreach var="l" itmes="${ls }">
        <li>${ls}</li>
            </l:foreach>
        </ol>  --%>
        <%-- <z:out></z:out> --%>
        <%-- <z:if>{1>1}</z:if> --%>
    </body>
    </html>
  • 相关阅读:
    vue react 路由是否包含id
    vue react初始化脚手架
    多线程编程基础
    模拟实现简化版List迭代器&嵌入List
    斐波那契数与二分法的递归与非递归算法及其复杂度分析
    C语言模拟实现多态
    C++智能指针剖析(下)boost::shared_ptr&其他
    C++智能指针剖析(上)std::auto_ptr与boost::scoped_ptr
    C++模板实现动态顺序表(更深层次的深浅拷贝)与基于顺序表的简单栈的实现
    C++—模板(2)类模板与其特化
  • 原文地址:https://www.cnblogs.com/omji0030/p/11037306.html
Copyright © 2011-2022 走看看