jsp tag 实例

有关JSP中自定义TAG的一个实例  

2007-07-21 10:52:08|  分类: java和j2ee学习 |字号 订阅html

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

  显然,这是一个嵌套Tag的问题。有三个Tag互相做用:最外层的Tag找到People对象,中间的Tag取得Collection,子Tag负责打印。java

  例如:apache

<diego:withObject value=$>
<diego:withCollection property=men>
<diego:elementout property=name/>
</diego:withCollection>
</diego:withObject>jsp

  思路以下:ide

  1) 编写WithObjectTag,负责从El表达式中取得对象oop

  2) 编写WithCollectionTag,负责从对象中取得 Collection ,遍历 Collection ,每遍历一次 Collection ,执行一次body学习

  3) 编写ElementoutTag ,把 Collection 中每一个men对象的 name 打印出来ui

  2. 完整程序以下:this

  在上例的diegoyun.vo包内,编写 People 类lua

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

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=$>
<diego:withCollection property=men>
<diego:elementout property=name/>
<br>
</diego:withCollection>
</diego:withObject>
</body>
</html>

  运行,则能够看到: 

Test loop tag: diego Zidane Rui 

相关文章
相关标签/搜索