祝好

研磨Struts2 之 第十一章 标签库【私塾在线原创】

 视频配套PPT,视频地址【 研磨Struts2视频课程
Struts2自带了一套非常强大的标签库,不仅自身功能强大,而且与Struts2中的其它部分无缝结合。
Struts2提供了如下四种标签:
(1)数据标签:处理从值栈中提取数据和将数据设置到值栈中
(2)控制流标签:用来控制程序的执行流
(3)UI标签:显示UI界面
(4)杂项标签:包含诸如生成URL和输出国际化文本等
(1)property标签
1 :功能
用来输出OGNL表达式的值。
2 :属性
value:用来获取值的OGNL表达式,如果value属性值没有指定,那么将会被设定为top,也就是返回位于值栈最顶端的对象。
default:如果按照value属性指定的OGNL求值后返回的是空值,但是你仍然希望输出某些内容,那么就可以使用default属性来指定这些内容
escape:是否转义HTML,默认为true
escapeJavaScript:是否转义JavaScript,默认为false
(2)set标签
1 :功能
对设置的表达式进行求值,并将结果赋给特定作用域中的某个变量。简单点说,set标签类似于定义一个变量,并赋值。
set标签有很多应用的地方,比如一个对象在OGNL上的访问层次较深,就可以使用set标签给它定义成一个变量,这样就可以保证在多次引用它的时候更方便。
2 :属性
var:变量名,可以在OGNL表达式中使用这个名称来引用存放到值栈的这个对象。
scope:变量的生存周期,可以选择application、session、request、page或action,默认为action。
value:设置给变量的值,可以是常量,也可以是OGNL表达式
3  示例

java代码:
<s:set var="tempUser" value="#session.user"/>
<s:property value="#tempUser.name"/>
<s:property value="#tempUser.age"/>
(3)push标签
1 :功能
用来将对象的引用压入值栈中。
这也是很有用的,比如:如果一个对象访问层次过深的时候,可以用push标签来做访问的简化。其做法和set标签不同,push标签是把指定的对象放到值栈的栈顶,这样在访问这个对象的时候,就可以直接访问它了。
2 :属性
value:用来指定放到值栈栈顶的对象。
3 :示例

java代码:
<s:push value="#session.user">
<s:property value="name"/>
<s:property value="age"/>
</s:push>
(4) bean  param 标签
1 :功能
bean 标签的功能:
用来创建JavaBean实例,并将其压入值栈中,可以添加param标签。
param 标签的功能:
用来为其它标签添加参数化设置的功能,比如为bean标签初始化JavaBean的属性的值。但是请注意一点:param标签主要用来配合其它标签来指定参数,并不是只能与bean标签连用。
2 :属性:
bean 标签的主要属性:
name:指定了要创建的JavaBean的全类名,必须要设置
var:引用这个JavaBean实例的名称,在bean标签创建JavaBean实例之后,将这个实例压入值栈中,其key值就是这个var指定的值。
param 标签的主要属性:
name:参数的名称
value:参数的值
3 :示例

java代码:
<s:bean name="cn.javass.user.UserModel" var="user">
<s:param name="age" value="100"/>
</s:bean>
<s:property value="#user.age"/>
(5) date 标签
1 :功能
用来格式化输出一个日期数据。
2 :属性
nformat:用于指定日期显示的格式,形如:yyyy-MM-dd。如果不指定的话,将会去找国际化信息中key为struts.date.format的指定值。
nname:被格式化的值,必须设置,它本身是一个OGNL表达式。
3 :示例

java代码:
<%@page import="java.util.Date" %>
<%@page import="java.sql.Timestamp" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
Timestamp t = Timestamp.valueOf("2010-09-22 00:00:00");
Date d = new Date(t.getTime());
request.setAttribute("d",d);
%>
日期为:<s:date name="#request.d" format="yyyy-MM-dd"/>
(6) debug 标签
1 :功能
debug标签可以帮助程序员进行调试,它在页面上生成一个链接,点击这个链接我们就可以查看ActionContext和值栈中所有能访问的值。
2: 示例
在页面上非常简单,只需要把debug标签放上去就可以
<s:debug/>
(7)url标签与a标签
1  功能
    url 标签的功能:
    url标签用来生成一个url,但是它不显示在页面上,需要其他的标签引用它,比如a标签。url标签可以包含param标签,通过param标签来设置url要传递的参数。
    a 标签的功能:
    用来生成HTML的<a>标签,可以通过url标签来设置它的url,也可以使用param标签来设置a标签的url所需要的参数。
