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

    1、web.xml配置

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     3     xmlns="http://java.sun.com/xml/ns/javaee" 
     4     xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
     5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
     6     <display-name>test_Servlet</display-name>
     7      <jsp-config>
     8         <taglib>
     9             <taglib-uri>kongxh_tag</taglib-uri>
    10             <taglib-location>/WEB-INF/mytag.tld</taglib-location>
    11         </taglib>
    12     </jsp-config>
    13     <!-- 配置欢迎界面 -->
    14     <welcome-file-list>
    15         <welcome-file>index.jsp</welcome-file>
    16     </welcome-file-list>
    17 </web-app>

    2、tld的编写

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
     4     version="2.0">
     5     <tlib-version>1.0</tlib-version>
     6     <jsp-version>2.0</jsp-version>
     7     <short-name>firsttags</short-name>
     8     <tag>
     9         <name>IterTag</name>
    10         <tag-class>test_servlet_package.tag.IterTag</tag-class>
    11         <body-content>jsp</body-content>
    12         <attribute>
    13             <name>scope</name>
    14             <required>true</required>
    15             <rtexprvalue>true</rtexprvalue>
    16         </attribute>
    17         <attribute>
    18             <name>id</name>
    19             <required>true</required>
    20             <rtexprvalue>true</rtexprvalue>
    21         </attribute>
    22         <attribute>
    23             <name>name</name>
    24             <required>true</required>
    25             <rtexprvalue>true</rtexprvalue>
    26         </attribute>
    27     </tag>
    28     <tag>
    29         <name>MyBodyTag</name>
    30         <tag-class>test_servlet_package.tag.MyBodyTag</tag-class>
    31         <tei-class>test_servlet_package.tag.MyTagExtraInfo</tei-class>
    32         <body-content>jsp</body-content>
    33         <attribute>
    34             <name>scope</name>
    35             <required>true</required>
    36             <rtexprvalue>true</rtexprvalue>
    37         </attribute>
    38         <attribute>
    39             <name>id</name>
    40             <required>true</required>
    41             <rtexprvalue>true</rtexprvalue>
    42         </attribute>
    43         <attribute>
    44             <name>name</name>
    45             <required>true</required>
    46             <rtexprvalue>true</rtexprvalue>
    47         </attribute>
    48     </tag>
    49     <tag>
    50         <name>MySimpleTag</name>
    51         <tag-class>test_servlet_package.tag.MySimpleTag</tag-class>
    52         <body-content>empty</body-content>
    53         <attribute>
    54             <name>format</name>
    55             <required>true</required>
    56             <rtexprvalue>true</rtexprvalue>
    57         </attribute>
    58     </tag>
    59     <tag>
    60         <name>MySimpleTagForIter</name>
    61         <tag-class>test_servlet_package.tag.MySimpleTagForIter</tag-class>
    62         <body-content>scriptless</body-content>
    63         <attribute>
    64             <name>scope</name>
    65             <required>true</required>
    66             <rtexprvalue>true</rtexprvalue>
    67         </attribute>
    68         <attribute>
    69             <name>id</name>
    70             <required>true</required>
    71             <rtexprvalue>true</rtexprvalue>
    72         </attribute>
    73         <attribute>
    74             <name>name</name>
    75             <required>true</required>
    76             <rtexprvalue>true</rtexprvalue>
    77         </attribute>
    78     </tag>
    79     <tag>
    80         <name>DynamicAttributesTag</name>
    81         <tag-class>test_servlet_package.tag.DynamicAttributesTag</tag-class>
    82         <body-content>empty</body-content>
    83         <dynamic-attributes>true</dynamic-attributes>
    84     </tag>
    85 </taglib>
    View Code

    3、Tag的编写

    IterTag:循环标签

     1 package test_servlet_package.tag;
     2 import java.util.Iterator;
     3 import java.util.List;
     4 import javax.servlet.jsp.JspException;
     5 import javax.servlet.jsp.PageContext;
     6 import javax.servlet.jsp.tagext.TagSupport;
     7 public class IterTag extends TagSupport {
     8     /**
     9      * jsp 1.2 之前 的 做法 
    10      */
    11     private static final long serialVersionUID = 1L;
    12     //接受属性名称
    13     private String name;
    14     //接受查找范围
    15     private String scope;
    16     private String id;
    17     private Iterator<?> iter = null;
    18     @Override
    19     public int doStartTag() throws JspException {
    20         Object value = null;
    21         //是否是page范围
    22         if ("page".equals(this.scope)) {
    23             value = super.pageContext
    24                     .getAttribute(name, PageContext.PAGE_SCOPE);
    25         } else if ("request".equals(this.scope)) {
    26             //是否是request范围
    27             value = super.pageContext.getAttribute(name,
    28                     PageContext.REQUEST_SCOPE);
    29         } else if ("session".equals(this.scope)) {
    30             //是否是session范围
    31             value = super.pageContext.getAttribute(name,
    32                     PageContext.SESSION_SCOPE);
    33         } else {
    34             //是否是application范围
    35             value = super.pageContext.getAttribute(name,
    36                     PageContext.APPLICATION_SCOPE);
    37         }
    38         //如果没有查到属性
    39         if (value !=null && value instanceof List<?>) {
    40             this.iter = ((List<?>)value).iterator();
    41             if(iter.hasNext()){
    42                 super.pageContext.setAttribute(this.id,iter.next());
    43                 //找到属性,执行标签题内容
    44                 return TagSupport.EVAL_BODY_INCLUDE;
    45             }else{
    46                 //找到属性,执行标签题内容
    47                 return TagSupport.SKIP_BODY;
    48             }
    49         }else{
    50             //不执行标签体内容
    51             return TagSupport.SKIP_BODY;
    52         }
    53     }
    54     public String getName() {
    55         return name;
    56     }
    57 
    58     @Override
    59     public int doAfterBody() throws JspException {
    60         if(iter.hasNext()){
    61             super.pageContext.setAttribute(this.id,iter.next());
    62             return TagSupport.EVAL_BODY_AGAIN; //反复执行
    63         }else{
    64             return TagSupport.SKIP_BODY;
    65         }
    66     }
    67     @Override
    68     public int doEndTag() throws JspException {
    69         return super.doEndTag();
    70     }
    71     public void setName(String name) {
    72         this.name = name;
    73     }
    74     public String getScope() {
    75         return scope;
    76     }
    77     public void setScope(String scope) {
    78         this.scope = scope;
    79     }
    80     public String getId() {
    81         return id;
    82     }
    83     public void setId(String id) {
    84         this.id = id;
    85     }
    86 }
    View Code

    MyBodyTag

     1 package test_servlet_package.tag;
     2 import java.io.IOException;
     3 import java.util.Iterator;
     4 import java.util.List;
     5 import javax.servlet.jsp.JspException;
     6 import javax.servlet.jsp.PageContext;
     7 import javax.servlet.jsp.tagext.BodyTagSupport;
     8 public class MyBodyTag extends BodyTagSupport{
     9     private static final long serialVersionUID = 1L;
    10     private String name; //接受属性名称
    11     private String scope; //接受查找范围
    12     private String id;
    13     private Iterator<?> iter = null;
    14     @Override
    15     public int doStartTag() throws JspException {
    16         Object value = null;
    17         if ("page".equals(this.scope)) {
    18             value = super.pageContext.getAttribute(name, PageContext.PAGE_SCOPE); //是否是page范围
    19         } else if ("request".equals(this.scope)) {    
    20             value = super.pageContext.getAttribute(name,PageContext.REQUEST_SCOPE); //是否是request范围
    21         } else if ("session".equals(this.scope)) {
    22             value = super.pageContext.getAttribute(name,PageContext.SESSION_SCOPE); //是否是session范围
    23         } else {
    24             value = super.pageContext.getAttribute(name,PageContext.APPLICATION_SCOPE); //是否是application范围
    25         }
    26         if (value !=null && value instanceof List<?>) { //如果没有查到属性
    27             this.iter = ((List<?>)value).iterator();
    28             if(iter.hasNext()){
    29                 super.pageContext.setAttribute(this.id,iter.next());
    30                 return BodyTagSupport.EVAL_BODY_BUFFERED; //找到属性,执行标签题内容
    31             }else{
    32                 return BodyTagSupport.SKIP_BODY; //找到属性,执行标签题内容
    33             }
    34         }else{
    35             return BodyTagSupport.SKIP_BODY; //不执行标签体内容
    36         }
    37     }
    38     @Override
    39     public int doAfterBody() throws JspException {
    40         if(iter.hasNext()){
    41             super.pageContext.setAttribute(this.id,iter.next());
    42             return BodyTagSupport.EVAL_BODY_AGAIN; //反复执行
    43         }else{
    44             return BodyTagSupport.SKIP_BODY;
    45         }
    46     }
    47     @Override
    48     public int doEndTag() throws JspException { //这个 方法 不执行 则 没有 输出 
    49         if(super.bodyContent != null){
    50             try {
    51                 super.bodyContent.writeOut(super.getPreviousOut());
    52             } catch (IOException e) {
    53                 e.printStackTrace();
    54             }
    55         }
    56         return BodyTagSupport.EVAL_PAGE;
    57     }
    58     public String getName() {
    59         return name;
    60     }
    61     public void setName(String name) {
    62         this.name = name;
    63     }
    64     public String getScope() {
    65         return scope;
    66     }
    67     public void setScope(String scope) {
    68         this.scope = scope;
    69     }
    70     public String getId() {
    71         return id;
    72     }
    73     public void setId(String id) {
    74         this.id = id;
    75     }
    76 }
    View Code
     1 package test_servlet_package.tag;
     2 import javax.servlet.jsp.tagext.TagData;
     3 import javax.servlet.jsp.tagext.TagExtraInfo;
     4 import javax.servlet.jsp.tagext.VariableInfo;
     5 public class MyTagExtraInfo extends TagExtraInfo{
     6     @Override
     7     public VariableInfo[] getVariableInfo(TagData data) {
     8         // TODO Auto-generated method stub
     9         return new  VariableInfo[]{ new VariableInfo(data.getId(),"java.lang.String",true,VariableInfo.NESTED)};
    10     }
    11 }
    View Code

    MySimpleTag

     1 package test_servlet_package.tag;
     2 import java.io.IOException;
     3 import java.text.SimpleDateFormat;
     4 import java.util.Date;
     5 import javax.servlet.jsp.JspException;
     6 import javax.servlet.jsp.tagext.SimpleTagSupport;
     7 public class MySimpleTag extends SimpleTagSupport{
     8     //jsp 2.0 之后 的 出现  为了 简化 开发 
     9     private String format;
    10     @Override
    11     public void doTag() throws JspException, IOException {
    12         SimpleDateFormat sdf = new SimpleDateFormat(this.format);
    13         this.getJspContext().getOut().write(sdf.format(new Date()));
    14     }
    15     public String getFormat() {
    16         return format;
    17     }
    18     public void setFormat(String format) {
    19         this.format = format;
    20     }
    21 }
    View Code

    MySimpleTagForIter

     1 package test_servlet_package.tag;
     2 import java.io.IOException;
     3 import java.io.StringWriter;
     4 import java.util.Iterator;
     5 import java.util.List;
     6 import javax.servlet.jsp.JspException;
     7 import javax.servlet.jsp.PageContext;
     8 import javax.servlet.jsp.tagext.JspFragment;
     9 import javax.servlet.jsp.tagext.SimpleTagSupport;
    10 public class MySimpleTagForIter extends SimpleTagSupport{
    11     //jsp 2.0 之后 的 出现  为了 简化 开发 
    12     private String name; //接受属性名称
    13     private String scope; //接受查找范围
    14     private String id;
    15     @Override
    16     public void doTag() throws JspException, IOException {
    17         Object value = null;
    18         if ("page".equals(this.scope)) {
    19             value = super.getJspContext().getAttribute(name, PageContext.PAGE_SCOPE); //是否是page范围
    20         } else if ("request".equals(this.scope)) {
    21             value = super.getJspContext().getAttribute(name,PageContext.REQUEST_SCOPE);//是否是request范围
    22         } else if ("session".equals(this.scope)) {
    23             value = super.getJspContext().getAttribute(name,PageContext.SESSION_SCOPE); //是否是session范围
    24         } else {
    25             value = super.getJspContext().getAttribute(name,PageContext.APPLICATION_SCOPE); //是否是application范围
    26         }
    27         if(value !=null && value instanceof List<?>){
    28             Iterator iter = ((List<?>)value).iterator();
    29             while(iter.hasNext()){
    30                 super.getJspContext().setAttribute(this.id,iter.next());
    31                 //PageContext pageContext = (PageContext) super.getJspBody().getJspContext();
    32                 //super.getJspBody().invoke(pageContext.getOut());
    33                 //super.getJspBody().invoke(null);//输出到相应里去 ,如果 是 个 流 文件 ,这会输出 到 文件 里去 ,,,
    34                 JspFragment jf = this.getJspBody();
    35                 StringWriter sw = new StringWriter();
    36                 jf.invoke(sw);
    37                 String s = sw.toString();
    38                 s = "zczx";
    39                 this.getJspContext().getOut().write(s); 
    40             }
    41         }
    42     }
    43     public String getName() {
    44         return name;
    45     }
    46     public void setName(String name) {
    47         this.name = name;
    48     }
    49     public String getScope() {
    50         return scope;
    51     }
    52     public void setScope(String scope) {
    53         this.scope = scope;
    54     }
    55     public String getId() {
    56         return id;
    57     }
    58     public void setId(String id) {
    59         this.id = id;
    60     }
    61 }
    View Code

    DynamicAttributesTag

     1 package test_servlet_package.tag;
     2 import java.io.IOException;
     3 import java.util.HashMap;
     4 import java.util.Iterator;
     5 import java.util.Map;
     6 import javax.servlet.jsp.JspException;
     7 import javax.servlet.jsp.tagext.DynamicAttributes;
     8 import javax.servlet.jsp.tagext.SimpleTagSupport;
     9 
    10 public class DynamicAttributesTag extends SimpleTagSupport implements DynamicAttributes {
    11     // jsp 2.0 之后 的 出现 为了 简化 开发
    12     private Map<String, Float> map = new HashMap<String, Float>();
    13     @Override
    14     public void doTag() throws JspException, IOException {
    15         Float num = 0.0f;
    16         Iterator<Map.Entry<String, Float>> iter = map.entrySet().iterator();
    17         while (iter.hasNext()) {
    18             Map.Entry<String, Float> val = iter.next();
    19             num += val.getValue();
    20         }
    21         this.getJspContext().getOut().write(num + "");
    22     }
    23 
    24     @Override
    25     public void setDynamicAttribute(String arg0, String arg1, Object arg2) throws JspException {
    26         map.put(arg1, Float.parseFloat(arg2.toString()));
    27     }
    28 }
    View Code

    测试

     1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
     2 <%@ page import="java.util.*"%>
     3 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
     4 <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
     5 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
     6 <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
     7 <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
     8 <%@ taglib uri="kongxh_tag" prefix="mytag"%>
     9 <html>
    10 <head>
    11     <title>index.jsp</title>
    12 </head>
    13 <body>
    14         <%
    15             List<String> all = new ArrayList<String>();
    16             all.add("test 1,");
    17             all.add("test 2,");
    18             all.add("test 3,");
    19             request.setAttribute("all", all);
    20         %>
    21 
    22     <mytag:IterTag name="all" scope="request" id="url">
    23         ${url}
    24     </mytag:IterTag>
    25     <br/>
    26     ----------------------
    27     <mytag:MyBodyTag name="all" scope="request" id="url">
    28         ${url} <%=url.length()%>
    29     </mytag:MyBodyTag>
    30     <br/>
    31     ----------------------
    32     <mytag:MySimpleTag format="yyyy-mm-dd" />
    33     <br/>
    34     ----------------------
    35     <mytag:MySimpleTagForIter name="all" scope="request" id="url">
    36         ${url}
    37     </mytag:MySimpleTagForIter>
    38     <br/>
    39     ----------------------
    40     <mytag:DynamicAttributesTag ab="3.4" gh="9.0" />
    41     <br/>
    42     ----------------------
    43     <c:out value="Hello world"></c:out>
    44 </body>
    45 </html>
    View Code

    总结:复习和记录一下之前用到一个知识点。

  • 相关阅读:
    JS中数组Array的用法{转载}
    XML运用于编程
    Net下Attribute的特性简单入门(转)
    JS比较好用的一些方法搜集
    再也不用为找loading图标而发愁(转)
    jQuery AJAX实现调用页面后台方法
    ajax 错误: invalid label
    treeview TreeNodeCollection 转化为 TreeNode[]
    怎么页面初始化时执行js方法
    asp 前台js获取后台的值
  • 原文地址:https://www.cnblogs.com/kongxianghao/p/6961993.html
Copyright © 2011-2022 走看看