【自定义标签开发】09-标签案例-开发foreach标签

我们接下来开发一个迭代集合的标签。我们知道struts中有一个<s:iterator>标签用来迭代集合,我们接下来模仿它写一个自定义标签。

前台的效果如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="/example" prefix="z" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Hello</title>
  </head>

  <body>

      <%
           List<String> list=new ArrayList<String>();
           list.add("张三");
           list.add("李四");
           list.add("王五");
           request.setAttribute("nameList",list);
       %>

       <z:foreach var="str" items="${nameList}">
           姓名:${str}<br/>
       </z:foreach>
  </body>

</html>

首先创建标签处理器类:

然后编写其中的逻辑:

package org.zyg.web.exampleTag;

import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class ForeachTag extends SimpleTagSupport {
    //传入数组、Map、List都有可能,所以用Object来接收参数
    private Object items;
    private String var;

    public void setItems(Object items) {
        this.items = items;
    }
    public void setVar(String var) {
        this.var = var;
    }

    @Override
    public void doTag() throws JspException, IOException {
        //对集合进行迭代
        List list=(List)items;
        Iterator it=list.iterator();
        while(it.hasNext()){
            Object value=it.next();
            //将迭代的值放入PageContext中的var值下
            this.getJspContext().setAttribute(var, value);
            //将标签体显示在页面上
            this.getJspBody().invoke(null);
        }
    }
}

然后在z.tld配置文件中注册该标签:

<tag>
    <name>foreach</name><!-- 标签名 -->
    <tag-class>org.zyg.web.exampleTag.ForeachTag</tag-class>
    <body-content>scriptless</body-content><!-- 有无标签体(单标签还是成对标签) -->

    <attribute>
        <name>var</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>

    <attribute>
        <name>items</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
</tag>

重启Web应用测试:

发现我们已经成功的将List集合迭代出来。

现在我们的迭代标签只能迭代List集合,我们还不能迭代Map和数组等其他类型的集合数据,我们下面进行改进。

我们的预期前段效果为:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="/example" prefix="z" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Hello</title>
  </head>

  <body>

      <%
          List<String> list=new ArrayList<String>();
          list.add("张三");
          list.add("李四");
          list.add("王五");
          request.setAttribute("nameList",list);
       %>
       <z:foreach var="str" items="${nameList}">
           姓名:${str}<br/>
       </z:foreach>

       <%
          Map<String,String> map=new HashMap<String,String>();
          map.put("总部","上海");
          map.put("分销处","广州");
          map.put("人力资源部","深圳");
          map.put("销售部","北京");
          request.setAttribute("localmap",map);
       %>
       <z:foreach var="entry" items="${localmap}">
           ${entry.key}:${entry.value }<br/>
       </z:foreach>

       <%
           Integer num[]={1,2,3,4};
           request.setAttribute("num",num);
        %>
       <z:foreach var="i" items="${num}">
           ${i }  
       </z:foreach>

  </body>

</html>

我们修改我们之前的标签处理器类:

package org.zyg.web.exampleTag;

import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class ForeachTag extends SimpleTagSupport {
    //传入数组、Map、List都有可能,所以用Object来接收参数
    private Object items;
    private String var;
    private Collection collection;

    //在设置items参数的时候对类型进行转换,不管是什么都转换成单列的Collection
    public void setItems(Object items) {
        this.items = items;
        //首先判断传递进来的数据是不是一个Collection
        if(items instanceof Collection){ //list set(单列)
            collection = (Collection)items;
        }

        if(items instanceof Map){
            Map map=(Map)items;
            collection=  map.entrySet();//双列改成了单列的set
        }

        if(items instanceof Object[]){
            Object[] obj=(Object[])items;
            collection=Arrays.asList(obj);//将数组转换成单列的list
        }
    }

    public void setVar(String var) {
        this.var = var;
    }

    @Override
    public void doTag() throws JspException, IOException {
        //对集合进行迭代
        Iterator it=collection.iterator();
        while(it.hasNext()){
            Object value=it.next();
            //将迭代的值放入PageContext中的var值下
            this.getJspContext().setAttribute(var, value);
            //将标签体显示在页面上
            this.getJspBody().invoke(null);
        }
    }
}

标签之前已经在z.tld中注册过了,这里不再注册。

然后重启Web应用,观察效果:

发现我们3种类型的数据都迭代出来了。