2 :属性:
url标签的属性很多,主要的属性有:
namespace:要访问的Action所在的包的命名空间。
action:要访问的Action的名字。
method:访问execute方法以外的其他方法。
id:被放入值栈的名字,其他标签可以通过这个值来访问这个url标签所生成的url。如果指定这个属性,则url标签不会在页面上生成字符串。
includeContext:生成的URL中是否包含当前上下文。
a 标签的属性也非常多,主要是与 HTML 对应,主要的属性有:
href:超链接的URL
a标签与url及其类似,a标签拥有url标签的所有属性,它们之间的不同在于a标签用来直接生成一个链接,而url标签是用来生成一个字符串。a标签比url标签还多出来一些属性,比如onchange,这些属性都是用来生成对应的HTML的事件的。
3 :示例

java代码:
<s:url action="ognlAction" namespace="/helloworld">
<s:param name="uuid" value="'01'"/>
</s:url>
<s:url action="ognlAction" namespace="/helloworld" id="test">
<s:param name="uuid" value="'01'"/>
</s:url>
<s:url action="ognlAction" namespace="/helloworld" id="test">
<s:param name="uuid" value="'01'"/>
</s:url>
<s:a href="%{test}">超链接</s:a>
<s:a action="ognlAction" namespace="/helloworld">
<s:param name="uuid" value="'01'"/>
超链接
</s:a>
(8) include 标签与 param 标签
1  include 标签的功能
include标签的作用是把其它页面包含到当前的页面上。include标签类似于jsp的include标准动作,也是一种动态引入,在运行期间动态引入被引入页面所生成的HTML,引入页面和被引入页面完全是独立的页面运行,所以不能共享变量。
2 :属性
include标签的主要属性:
value :用来指定其他可以被引用的URL的名字,必须要设置。
3 :示例

java代码:
<s:include value="include.jsp" >
<s:param name="uuid" value="'01'" />
</s:include>
(1) if  elseif  else 标签
1:功能
if标签的功能:
类似于Java程序中的if,用来表达分支判断。
else标签的功能:
类似于Java程序中的else。
elseif标签的功能:
类似于Java程序中的else if。
2:属性
if标签和elseif标签都只有一个test属性,它本身是一个OGNL表达式,运算结果为一个boolean值,表示是否符合条件,必须设置。
else标签没有属性。
(2) iterator 标签
1 :功能:
iterator标签用来处理循环,可以用它遍历数组、Set和List等集合对象。这个标签还支持在ActionContext中保持一个保存遍历状态的对象,通过这个变量可以得到当前循环的各种信息。
iterator标签在遍历一组对象的时候,它把正在循环的对象放在值栈的栈顶,所以可以直接引用这个对象的方法或属性,后面给出示例。
2 :属性:
value:用来指明到底循环的是谁,这个属性的值是OGNL表达式,用来访问ActionContext和值栈中需要被循环的对象。
status:这个属性在ActionContext中保存一个对象,用来返回当前循环的各种信息,可以返回的信息有:
count:集合含有多少个对象。
index:正在循环的这一项的索引。
even:当前遍历到的对象是不是处于列表的偶数索引位置。
odd:当前遍历到的对象是不是处于列表的奇数索引位置。
first:正在循环的是不是第一个。
last:正在循环的是不是最后一个。
nbegin、end、step:指明了如果使用索引来进行循环时的开始、结束和步长。
var:变量名称,用来引用存放到值栈的被循环的对象。
(3) append 标签与 param 标签
1 :功能
append标签用于把几个已经存在的集合组合成一个大集合,param标签跟它连用,用来指定组合哪些集合。
2 :属性
nvar:用来指定把组合后的大集合放到值栈里的变量名称。
3 :示例

java代码:
<s:set value="{1,2,3}" var="list1"/>
<s:set value="{4,5,6}" var="list2"/>
<s:append var="list3">
<s:param value="#list1"/>
<s:param value="#list2"/>
</s:append>
<s:iterator value="#list3">
<s:property/>
</s:iterator>
(4) generator 标签
1:功能
generator标签用来切分字符串,并把切分的结果组成一个集合。
2:属性
val:指定被切分的字符串,必须指定。
separator:指定切分字符串用的分隔符,必须指定。比如要用“,”来切分字符串“a,b,c,d”,最终的结果为包含a、b、c、d四个字符串的集合。
count:返回集合的最大长度。
var:指定变量名称,用来访问放到值栈中的集合。
3:示例1

java代码:
<s:generator separator="," val="'a,b,c,d'" var="myList"/>
<s:iterator value="#myList">
<s:property/>
</s:iterator>
4:示例2

