外层 tag 向内层 tag 传参数的实现[原创]

发表于:2007-07-04来源:作者:点击数: 标签:
好久没有发文章了,终于又写了一篇,^_^ ----------------------------------------- 外层 tag 向内层 tag 传参数的实现 作者: Jeru Liu 日期: 4th, Dec, 2002 E-mail: jeru_liu@hotmail.com 看看以下页面,形式有如 ParentTag name=XXX param name=n1 value=v1/
好久没有发文章了,终于又写了一篇,^_^
-----------------------------------------
外层 tag 向内层 tag 传参数的实现

作者: Jeru Liu
日期: 4th, Dec, 2002
E-mail: jeru_liu@hotmail.com

看看以下页面,形式有如
<ParentTag name="XXX">
<param name="n1" value="v1"/>
<param name="n1" value="v1"/>
</ParentTag>
这段代码实际上由三个tag组成,ParantTag调用一次,param tag 调用两次

有几点说明:
首先,ParentTag 中要有个集合,用来存放不定个数的参数,我们可以选择 Hashtable.
其次,param tag 要用到 Tag 基类中定义的 getParent()方法来获取外层 Tag 的句柄,然后将参数
put 到 ParentTag 的集合中去,这可能是个循环的过程.
再次,ParentTag 中 doStartTag 方法要说明它将包含 body
public int doStartTag() throws JspException{
return EVAL_BODY_INCLUDE;
}
这样才能执行内层 Tag



分析完毕,理清思路后,首先写一个接口,规定了所有的外层 tag 都要有集合的操作方法.

public interface ParamCollector
{

// for parameters
public abstract void setParams(Hashtable p);
public abstract Hashtable getParams();

public abstract void setParam(String name, String value);
}

然后写一个中间的过渡类用来做类型转换,同时实现接口ParamCollector和TagSupport类(需要getParent方法)
public class ParentTag extends TagSupport implements ParamCollector {

protected Hashtable mParams = new Hashtable();
public void setParams(Hashtable p) { mParams = p; }
public Hashtable getParams() { return mParams; }

public void setParam(String name, String value) {
mParams.put(name, value);
}
}

最后才是我们所需要的外层 Tag 来继承过渡类 ParentTag,他什么也不用做,
等着 param tag 传参数过来就 ok

public class UsePageElement extends ParentTag {

private String name;
public void setName(String n) { name = n; }
public String getName() { return name; }

public int doStartTag() throws JspException{
return EVAL_BODY_INCLUDE;
}


public int doEndTag() throws JspException{

System.out.println("Parameter size is " + mParams.size());
//...省去无关代码若干行
return SKIP_BODY;
}

}

再看看 param tag 干了些什么
public class ParamTag extends TagSupport {

private String mName;
private String mValue;

public String getName() { return mName; }
public void setName(String name) { mName = name; }

public String getValue() { return mValue; }
public void setValue(String value) { mValue = value; }

public int doEndTag() throws JspException{
System.out.println("Param Tag starting now......");
// 类型转换,这里正是我们需要用到过渡类的原因,鱼和熊掌我都要
ParentTag pt = (ParentTag)getParent();
// 向父 Tag 传参数
pt.setParam(mName, mValue);
return SKIP_BODY;
}

}

所有的代码到此结束了,一共4个类,下面看看jsp页面

<UsePageElement name="System Query">
<param name="jeru" value="haha"/>
<param name="dkt" value="lala"/>
<param name="shark" value="xixi"/>
</UsePageElement>

在页面里执行这段代码,后台就可以看到打印参数的结果,显示有三个参数
挺简单的吧

原文转自:http://www.ltesting.net