struts1的标签与普通的html标签有一些不同:
- 一个form表单无论是以get或post方式提交后,页面表单内的标签会以key-value类似url 后面参数的形式提交到后台。这点两者是类同的,只不过标签参数不同,普通html标签key通常就是name属性,struts采用FormBean这个对象来承载页面到后台数据的传递(其实就是一种Map结构),这个Map的key就是struts标签的property属性,其实看看最终的html会发现struts1标签的property参数就是变成了普通html标签的name属性了。struts采用这种包装做法使得后台通过key获取到的value不再是简单的字符串,而是某个自定义类,或者是某个集合等等,而且property可以是嵌套的属性如ClassA.ClassB.property,这样我们就可以把一个form内所有标签都封装到一个VO里面,无论是从页面直接读取VO到后台,还是后台初始化VO到页面展示都是非常方便的。
- 注意虽然大部分标签看上去名字类似,其实很多用法并不相同。比如:最常见的就是strtus标签不允许内嵌其他代码。这点在结合jstl或者jsp表达式的时候可以看到,<input ${...EL} ...> 以及 <input <% ... %> ...>、<input <c:if ...> ...> 都是合法的,但换成<html:input ...> 就会报错了。这点很多人不爽,因为普通html标签配合jstl可以完成比较复杂逻辑的显示。
- struts标签最终都会变成普通html标签,其property属性会变成普通标签的name属性,而其struts标签的name属性通常(有例外)是用来指定使用哪个ActionForm里的数据。另外JS里常用getElementById() 方法可引用struts标签的styleId属性。
- 我们在servlet中常用request.getParameter("param")来获得URL(eg. www.sammythingking.com?param=value) ?后面参数的值,同样的,无论是在servlet还是在action中,都可以用这种形式来获取URL后面的参数。并且在struts中,如果你在相应地ActionForm中已有param参数的String类型property定义,那么你在处理的action中也可以用xxForm.getString("param")来获得。
几个常用的标签:
<html:select>
在struts1中,与select标签有关的tag有:
- <html:select>
- <html:option>
- <html:options>
- <html:optionsCollection>
下拉列表算是比较常用的了,在struts1中,通常我们都是在FormBean中定义一个集合来用下拉列表select展示。
<html:select> 的有两个比较重要的属性:
property* | Name of the request parameter that will be included with this submission, set to the specified value. | String |
multiple | If set to any arbitrary value, the rendered select element will support multiple selections. | String |
property属性用来后台获取用户选择的值,multiple表示是否为多选(同普通html标签)
<html:options> 和 <html:optionsCollection>就是用来装载option集合的了:
<html:optionsCollection>:
<html:select property="...">
<html:optionsCollection property="collection<T>" label="T.property1" value="T.property2" />
</html:select>
<html:options>:
<bean:define id="c" name="FormBean" property="collection<T>"/>
<html:select property="property">
<html:options collection="c" labelProperty ="T.property1" property ="T.property2" />
</html:select>
注意:<html:options>的collection属性必须是JSP上定义好的JSP Bean,property相当于value。
如果没有定义collection属性,那么labelProperty和property属性的就表示ActionForm中属性(必须是集合):
<html:select property="property">
<html:options property="collection1" labelProperty ="collection2" />
</html:select>
这个时候collection1就相当一个value的集合,labelProperty就相当于一个label的集合。两者一一对应,如果collection1的长度大于collection2的长度,多出的元素将作为label,反之,collection2多出的元素将被抛弃。
补充:还有个name属性,可以引用页面上定义的JSP Bean作为循环的集合。
参照:http://struts.apache.org/1.x/struts-taglib/tagreference.html#html:options
可以看到struts的select标签并没有selected属性,完全是通过option的 value绑定到 select的property 属性来确定哪个option被选定。有时候可能需要一些复杂点的逻辑来生成页面,建议采用JSTL+普通标签来实现会更合适。
待续...