当前位置: 首页 > 图文教程 > 网络编程 > JSP > Taglib 原理和实现:第四章 循环的Tag

JSP
GET 方式提交的含有特殊字符的参数
java big5到gb2312的编码转换
java Lucene 中自定义排序的实现
hibernate中的增删改查实现代码
jsp 定制标签(Custom Tag)
jsp基础速成精华讲解
IE cache缓存 所带来的问题收藏
关于JSP的一点疑问小结
JSP 多条SQL语句同时执行的方法
jsp include文件时的一个乱码解决方法
在JSTL EL中处理java.util.Map,及嵌套List的情况
jsp 页面显示的一些用法
根据Hibernte的cfg文件生成sql文件
五种 JSP页面跳转方法详解
JSP 防范SQL注入攻击分析
JSP 连接MySQL配置与使用
java eclipse 启动参数
jsp 页面上图片分行输出小技巧
解决jsp开发中不支持EL问题
JSP 页面中使用FCKeditor控件(js用法)

JSP 中的 Taglib 原理和实现:第四章 循环的Tag


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-03   浏览: 151 ::
收藏到网摘: n/a

1。问题:在request里的 People 对象,有个属性叫 men ,men 是一个Collection ,有许多个man 。现在,把 collection里的man的名字都显示出来

 显然,这是一个嵌套Tag的问题。有三个Tag互相作用:最外层的Tag找到People对象,中间的Tag取得Collection,子Tag负责打印。
 例如:
 <diego:withObject value="${people}">
  <diego:withCollection property="men">
   <diego:elementout property="name"/>  
  </diego:withCollection>
 </diego:withObject>
 
 思路如下:
 1.编写WithObjectTag,负责从El表达式中取得对象
 2.编写WithCollectionTag,负责从对象中取得 Collection ,遍历 Collection ,每遍历一次 Collection ,执行一次body
 3.编写ElementoutTag ,把 Collection 中每个men对象的 name 打印出来
 
 
2. 完整程序如下:
 
在上例的diegoyun.vo包内,编写 People 类

package diegoyun.vo;
import java.util.Collection;
public class People
{
 private Collection men = null; 
 public Collection getMen()
 {
  return men;
 }
 public void setMen(Collection men)
 {
  this.men = men;
 }
}

编写 withObject ,这是从request里取得People对象的最外层Tag

package diegoyun;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
import org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager;
public class WithObjectTag extends BodyTagSupport
{
 private Object value = null;

 public Object getValue()
 {
  return value;
 }
 public void setValue(Object value)throws JspException
 {
  this.value = ExpressionEvaluatorManager.evaluate(
            "value", value.toString(), Object.class, this, pageContext);
 }
 public int doStartTag()
 {  
  return EVAL_BODY_INCLUDE;
 }
 public int doEndTag()throws JspException
 {  
  return EVAL_PAGE;
 }
}

 

编写WithCollectionTag,该Tag负责取得Collection,并遍历执行子Tag
package diegoyun;

import java.util.Collection;
import java.util.Iterator;

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

import org.apache.commons.beanutils.PropertyUtils;

public class WithCollectionTag extends BodyTagSupport {
 private Object element = null;

 private Collection list = null;

 private Iterator iterator = null;

 public Object getElement() {
  return element;
 }

 public void setProperty(String property) throws JspException {
 //取得父Tag对象,并且得到Collection
  WithObjectTag parent = (WithObjectTag) getParent();
  if (parent == null)
   throw new JspException("parent tag is null");
  try {
   Object propertyValue = PropertyUtils.getProperty(parent.getValue(),
     property);
   this.list = (Collection) propertyValue;
   if (list == null)
    throw new JspException("Collection is null");
  } catch (Exception e) {
   throw new JspException(e);
  }
 }

 public int doStartTag() throws JspException {
 //设置第一个元素,然后执行子Tag
  iterator = list.iterator();
  if (iterator.hasNext())
   element = iterator.next();

  return EVAL_BODY_INCLUDE;
 }

 public int doAfterBody() {
  if (iterator.hasNext()) {
  //如果还存在子元素,设置子元素,并且再次执行子Tag
  //循环由此而来
  //否则不再执行子Tag
   element = iterator.next();
   return EVAL_BODY_AGAIN;
  }
  else
   return EVAL_PAGE;
 }
}

编写 ElementOutputTag

package diegoyun;
import java.io.IOException;

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

import org.apache.commons.beanutils.PropertyUtils;

public class ElementOutputTag extends TagSupport
{
 private Object propertyValue  = null;
 public void setProperty(String property)throws JspException
 {
  WithCollectionTag parent = (WithCollectionTag)getParent();
  if(parent == null)
   throw new JspException("parent tag is null");
  try
  {
  //判断上层tag中是否存在该属性名称,如果存在,取得属性值,否则报错
   propertyValue = PropertyUtils.getProperty(parent.getElement(), property);
  }
  catch (Exception e)
  {
   throw new JspException(e);
  }
 }
 public int doEndTag()throws JspException
 {
  try
  {
  //简单的把值打印到jsp页面
   pageContext.getOut().print(propertyValue);
  }
  catch (IOException e)
  {
   throw new JspException(e);
  }
  return EVAL_PAGE;
 }
}

编写tld
<!--WithObjectTag-->
 <tag>
  <name>withObject</name>
  <tag-class>diegoyun.WithObjectTag</tag-class>
  <body-content>JSP</body-content>
  <attribute>
   <name>value</name>
   <required>false</required>
   <rtexprvalue>true</rtexprvalue>
  </attribute>
 </tag>
 <!--WithCollectionTag-->
 <tag>
  <name>withCollection</name>
  <tag-class>diegoyun.WithCollectionTag</tag-class>
  <body-content>JSP</body-content>
  <attribute>
   <name>property</name>
   <required>false</required>
   <rtexprvalue>true</rtexprvalue>
  </attribute>
 </tag>
 <!--ElementOutputTag-->
 <tag>
  <name>elementout</name>
  <tag-class>diegoyun.ElementOutputTag</tag-class>
  <body-content>empty</body-content>
  <attribute>
   <name>property</name>
   <required>false</required>
   <rtexprvalue>true</rtexprvalue>
  </attribute>
 </tag>
 
编写jsp
<%@ page language="java" %>
<%@ page import="diegoyun.vo.*"%>
<%@ page import="java.util.*"%>
<%@ taglib uri="/WEB-INF/tlds/diego.tld" prefix="diego"%>

<html>
<body bgcolor="#FFFFFF">
<%
Collection c = new ArrayList();

Man man1 = new Man();
man1.setName("diego");
c.add(man1);

Man man2 = new Man();
man2.setName("Zidane");
c.add(man2);

Man man3 = new Man();
man3.setName("Rui");
c.add(man3);

People p =new People();
p.setMen(c);
request.setAttribute("people",p);
%>
Test loop tag:
<br>
<diego:withObject value="${people}">
 <diego:withCollection property="men">
  <diego:elementout property="name"/>
 <br>
 </diego:withCollection>
</diego:withObject>
</body>
</html>

运行,则可以看到:
Test loop tag: 
diego 
Zidane 
Rui