那么我们能不能迭代8种基本数据类型呢?我们试一下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="/example" prefix="z" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Hello</title>
  </head>

  <body>

      <%
          List<String> list=new ArrayList<String>();
          list.add("张三");
          list.add("李四");
          list.add("王五");
          request.setAttribute("nameList",list);
       %>
       <z:foreach var="str" items="${nameList}">
           姓名:${str}<br/>
       </z:foreach>

       <%
          Map<String,String> map=new HashMap<String,String>();
          map.put("总部","上海");
          map.put("分销处","广州");
          map.put("人力资源部","深圳");
          map.put("销售部","北京");
          request.setAttribute("localmap",map);
       %>
       <z:foreach var="entry" items="${localmap}">
           ${entry.key}:${entry.value }<br/>
       </z:foreach>

       <%
           Integer num[]={1,2,3,4};
           request.setAttribute("num",num);
        %>
       <z:foreach var="i" items="${num}">
           ${i }  
       </z:foreach>
       <br/>

       <p>int类型数组迭代</p>
     <%
         int num2[]={1,2,3,4};
         request.setAttribute("num2",num2);
      %>
     <z:foreach var="i" items="${num2}">
         ${i }  
     </z:foreach>
     <br/>

     <p>double类型数组迭代</p>
     <%
         double num3[]={1.12,2.312,3.123123,4.03};
         request.setAttribute("num3",num3);
      %>
     <z:foreach var="i" items="${num3}">
         ${i }  
     </z:foreach>
     <br/>

     <p>float类型数组迭代</p>
     <%
         float num4[]={1.22f,2.123f,3.1f,4.21f};
         request.setAttribute("num4",num4);
      %>
     <z:foreach var="i" items="${num4}">
         ${i }  
     </z:foreach>
     <br/>

     <p>char类型数组迭代</p>
     <%
         char num5[]={'l','o','v','e'};
         request.setAttribute("num5",num5);
      %>
     <z:foreach var="i" items="${num5}">
         ${i }  
     </z:foreach>
     <br/>

     <p>short类型数组迭代</p>
     <%
         short num6[]={11,22,33,44};
         request.setAttribute("num6",num6);
      %>
     <z:foreach var="i" items="${num6}">
         ${i }  
     </z:foreach>
     <br/>

     <p>long类型数组迭代</p>
     <%
         long num7[]={1111111111,222222222,333333333,444444444};
         request.setAttribute("num7",num7);
      %>
     <z:foreach var="i" items="${num7}">
         ${i }  
     </z:foreach>
     <br/>

     <p>byte类型数组迭代</p>
     <%
         byte num8[]={'%','$','=','#'};
         request.setAttribute("num8",num8);
      %>
     <z:foreach var="i" items="${num8}">
         ${i }  
     </z:foreach>
     <br/>

     <p>boolean类型数组迭代</p>
     <%
         boolean num9[]={1==2,(1+2)==3,5>2,7<6};
         request.setAttribute("num9",num9);
      %>
     <z:foreach var="i" items="${num9}">
         ${i }  
     </z:foreach>
     <br/>

  </body>

</html>

刷新页面,发现报错:

报的是“空指针异常”的错误。我们看一下我们的ForeachTag的代码45行是什么:

说明我们的collection.iterator();为空,也就是基本数据类型的数组没有被setItems(Object items)中的判断items类型的任何判定条件所判定,所以我们要加一个判断基本数据类型数组的判断条件:

注意:这里用到了反射技术,如果不清楚这一块的,建议先学习一下。

package org.zyg.web.exampleTag;

import java.io.IOException;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class ForeachTag extends SimpleTagSupport {
    //传入数组、Map、List都有可能,所以用Object来接收参数
    private Object items;
    private String var;
    private Collection collection;

    //在设置items参数的时候对类型进行转换,不管是什么都转换成单列的Collection
    public void setItems(Object items) {
        this.items = items;
        //首先判断传递进来的数据是不是一个Collection
        if(items instanceof Collection){ //list set(单列)
            collection = (Collection)items;
        }

        if(items instanceof Map){
            Map map=(Map)items;
            collection=  map.entrySet();//双列改成了单列的set
        }

        if(items.getClass().isArray()){//判断是不是数组
            this.collection=new ArrayList();
            int length=Array.getLength(items);//得到数组长度
            for (int i = 0; i < length; i++) {
                Object value=Array.get(items, i);
                this.collection.add(value);
            }
        }

        /*if(items instanceof Object[]){
            Object[] obj=(Object[])items;
            collection=Arrays.asList(obj);//将数组转换成单列的list
        }*/

    }

    public void setVar(String var) {
        this.var = var;
    }

    @Override
    public void doTag() throws JspException, IOException {
        //对集合进行迭代
        Iterator it=collection.iterator();
        while(it.hasNext()){
            Object value=it.next();
            //将迭代的值放入PageContext中的var值下
            this.getJspContext().setAttribute(var, value);
            //将标签体显示在页面上
            this.getJspBody().invoke(null);
        }
    }
}

