JSP自定义标签(三)域对象的使用

本文介绍一下域对象的使用,实现具有foreach功能的JSP自定义标签。

关键代码在pageContext.getRequest(),同样,获取JSP的其它域对象也可以从pageContext中获取,在设计具有foreach这样具有循环迭代功能的标签时,需要在域对象中暂存所需的值,然后通过EL表达式取出。

Java代码:

package com.yt.tag.fore;

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

import javax.servlet.ServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class Foreach extends BodyTagSupport {
    private static final long serialVersionUID = 6575296715646088842L;
    //取出对象的值数组
    private Object[] values;
    //用于遍历数组的索引
    private int index = 0;
    //默认key名字叫item
    private String var = "item";
    //用于接收集合的参数
    private Object items;

    @Override
    public int doStartTag() throws JspTagException {
        //初始化值数组,将List或者Map的值取出
        System.out.println("doStartTag");
        if (items instanceof List) {
            values = ((List) items).toArray();
        } else if (items instanceof Map) {
            values = ((Map) items).values().toArray();
        }
        if (values.length > 0) {
            return EVAL_BODY_BUFFERED;
        } else {
            return SKIP_BODY;
        }
    }

    @Override
    public int doAfterBody() throws JspTagException {
        System.out.println("doAfterBody");
        //获取数据缓存域,这里取Request(context,page,session看需求选则)
        ServletRequest request = pageContext.getRequest();
        if (index < values.length) {
            //如果还没遍历完数组,就继续遍历,将值放到缓存域中(页面通过EL表达式取出)
            request.setAttribute(var, values[index++]);
            return EVAL_BODY_BUFFERED;
        }else {
            //遍历完数组,那就输出全部内容
            try {
                if (bodyContent != null)
                    bodyContent.writeOut(bodyContent.getEnclosingWriter());
            } catch (IOException e) {
                e.printStackTrace();
            }
            //为了不影响下一次的使用,清除缓存域(可以放到doEndTag()方法中)
            request.removeAttribute(var);
            return SKIP_BODY;
        }
    }

    @Override
    public int doEndTag() throws JspException {
        //标签结束,初始化参数(此对象实例可能会被多次调用,初始化参数防止对下一次调用会产生影响)
        index = 0;
        values = null;
        return SKIP_BODY;
    }
    
    public String getVar() {
        return var;
    }

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

    public Object getItems() {
        return items;
    }

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

 .tld配置文件

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<taglib>
    <tlib-version>1.0</tlib-version>
    <jsp-version>2.0</jsp-version>
    <short-name>simple</short-name>
    <uri>/css_fore_tag</uri>
    <tag>
        <name>forEach</name>
        <tag-class>com.yt.tag.fore.Foreach</tag-class>
        <body-content>JSP</body-content>
        <attribute>
            <name>var</name>
            <type>String</type>
        </attribute>
        <attribute>
            <name>items</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
</taglib> 

 JSP页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<!-- 引入标签库 -->
<%@ taglib uri="/css_fore_tag" prefix="tag"%>
<!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>
<%
    List list = new ArrayList();
    list.add("AAA");
    list.add("BBB");
    list.add("CCC");
    list.add("DDD");
    request.setAttribute("list", list);
    Map<String,Object> map = new HashMap();
    map.put("AAA","AAA");
    map.put("BBB","BBB");
    map.put("CCC","CCC");
    request.setAttribute("map", map);
%>
<body>
    <tag:forEach items="${list}" var="item">${requestScope.item}</tag:forEach>
    <br/>
    <tag:forEach items="${map}">${requestScope.item}</tag:forEach>
</body>
</html>

 

posted on 2017-06-20 20:14  疯狂的妞妞  阅读(140)  评论(0编辑  收藏  举报

导航