好久没有发文章了,终于又写了一篇,^_^
—————————————–
外层 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>
在页面里执行这段代码,后台就可以看到打印参数的结果,显示有三个参数
挺简单的吧
