为什么要使用标签
标签的作用:对于一个MVC框架来说,model就不用说了,重点是实现控制和视图两个部分。在struts中,控制器主要有Action来提供支持的,视图则是由标签来提供的。(struts2内建的标签库简化了JSP页面的输出逻辑的实现,可以完全避免在JSP页面中使用JAVA脚本,提高了表现组件的可维护性)
UI标签:
表单标签
在普通HTML页面中,表单使用的是标签
<form action="/hellodworld/**.action" method="post/get"></form>
Struts2中有对应的标签:
<s:form action="**.action" method="post"></form>
<s:form action="**.action" method="post" namespace="/test"></form>
的action属性不用带应用上下文,例如:/helloworld,可以使用namespace属性来指定使用到的命名空间。
单选框标签
<s:checkbo label="已婚" name="user.married" value="false" fieldValue ="false">
value:是否选中
fieldValue:相当于传统checkbox中的value值
复选框
list:用于生成单选框的集合
listkey:生成的radio的value属性
listValue:生成的radio后面显示的文字
value:当前的默认选项
<s:checkboxlist name="user.hobbies" list="hobbies"/>
<s:checkboxlist name="user.hobbies" list="'篮球','足球','排球'"/>
<s:checkboxlist name="user.hobbies" list="hobbies" listKey="hid" listValue="hname" value={...}/>
下拉框
<!-- 直接指定list集合里面的值-->
<s:combobox label="选择你喜欢的颜色" name="colorNames"
headerValue="------请选择------" headerKey="1"
list="{'红','橙','黄','绿','青','蓝','紫'}" />
<!-- 动态绑定list集合里面的值 -->
<s:combobox label="选择你喜欢的颜色" name="colorName"
headerValue="------请选择------" headerKey="1" list="colors" />
<!-- 动态生成的值 -->
<s:bean name="struts.util.Counter" var="year">
<s:param name="first" value="1990"/>
<s:param name="last" value="2000"/>
</s:bean>
二级选择框
TestAction:
Map<String, List<String>> map = new HashMap<>();
List<String> l1 = new ArrayList<>();
l1.add("a");
l1.add("b");
map.put("一", l1);
List<String> l2 = new ArrayList<>();
l2.add("aaa");
l2.add("bbb");
map.put("二", l2);
List<String> l3 = new ArrayList<>();
l3.add("aaaaaaaa");
l3.add("bbbbbbbb");
map.put("三", l3);
<s:doubleselect label="选项" name="user.ch1" list="%{map.entrySet()}" listKey="key" listValue="key" doubleName="user.ch2" doublelist="value"/>
如图:
属性说明:
formName:对应的表单名称。
label: 该级联下拉列表的标签。
name:第一个下拉列表的名称。
id:第一个下拉列表的id的名称。
list:指定用于输出第一个下拉列表框中选项的集合。
listKey:指定集合元素中的某个属性作为第一个下拉列表的value。(提交是的参数名)
listValue:指定集合元素中的某个属性作为第一个下拉框的标签。(显示出来的值)
其他同理。
单选框标签
list:用于生成单选框的集合
listKey:生成radio的value属性
listValue:生成radio后面显示的文字
value:当前默认选项
<s:radio name="user.gender" list="{‘男’, ‘女’}" listKey="name" listValue="age"/>
<s:radio name="user.gender" list="#{‘m’:’男’, ‘f’:’女’}" listKey="key" listValue="value"/>
<s:radio name="user.major.majorid" list="majorList" listKey="majorid" listValue="name"/>
非UI标签
标签
property标签用于输出指定的值,这个值可以是任何ONGL可以访问到的值,例如Action的属性,或者是request,session,application作用域中的值,也可以是某个类的静态方法和静态属性值,甚至是Math类中的方法。
获取的是requet中的对象值
<s:property value="#request.user1.realName"/>
<s:property value="#request.user1['realName']"/>
<s:property value="#user1.realName"/>
<s:property value="#user1['realName']"/>
${requestScope.user1.realName } || ${requestScope.user1['realName'] }
<s:property value="#attr.user1.realName"/>
获取session中的值
<s:property value="#session.user1.realName"/>
<s:property value="#session.user1['realName']"/>
${sessionScope.user1.realName } || ${sessionScope.user1['realName'] }
获取application中的对象的值
<s:property value="#application.user1.realName"/>
<s:property value="#application.user1['realName']"/>
${applicationScope.user1.realName } || ${applicationScope.user1['realName'] }
标签
iterator标签用于对集合进行迭代,这里的集合包含List、Set和数组。
value:可选属性,指定被迭代的集合,如果没有设置该属性,则使用ValueStack栈顶的集合。
id:可选属性,指定集合里元素的id。
status:可选属性,该属性指定迭代时的IteratorStatus实例。该实例包含如下几个方法:
int getCount(),返回当前迭代了几个元素。
int getIndex(),返回当前迭代元素的索引。
boolean isEven(),返回当前被迭代元素的索引是否是偶数
boolean isOdd(),返回当前被迭代元素的索引是否是奇数
boolean isFirst(),返回当前被迭代元素是否是第一个元素。
boolean isLast(),返回当前被迭代元素是否是最后一个元素。
直接创建List类型集合的语法为: {e1, e2, e3, …}。
直接创建Map类型集合的语法为: # {key0:value0, key1:value1, key2:value2,…..}。
第一种:list或set集合中的使用
<!-- 使用set生成一个集合-->
<s:set name="list" value="{'a','b','c','d'}"></s:set>
<!-- list存放默认到request中,以value="#request.list" 引用 -->
<s:iterator var="ent" value="#request.list" status="statu">
<s:property value="#ent" />
</s:iterator>
<s:iterator value="{'a','b','c'}" id='char' status='st'>
<s:if test="#st.even">
现在的索引是奇数为:<s:property value='#st.index'/>
</s:if>
当前元素值:<s:property value='char'/>
</s:iterator>
第二种:map集合中的使用
map集合生成语法格式:# {key0:value0, key1:value1, key2:value2,…..}。以上的语法中就直接生成了一个Map类型的集合,该Map对象中的每个key-value对象之间用英文的冒号隔开,多个元素之间用逗号分隔。
<s:set var="map" value="#{'1':'laowang','2':'老王','3':'猩猩'}"></s:set>
<s:iterator value="#map">
<s:property value="key" /> : <s:property value="value" />
</s:iterator>
<s:iterator value="map" id="id" status="st">
编号 : <s:property value='#st.count'/>
key : <s:property value='key'/>
value:<s:property vlaue='value'/>
</s:iterator>
第三种:集合的筛选遍历
<!-- 遍历出价格大于3000的 -->
<s:iterator var="user" value="#session['users']">
<s:if test="%{#user['price']>3000}">
<s:property value="#user['price']"/>
</s:if>
</s:iterator>
<!-- $是取出价格 大于3000的最后一个值 -->
<s:iterator var="u" value="#session.users.{$(#this['price']>3000)}">
<s:property value="price"/>
</s:iterator>
第四种:遍历2个list
List<AttrName> attrN {color,size,style}
List<AttrValue> attrV {red,20,gay}
这2个list的元素是一一对应的,一个attrN对应一个attrV
<s:iterator value="%{attrN }" id="id" status="status">
index is : <s:property value='status.index'/>
attrName is : <s:property value='id'/> or <s:property value='%{id}'/>
attrName is : <s:property value='%{attrV[#status.index]}'/>
</s:iterator>