`
igogogo9
  • 浏览: 246911 次
  • 性别: Icon_minigender_1
  • 来自: 海口市
社区版块
存档分类
最新评论

Taglib原理和实现之循环的Tag

阅读更多
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  
分享到:
评论

相关推荐

    taglib 原理和实现.

    taglib 原理和实现.taglib 原理和实现.

    pager-taglib 分页扩展实例

    pager-taglib 是个很好的jsp分页标签,使用它结合jstl可以实现灵活的分页导航功能。在实际的开发中post方式的提交比较常见,本人做了一个比较通用的基于post方式的一个应用。主要实现一下功能: 1.添加输入跳转、每...

    struts taglib使用示例

    struts taglib使用示例 struts taglib使用示例 struts taglib使用示例struts taglib使用示例 struts taglib使用示例

    pager-taglib实现Google分页

    pager-taglib实现Google分页 分页基于SSH.有pager-taglib.jar包和实现的完整代码.

    struts-taglib-1.3.10.jar struts-taglib.jar taglib.jar

    struts-taglib-1.3.10.jar struts-taglib.jar taglib.jar

    使用pager-taglib实现分页显示的详细步骤

    使用pager-taglib结合ssh框架轻松从数据库开始实现前台的分页显示,非常实用的东西!!会给你很大的帮助和惊喜的

    taglib-1.11.1.rar

    taglib-1.11.1 taglib-1.11.1 taglib-1.11.1 taglib-1.11.1 taglib-1.11.1 taglib-1.11.1 taglib-1.11.1

    在jsp中使用自定义taglib

    一个tag就是一个普通的java类,它唯一特别之处是它必须继承TagSupport或者BodyTagSupport类。这两个类提供了一些方法,负责jsp页面和你编写的类之间的交互,例如输入,输出。而这两个类是由jsp容器提供的,无须开发...

    Taglib自定义标签库

    讲述Taglib 自定义标签

    idea需要的taglib标签库包

    idea需要的taglib标签库包,idea没有自带的taglib标签库,需要手动导入taglib包,并且配置对应的路径,进入“settings”设置选项,然后搜“DTD”然后如下图,在左边的标签选项卡找到“Schemas and DTDS” ,在url的...

    pager-taglib的安装和使用

    pager-taglib的安装和使用来实例分页的实例

    pager-taglib 分页标签使用

    本人自己练习用的、备用、以防下次用的时候忘记如何使用

    SSHConformity【display标签和taglib标签】,display标签,pager-taglib标签

    SSHConformity【display标签和taglib标签】,display标签,pager-taglib标签

    深入浅出taglib.pdf

    标准的 JSP 标记可以调用 JavaBeans 组件或者执行客户的请求,这大大降低了 ...taglib 通常定义在tag 标签库中,这种 标签库存放着你自己定义的 tag 标签。简而言之,如果使用 taglib,那么你可以设计自己的 JSP 标记!

    pager-taglib实现用户信息分页

    这是我读大学时写的demo,实现了分页,本实例仅适合与初学者,里面有sql脚本,dist目录下有构建好的war包,当时使用ant构建的,整理电脑文件时保留了下来,

    ssh2+pager-taglib实现自动分页

    Pager-taglib,支持多种风格的分页显示。实际上她是一个Jsp标签库,为在JSP上显示分页信息而设计的一套标签,通过这些标签的不同的组合,会形成多种不一样的分页页面,风格各异,她自带的DEMO就有七种左右的分页风格...

    ssh+pager taglib分页实现

    NULL 博文链接:https://aa00aa00.iteye.com/blog/733410

    json-taglib 使用方法

    json-taglib 使用方法,json:object json:Array json:Property

    iCP TagLib

    iCP Training---105 TagLib.ppt

    pager-taglib源码

    这是pager-taglib的官方源码,但在采用官方的pager-taglib分页传输中文参数会出现乱码,所以我采用maven新建一个pager-...以便可以根据需求重构pager-taglib引用,如果熟悉maven可以直接使用maven构建和安装到本地仓库

Global site tag (gtag.js) - Google Analytics