本站首页    管理页面    写新日志    退出

The Neurotic Fishbowl

[/*Java*/][转]Struts源码研究 - html-Link标签篇
nybon 发表于 2005/3/13 22:54:04

Struts源码研究 - html-Link标签篇 Struts中的html:link标签是一个很常用的标签,其功能也比较明显:生成<a href="yoururl"></a>这样的HTML代码在刚开始接触这个标签的时候,我知道这个标签可以这样用:=========================================================<html:link page="/html-link.do" paramId="stringProperty" paramName="newValue">String via paramId and paramName</html:link>=========================================================这个newValue一般就是一个String类型的变量,上述的代码将生成这样的HTML代码:<a href="http://serverip:portno/projectcontextname/html-link.do?stringProperty=$newValue">String via paramId and paramName</a>其中$newValue表示的是newValue这个变量的值也可以这样用:=========================================================<html:link page="/html-link.do"paramId="booleanProperty"paramName="testbean" paramProperty="booleanProperty">Boolean via paramId, paramName, and paramValue</html:link>=========================================================这里多了一个paramProperty属性,这里的name属性和property属性和bean:write标签一样,一般来说name的值是一个被绑定在request、session、application或page范围内的对象的绑定key值,Property属性的值则是这个对象的一个成员变量的名称使用了name和Property之后,struts将在上述四种范围内,以name变量值为key查找对象,并将对象读出后,取出Property定义的成员变量的值。所以以上的标签被转化成HTML代码之后如下:<a href="http://serverip:portno/projectcontextname/html-link.do?booleanProperty=$testbean.booleanProperty"> Boolean via paramId, paramName, and paramValue</a>OK,了解到这里之后,感觉到一丝遗憾,因为如果只有paramId,paramName,paramProperty这三个属性的话,那么对于html:link标签来说,就永远只能自定义一个参数,如果需要定义多个参数,如http://serverip:portno/projectcontextname/html-link.do?a=3&b=5&y=9这样的链接URL来说,就无能为力了如果要定义多个参数,就需要手动拼URL,定义在page属性里面,这就失去了使用标签的意义了。在此情况下,怀着失望的心情,打开了Struts的源码,开始查看这个标签的源码,忽然发现,这个标签完全是可以自定义多个参数的,关键就在name属性上首先来看一段如何自定义多个参数的代码,如下:=========================================================<% java.util.HashMap newValues = new java.util.HashMap();newValues.put("floatProperty", new Float(444.0));newValues.put("intProperty", new Integer(555));newValues.put("stringArray", new String[]{ "Value1", "Value2", "Value3" });pageContext.setAttribute("newValues", newValues);%><html:link page="/html-link.do" name="newValues">Float, int, and stringArray via name (Map)</html:link>=========================================================原来使用name属性就可以将一个Map类型的变量放入request、session、application、page四种范围的容器内,然后取个key值,填在name属性里就可以了Struts将自动读取这个Map类型对象的所有key和key所定义的对象,然后自动生成HTML代码好比上述的例子,将生成如下的HTML代码:<a href="http://serverip:portno/projectcontextname/html-link.do?stringArray=Value1&stringArray=Value2&stringArray=Value3&floatProperty=444.0&intProperty=555">Float, int, and stringArray via name (Map)</a>愿望终于达到了,也充分证明了Struts的实力,但在这段实现中,查找name定义的对象这点在前面几次的源码剖析中已经很明确了(使用的是TagUtils.java中的lookup方法)但得到这个对象后,Struts是如何读出key值集合和key值对应的对象的呢?代码在此:=========================================================// Add the required request parametersboolean question = temp.indexOf('?') >= 0;//这里的params变量就是我们输入的Map类型的对象//就是这句代码可以得到key值集合Iterator keys = params.keySet().iterator();while (keys.hasNext()) {String key = (String) keys.next();Object value = params.get(key);if (value == null) {if (!question) {url.append('?');question = true;} else {url.append(separator);}url.append(this.encodeURL(key));url.append('='); // Interpret null as "no value"} else if (value instanceof String) {if (!question) {url.append('?');question = true;} else {url.append(separator);}url.append(this.encodeURL(key));url.append('=');url.append(this.encodeURL((String) value));} else if (value instanceof String[]) {String values[] = (String[]) value;for (int i = 0; i < values.length; i++) {if (!question) {url.append('?');question = true;} else {url.append(separator);}url.append(this.encodeURL(key));url.append('=');url.append(this.encodeURL(values[i]));}} else /* Convert other objects to a string */ {if (!question) {url.append('?');question = true;} else {url.append(separator);}url.append(this.encodeURL(key));url.append('=');url.append(this.encodeURL(value.toString()));}}=========================================================已经不用再做多余的解释了,代码已经说明一切。其实在PropertyMessageResource.java中,也有类似的代码,就是将property文件读出的一段代码,在ActionServlet初始化时被调用在bean:message标签研究一文中可以找到这段代码最后想说的是,Struts的源码写的相当的优秀,不停的学习对提高自身的水平是很有裨益的  作者: gaokx 2004年08月27日, 星期五 13:50

阅读全文(2802) | 回复(0) | 编辑 | 精华

 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)

 
 



The Neurotic Fishbowl

.: 公告

This blog focuses on:

Semantic Web && Java Technology


Bloginess

«July 2025»
12345
6789101112
13141516171819
20212223242526
2728293031

.: 我的分类(专题)

首页(171)
/*SemanticWeb*/(34)
/*Java*/(74)
/*FreeComments*/(59)
/*Agent*/(4)


In the Bowl

.: 最新日志

The End
使用Google Trends进行选型
怎样才能称为一次新的版本发行?
如何防止RSS信息过载
使用Excel作为用户接口
如何有效地报告Bug
sourceforge再次被封
趣文两篇
编写Firefox扩展
Jetspeed心得随笔


.: 最新回复

回复:Google API与yahoo 
回复:JADE 3.3的bug
回复:JADE 3.3的bug
回复:JADE 3.3的bug
回复:JADE 3.3的bug
回复:Jbpm和Shark比较的feat
回复:JADE 3.3的bug
回复:JADE 3.3的bug
回复:[转]批判性地看待一种可行的表示技
回复:JIRA破解


The Fishkeeper
blog名称:SW Portal
日志总数:171
评论数量:219
留言数量:8
访问次数:1043031
建立时间:2004年10月30日



Text Me

.: 留言板

签写新留言

路过
路过
页脚问题
RE:请问一下你的主页的下面部分是怎么关
请问一下你的主页的下面部分是怎么关闭的?
我是做Mobile Agent的
Gmail
不错
不错啊小倪同学


Other Fish in the Sea

.: 链接





站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144750526 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号