下拉框是一个特别常用的html组件,在struts中的tag也是比较复杂的一个了,如果想真正的将MV分离学会如何使用标签是非常重要的,当然如果是高人,那自己写也是没有问题的^_^
最近作的一个页面上要用到下拉框,我想借此机会多学习一下如何使用标签来更好的将MV分离,因此下定决心一定要将下拉框的内容存放到一个bean里,然后通过标签调用bean,再用<html:optionsCollection>调用bean里面的LabelValueBean的集合。
说起LabelValueBean这个struts下的一个专门为select设计的bean还真是瞒好用的,不过在和同事讨论过程中觉得用这个集合bean来操作select的话,优点是在struts下的确方便,但是如果在其他框架下就成问题了,也就是说通用性差。什么东西都是有他的相对性的,我觉得没有什么可以说是完全通用的,因此我还是觉得用这个类来帮助我实现下拉框的
下面说说我的实现:
1、XXXSelector类,这个类是用来从数据库读取下拉框内容,并封装成LabelValueBean的Vector集合
2、XXXBean类,这个类就是要在页面上调用的bean类,我这里有两个下拉框,设置了两个属性,并对应两个getter方法,setter方法我觉得没有必要了,因为是通过XXXSelector类来设置下拉框内容的。
3、页面上先声明一个bean的引用,<jsp:useBean id="selector" scope="request" class="XXXBean">
4、然后就是在下拉框标签上引用这个bean,并设置好对应的属性。我是这样做的:
<html:select property="xxxId">
<html:optionsCollection name="selector" property="xxxIds"/>
</html:select>
补充:这个html:optionsCollection标签中只设置了两个属性,一个bean的id,另一个就是这个bean中的一个属性xxxIds,这是因为使用了LabelValueBean的好处,也可以说如果你的集合里面属性是label和value来定义的,那么效果和LabelValueBean是一样的,在这个标签里,value的默认值是'value',而label的默认值是'label'。
好了,这样就可以完美的实现了MV的分离工作。看上去就是这么短短的几行代码,但是真给我弄的糊涂了。
下面把我自己在这次学习过程中的总结写出来,共大家分享:
一开始我没有使用optionsCollection 这个标签,而是options这个标签,因为以前用过它,不过在实现上有点不雅,将很多java代码都直接写到了页面上,尤其是在下拉框非常多的时候是非常不舒服的。真是因为上次没有做好,这次才决心一定要做完美些。
This tag differs from the <html:options> tag in that it makes more consistent use of the name and property attributes, and allows the collection to be more easily obtained from the enclosing form bean.
上面这句话是在struts官方网站的userGuide摘下来的,这正说出了options与optionsCollection之间的本质区别。就在于optionsCollection可以使用bean更好的封装下拉框内容,在我这次实现中就是使用了一个bean,封装了多个下拉框需要用到的集合bean,然后通过设置属性property得到对应的下拉内容的集合。
Attribute Name
Description
filter
Set to false if you do NOT want the option labels filtered for sensitive characters in HTML. By default, such values are filtered. [RT Expr]
label
The property of the bean within the collection which represents the label to be rendered for each option. Defaults to "label". [RT Expr]
name
The attribute name of the bean whose properties are consulted when rendering the current value of this input field. If not specified, the bean associated with the form tag we are nested within is utilized. [RT Expr]
property
The property of the form bean, or the bean specified by the name attribute, that will return the collection of objects to be rendered for these options. [RT Expr]
style
CSS styles to be applied to this HTML element. [RT Expr]
styleClass
CSS stylesheet class to be applied to this HTML element (renders a "class" attribute). [RT Expr]
value
The property of the bean within the collection which represents the value to be rendered for each option. Defaults to "value". [RT Expr]
还有一点就是,和我一样的初学者朋友们,一定要有事没事就去http://struts.apache.org/userGuide/看看上面的文档,真是能帮助咱们解决很多困惑的,我以前就是不怎么看,觉得没有什么必要,但是通过这次觉得还真是非常有必要的。