上面这段代码,就可以对任意类型的数组进行迭代,当然大家理解之后可以使用同样的方法在我们自己的工程中使用。

我们的最终效果:

至此,我们的完整的foreach迭代标签开发完毕。

转载请注明出处:http://blog.csdn.net/acmman/article/details/51258357

时间: 2024-11-06 03:38:53

【自定义标签开发】09-标签案例-开发foreach标签的相关文章

详解JSTL的forEach标签

详解JSTL的forEach标签 为循环控制,它可以将集合(Collection)中的成员循序浏览一遍. ? ? ?<c:forEach> 标签的语法?说明?: 语法:迭代一集合对象之所有成员 <c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"] [end="end"

标签案例-开发foreach标签

1 if(item.getClass().isArray()){ 2 this.collection = new ArrayList(); 3 int length = Array.getLength(items); 4 for(int i=0;i<length;i++){ 5 Object value = Array.get(items,i); 6 this.collection.add(value); 7 } 8 } 接收任何类型集合或数组的代码 标签案例-开发foreach标签,布布扣,b

标签案例-开发防盗链标签

1 package cn.itcast.web.tag; 2 3 import java.io.IOException; 4 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7 import javax.servlet.jsp.JspException; 8 import javax.servlet.jsp.PageContext; 9 import

UI标签库专题九:JEECG智能开发平台 Choose(选则操作标签)

?? 1. Choose(选则操作标签) 1.1. 参数 属性名 类型 描述 是否必须 默认值 hiddenName string 隐藏域的ID 否 null hiddenid string 隐藏框id 否 null textname string 文档名称 否 null name string 名称 是 null icon string 选择按钮的图标 是 null height string 弹出框的高度 否 null width string 弹出框的宽度 否 null left stri

二维码防伪标签制作印刷 防伪系统开发

二维码防伪标签制作印刷防伪系统开发--(何 188.264.66502)我们不仅可以印刷二维码标签,还可以为您定制防伪系统.下面就给大家来说说防伪标怎么做.不知道大家在购买产品的时候有没有形成一个习惯,就是查看产品上有没有防伪标签或者防伪技术产品,大部分消费者在选择产品之前的时候会优先考虑这一点. 防伪标签在我们心里就是代表正规产品,产品有保障,厂家有这个实力来做,虽然说没有防伪标签的产品也不一定是假的,但是总是无形中形成这样一个思维习惯,而且有时候选择的时候会考虑这个产品的防伪标签查询系统是哪

组件化网页开发 / 步骤一 &#183; 4-4 匹配HTML标签

组件化网页开发 / 步骤一 · 4-4 匹配HTML标签 原文地址:https://www.cnblogs.com/Knowledge-is-infinite/p/11077627.html

[原创]java WEB学习笔记40:简单标签概述(背景,使用一个标签,标签库的API,SimpleTag接口,创建一个自定义的标签的步骤 和简单实践)

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

【电子书下载】《Android应用程序开发与典型案例》完整版!!

图书简介: <android应用程序开发与典型案例>共23章,内容包含两大部分.第一部分是android程序设计基础,在介绍android环境搭建以及android系统基本控件和组件后,详细介绍了android系统应用编程中典型的技术,比如,android中的图形图像.多媒体编程.gps定位与地图编程等:第二部分是android程序ui设计,从手机软件的交互设计谈起,介绍了android用户界面设计原则和方法.android用户界面设计哲学等,并给出了具体建议. <android应用程序

基于lucene的案例开发:实时索引的检索

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44279753 http://www.llwjy.com/blogdetail/31bb705106379feaf6d31b58dd777be6.html 个人博客小站搭建成功,网址 www.llwjy.com,欢迎大家来吐槽~ 在前面的博客中,我们已经介绍了IndexSearcher中的检索方法,也介绍了如何基于lucene中的NRT*类去创建实时索引,在这篇博客中我们就重点介

基于lucene的案例开发:案例初识

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/43192055 首先抱歉,这几天在准备案例的整体框架设计,所以更新就断了几天,还请原谅. 案例整体介绍 在我们开始正式的案例开发介绍之前,我们先看一下整体的案例demo介绍,明白案例是做什么的. 从上图中,我们可以看出,这个案例主要是通过爬虫程序去采集纵横小说上的资源,然后将资源存储到自己的数据库中,将数据库中的需要检索的数据通过lucene建立索引文件,最后通过web服务展示数