java代码:
<s:generator separator="," val="'a,b,c,d'" var="myList">
<s:iterator>
<s:property/>
</s:iterator>
</s:generator>
(5) merge 标签
1 :功能
merge标签用来把几个已经存在的集合组合成一个大集合,与append标签的作用类似,只是原来集合中出现的各个元素出现在大集合中的顺序不同。
2 :属性
nmerge标签的主要属性:
var:用来指定把组合后的大集合放到值栈里的变量名称。
3 :示例
<s:set value="{1,2,3}" var="list1"/>
<s:set value="{4,5,6}" var="list2"/>
<s:merge var="list3">
<s:param value="#list1"/>
<s:param value="#list2"/>
</s:merge>
<s:iterator value="#list3">
<s:property/>
</s:iterator>
(6) sort 标签
1 :功能
利用设置的比较器,来对指定的集合进行排序。
2 :属性
comparator:用来指定对集合排序使用的比较器的实例
source:需要排序的集合
var:变量名称,把集合排序后的结果存放到page context中的key值
3 :示例

java代码:
<s:set value="{4,5,3}" var="list1"/>
<s:bean id="myComparator" name="cn.javass.tag.MyComparator" />
<s:sort comparator="#myComparator" source="#list1">
     <s:iterator>
     <s:property/>
     </s:iterator>
</s:sort>
(7) subset 标签
1 :功能
用于获取指定集合的子集合。
2 :属性
nsubset标签的主要属性:
ncount:用于指定子集中元素的个数。
ndecider:用于指定实现过滤条件的对象,这个对象会按照过滤条件一一检测源集合中的元素是否应该被放到子集合中,指定过滤条件的类需要实现org.apache.struts2.util.SubsetIteratorFilter.Decider接口。
nvar:变量名称,就是将子集合保存在当前页的上下文pageContext中所指定的key值,以后可以通过这个key值来访问。
nsource:用于指定源集合。
nstart:用于指定从源集合的第几个元素开始截取,注意:0代表第一个元素。
3 :示例 1

java代码:
<s:set var="list" value="{1,2,3,4,5}"></s:set>
<s:subset source="#list" count="2" start="2">
   <s:iterator>
     <s:property />
   </s:iterator>
</s:subset>
4 :示例 2

java代码:
public class StringLengthDecider implements Decider{
public boolean decide(Object item) throws Exception {
String value = item.toString();
if (value.length()==1){
return true;
}
return false;
}
}
<s:bean name="cn.javass.tag.StringLengthDecider" var="decider1"/>
<s:set var="list" value="{'1','2','33','4','55','6'}"></s:set>
 
<s:subset source="#list" start="1" count="2" decider="#decider1">
   <s:iterator>
     <s:property />
   </s:iterator>
</s:subset>
Struts2的UI标签库非常的强大,而且功能更友好,除了显示UI页面外,还包括
了布局管理,错误处理,风格处理等,并能够完美的和struts2的其他特性相结合。
但同时也带来一些问题,比如布局,struts2现在是默认的一行一个标签的方式来进
行布局,会自动加上<tr>,如果想要一行显示多个字段的话,需要自行修改模板,
或是提供新的模板,或是使用simple的模板,但是使用simple的模板,错误显示部
分也就没有了,比较让人郁闷。
 
几个基本概念:
(1)template:就是一个使用Velocity、Jsp或者FreeMarker编写的文件,用来生成Html标记
(2)theme:就是一套组合在一起的模板
(3)tag:就是标签,用来读取属性,并利用属性值输出模板
目前Struts2默认提供四套theme:xhtml、css_xhtml、ajax和simple,要想切换他们,在struts.properties文件里面设置:struts.ui.theme=xhtml,默认就是xhtml的。
 
说明:
    simple:不带布局、Label和字段的错误信息
    xhtml:html +布局、Label和字段的错误信息
