`
zwchen
  • 浏览: 786433 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Struts的html:options 标签内幕

阅读更多
最近用一个在日本很流行的框架Seasar开发,表示层用Mayaa做模板语言,它可以支持Struts、JSTL,当然也有自己的一套标签。当涉及到下拉列表时,问题出来了。
之所以要记录下来:
1、 网上对Struts的html:options标签使用有误,就是一个下拉列表,有那么复杂吗?Webwork里面处理起来非常简单,而Struts确要LabelvalueBean,感觉异常复杂。http://java.ccidnet.com/art/3739/20060721/649923_1.html
2、 Struts1.24官方的examples里面没有html:options的例子,mailReader例子倒是有一个,我仔细研究过,但那个例子估计一眼看不懂,因为它对那个下拉列表“Server Type”里面的初始值是通过DigestingPlugIn赋上的,那段代码需要对Digester库、Struts的PlugIn机制、org.apache.struts.util.LabelValueBean等有了解,当然对mailReader的业务本身很了解。
3、 几本Struts电子书,包括官方文档,对这个解释都非常模糊:collection、name、property、labelProperty、labelProperty。难怪别人说Struts提供的标签不好用。如果不是项目要求,我一般会选择JSTL,简洁啊!但Struts的html tag部分确实没法取代,因为它和验证、自动赋值耦合太紧。
4、 Options标签非常常用,也是标签中最难理解的几个之一,我看到的很多例子,包括日本人提供的例子都是手动for循环赋值

Struts的标签真的这么费劲吗?我决定看看它的源码:org.apache.struts.taglib.htmlOptionsTag.java

我就不贴源码了,我大致说一下设计原理吧:
1、 如果找不到SelectTag,抛出异常,说明必须在select标签下。

2.1、 当collection属性不为null时,从该collection中得到iterator,该collection可以为Array,Collection(如ArrayList,Vector…),Map,Iterator、Enumeration等,具体方法是:
protected Iterator getIterator(String name, String property) throws JspException

2.2、 将该iterator循环,获取每个item,也就是collection里面的JavaBean,通过
BeanUtils库的PropertyUtils.getProperty(bean, property)方法,property就是Bean里面的某个getXXX方法,它最终显示为option的value属性。Note:property就是标签的property属性。

2.3、 对于option的label属性,如果没有设置labelProperty,就用value,否则用它,也就是getYYY的yYY属性。

2.4、 每个迭代完成后,都会将其加入一个StringBuffer中,也就是最后页面显示。那段html。

3.1、如果用自定义的iterator来解析options的话,那就是name、property、labelName、labelProperty这四个属性了。我靠,没有例子,官方文档谁懂?我不解释了。

4、另外,官方还提供了一个html:optionsColleciton 标签,它和options标签非常类似,我对照源码,配置了一下,还是好用的,它和optionsTag源码几乎一样。

5、我发现LabelvalueBean没有必要用。

下面是它们两个的配置,都测试过:
说明:大家忽视m:id标签属性,其它和Struts一样,catList是一个分类列表,请不要用EL,如${catList}, 它是通过request.setAttribute("catList", catList)设置的。标签库会通过pageContext.findAttribute(name)找该对象(sun的API注释:Searches for the named attribute in page, request, session (if valid), and application scope(s) in order and returns the value associated or null):

	<html:select m:id="category" property="categoryId">
		<html:options collection="catList" property="id" labelProperty="name" />
	</html:select>
	<html:select m:id="category" property="categoryId">
		<html:optionsCollection  name="catList" label="name" value="id" />
	</html:select>


总结:Struts的源码还是挺简单的,我以前读过大部分核心源码,并自己仿照Webwork写了一个Web框架,拿来项目中用,真爽。

建议:大家要是看例子不太明白,又没有例子,也不妨读读。因为代码都是类似的,你读过OptionsTag的源码,其它类似源码应该都很简单了。



分享到:
评论
2 楼 宏基小键盘 2007-06-18  
m:id 是什么玩意儿?struts html tags里貌似没有的说
1 楼 rainlife 2007-04-20  
html:options确实不好用,以前还自己去实现了它的功能,当然,结果就是重复发明了轮子。

相关推荐

Global site tag (gtag.js) - Google Analytics