在struts2的文件包中,有关于标签的具体使用方法,但是却需注意的是,官方文档某些地方描述是不准确,需要自己根据实际验证。
官方文档所在位置,struts-2.3.16.1/docs/WW/docs/home.html,进入网页后选择Guide,然后就可以看到Tag Developers Guide,在这里就可以查阅tag的使用了。
java领域MVC框架
- 主要实现控制器(StrutsPrepareAndExecuteFilter + Action )
- 提供大量的标签库,可以简化view的开发
Struts2标签分类
- UI标签
用于生成HTML元素的标签
- 非UI标签
用于数据访问,逻辑控制等
- Ajax标签
所有的标签都在struts-tags里面
OGNL
Object Graph Navigation Language,对象图表达式语言
- EL
1、表达式语言,做数据访问语言,并不是编程语言,所以很简单
2、提供了11个内置对象。 pageContext,pageScope,requestScope,sessionScope,applicationScope,param,paramValues,header,headerValues,cookie,initParam(获取Web应用的配置参数)
- OGNL
1、既然要访问数据,必须有个东西装数据,OGNL的装数据的东西(一个容器)“Stack Context(ONGL Context)”
2、上述Stack Context中的每一个对象,都应该有一个名字。
访问:#对象名
例:OGNL Context中有3个对象,foo,bar,test
#bar.abc —-访问bar对象的getAbc()方法的返回值
#test.xyz.abc —-访问test对象的getXyz().getAbc()
3、OGNL Context
有一个根对象(root),访问root对象的属性时可以省略对象名
例:OGNL Context中有3个对象,foo(root对象),bar,test
abc.xyz.def —-访问foo.getAbc().getXyz().getDef()
4、OGNL Context 中的内容application,session,value stack(root),request,parameters(搜索请求参数),attr(searches page,request,session,then application scope)
例:
<s:property value="#session.mySessionPropKey" />
<s:property value="#session[‘mySessionPropKey‘]" />
<s:property value="#request.myRequestPropKey">
5、OGNL可以直接创建List对象
例:
{ele1,ele2,….}
6、OGNL可以直接创建Map对象
例:
#{key1:value1,key2:value2,….}
7、OGNL可以直接获取子集合
例:
person.cats.{? #this.age > 2}
—–获取person所养的猫中age大于2的所有猫的集合
person.cats.{^ #this.age > 2}
—–获取person所养的猫中age大于2的第一个猫
person.cats.{$ #this.age > 2}
—–获取person所养的猫中age大于2的最后一个猫
8、OGNL支持访问直接调用静态方法
注意:使用这个功能需要开启常量,struts.ognl.allowStaticMethodAccess设置为true(默认为false)
使用方式:
- 类名@静态Field
- 类名@静态方法(参数值)
注意:struts2会帮助我们将对象放入相应的容器中(上述的范围)
控制标签(Control Tag)
- if
<s:if test=""></s:if>
- else
<s:else test=""></s:else>
- elseif
<s:elseif test=""></s:elseif>
- append
合并两个或两个以上的集合(与merge功能类似)
- generator
按照某种规则,把一个字符串分解成一个集合
- iterator
迭代元素
- merge
合并集合
- sort
必须指定一个比较器
- subset
截取一个子集合
if\elseif\else
- 属性:test
注意:else没有属性
- 实例
<s:if test="#age>60"><h3>老年人</h3></s:if>
<s:elseif test="#age>30"><h3>中年人</h3></s:elseif>
<s:elseif test="#age>18"><h3>青年人</h3></s:elseif>
<s:elseif test="#age>8"><h3>少年人</h3></s:elseif>
<s:else>儿童</s:else>
iterator
- 属性:var,value,status,begin,end
- 实例
1、迭代所有元素
<h2>Iterator标签 测试</h2>
<ul>
<s:iterator var="it" value=‘{"zhang","wang","tian","li"}‘>
<li>
${it}
<s:property value="#it"/>
</li>
</s:iterator>
</ul>
<!-- 经过debug发现iterator变量it放在了Stack Context中 -->
<s:debug/>
2、迭代指定部分
获取第四,第五,第六个元素<br/>
<ul>
<s:iterator var="it" value=‘{"zhang","wang","tian","li","zhao","qian","sun","zhou"}‘ begin="3" end="5">
<li>
${it}
<s:property value="#it"/>
</li>
</s:iterator>
</ul>
3、使用status
- getCount()
- getIndex()
- isFirst()
- isLast()
- isOdd() —-奇数行
- isEven()
打印奇数元素<br/>
<ul>
<s:iterator var="it" value=‘{"zhang","wang","tian","li","zhao","qian","sun","zhou"}‘ status="st">
<s:if test="#st.odd">
<li>
<s:property value="#it"/>
</li>
</s:if>
</s:iterator>
</ul>
4、迭代Map
<table width="300" border="1">
<s:iterator value="#{‘java‘:99,‘C++‘:90,‘C‘:65,‘Python‘:87,‘Ruby‘:89}" var="entry">
<tr>
<td>
${entry.key}
</td>
<td>
${entry.value}
</td>
</tr>
</s:iterator>
</table>
merge和append
- merge
属性:var
<s:merge var="newList"><s:param value=""/>...</s:merge>
- append
属性:var
<s:append var="newList"><s:param value=""/>...</s:append>
- 实例
<!-- 定义两个集合list1和list2 -->
<s:set var="list1" value=‘{"zhao","qian","sun","li"}‘/>
<s:set var="list2" value=‘{"zhou","wu","zheng","wang"}‘/>
list1:<s:property value="#list1"/><br/>
list2:<s:property value="#list2"/><br/>
使用append合并list1和list2之后<br/>
<s:append var="append">
<s:param value="#list1"/>
<s:param value="#list2"/>
</s:append>
<s:iterator var="it" value="#append">
${it},
</s:iterator>
<br/>
<h3>append只是单纯的将list2接到list1之后重新组成一个集合</h3>
使用append合并list1和list2之后<br/>
<s:merge var="merge">
<s:param value="#list1"/>
<s:param value="#list2"/>
</s:merge>
<s:iterator var="it" value="#merge">
${it},
</s:iterator>
<br/>
<h3>merge从list1和list2依次取一个元素添加到新集合了,这样也就打乱了原有的顺序</h3>
generator
- 属性:var,val,separator
注意:是val,不是value。
应用:读取到一个字符串之后,可以使用这个代替split方法达到分割的目的
- 实例
<!--注意:在val的取值中,外层是双引号,内层是一个单引号,如果缺少,输出有问题-->
<s:generator var="newList" val="‘abc:xys:sdfs:df‘" separator=":"/>
<ul>
<s:iterator var="it" value="#newList">
<li>
<s:property value="#it"/>
</li>
</s:iterator>
</ul>
subset
- 属性:var,source,start,count
注意:var被放到了page Context中,因此用Iterator访问时要使用#attr.varname
- 实例
<s:subset var="newList" source=‘{"as","dasg","ew","ew"}‘ start="2" count="2"/>
<ul>
<!--使用#attr.newList访问-->
<s:iterator var="it" value="#attr.newList">
<li>
<s:property value="#it"/>
</li>
</s:iterator>
</ul>
sort
- 属性:var,source,comparator
注意:必须指定比较器comparator,所以需要和bean标签一起使用,var的存储位置是page Context,因此必须使用#attr.varName访问
- 实例
<!-- 创建比较器对象 -->
<s:bean var="comparator" name="org.struts2.util.MyComparator"/>
<!-- 定义一个列表 -->
<s:set var="list" value="{‘java‘,‘c++‘,‘ruby‘,‘python‘,‘vb‘,‘c#‘}" />
排序之前:<s:property value="#list"/>
<s:sort var="nl" source="#list" comparator="#comparator"/>
<br/>
排序之后:<s:property value="#attr.nl"/>
<s:iterator var="it" value="#attr.nl">
<s:property value="#it"/>
</s:iterator>