css_xhtml: html +Label和字段的错误信息+css,注意:这个css是通过给每一个html组件加上div来进行控制的,也是比较别扭的。
ajax:继承自xhtml,提供ajax的支持。
name 属性和 value 属性
表单标签的name属性和value属性基本等同于HTML组件的name和value,但是也有一些不一样的地方:表单标签在生成HTML的时候,如果标签没有设置value属性的话,就会从值栈中按照name获取相应的值,把这个值设置成生成的HTML组件的value。
简单点说表单标签的value在生成HTML的时候会自动设置值,值从值栈中获取。
通用属性
n与css相关的属性:
cssClass:指定生成的HTML组件的class属性。
cssStyle:指定生成的HTML组件的style属性,使用内联的css属性。
与触发事件相关的属性:
onblur:指定生成的HTML组件失去焦点时触发的事件。
onchange:指定生成的HTML组件内容改变时触发的事件。
与悬浮提示相关的属性:
jsTooltipEnabled:是否允许用javascript来生成悬浮提示。
tootip:悬浮提示的内容。
与模板和主题相关的属性:
template:指定使用的模板。
theme:指定使用的主题。
form 标签
设置HTML的form标签的action属性时,如果在同一个服务器上,那么要从web上下文开始指定,比如:
<form action="/helloworld/ognlAction.action" method="post">
上面示例的action的值中,开头的“/helloworld”就是web上下文。
而Struts2的form标签在设置action属性的时候,因为使用Struts2的form标签的应用,只能提交给本应用,也就是说,只需要从自己的web应用开始就可以了,不需要再指定web上下文了,示例如下:
<s:form action="/ognlAction.action" method="post">
如果确定页面是要提交到某个Action中,Struts2还提供了其他的写法,可以直接用namespace属性来指定Action所在的命名空间,这样action属性只需要指定Action名称即可,示例如下:
<s:form action="sampleAction" namespace="/testNameSpace">
文本域型标签
单行文本框是表单域中最常见的了,textfield标签对应着HTML的<input type=”text”>,用于生成单行文本。
除了上面列出的各种常见通用属性,textfield标签还有几个其它的属性:
maxlength:单行文本框中所能容纳的最大文本长度。
size:单行文本框自身的长度。
readonly:单行文本框是否只读。
 
单行文本框本身并不难,但是我们要在这里好好体会一下 name value 的联系。
其他文本域型标签
多行文本框textarea
密码框password
隐藏域hidden
选择型标签
下拉框 select
1 :功能
Struts2的select标签用来生成一个下拉框,用户可以选择其中的一个,当然,像HTML的<select>标签一样,通过设置multiple属性,也可以让用户同时选择其中的多个选项。
2 :属性
nlist:用于生成下拉框的集合。
nlistKey:生成的选项的value属性。
nlistValue:生成的选项显示的文字。
nheaderKey:在所有的选项前再加额外的一个选项作为其标题的value属性。
nheaderValue:在所有的选项前再加额外的一个选项作为其标题的显示文字。
nemptyOption:是否在标题和真实的选项之间加一个空选项。
nmultiple:用户是否可以同时选择多项。
nsize:下拉框的高度,即最多可以同时显示多少个选项。
3 :示例

java代码:
<s:bean name="cn.javass.tag.vo.UserModel" var="um">
<s:param name="userId">user1</s:param>
<s:param name="name">第一个用户</s:param>
</s:bean>
<s:bean name="cn.javass.tag.vo.UserModel" var="um2">
<s:param name="userId">user2</s:param>
<s:param name="name">第二个用户</s:param>
</s:bean>
<s:set value="{#um,#um2}" var="list"/>
<s:select name="select1" list="#list" listKey="userId" listValue="name"
headerKey="" headerValue="请选择用户"
multiple="true" size="5"/>
其他选择型标签
单选框组radio
复选框组checkboxlist
复杂操作标签
combobox标签
1 :功能
Struts2的combobox标签用于生成一个文本框和一个下拉框,下拉框出现在文本框的下面,在最终提交的时候只提交文本框的输入值,下拉框用于在其选项改变时,也就是onchange事件被触发时,把自身的被选中项的值赋到文本框上。
2 :属性
来自文本框的属性:
maxlength:单行文本框中所能容纳的最大文本长度。
size:单行文本框自身的长度。
readonly:单行文本框是否只读。
来自下拉框的属性:
list:用于生成下拉框的集合。
listKey:生成的选项的value属性。
listValue:生成的选项显示的文字。
3 :示例

java代码:
<s:form action="/ognlAction.action" method="post">
<s:bean name="cn.javass.tag.vo.UserModel" var="um1">
<s:param name="userId">user1</s:param>
<s:param name="name">第一个用户</s:param>
</s:bean>
<s:bean name="cn.javass.tag.vo.UserModel" var="um2">
<s:param name="userId">user2</s:param>
<s:param name="name">第二个用户</s:param>
</s:bean>
<s:set value="{#um1,#um2}" var="list"/>
<s:combobox name="test" list="#list" listKey="userId" listValue="name"/>
</s:form>
要注意一点,combox的标签必须包含在Struts2的form标签或者是HTML的form标签内使用。
 
 视频配套PPT,视频地址【 研磨Struts2视频课程
 

posted on 2012-03-02 12:55  祝好  阅读(208)  评论(0)    收藏  举报

导航