- OGNL
- Struts2标签分类
- 控制标签
一、OGNL
Object-Graph Navigation Language的缩写,是一种功能强大的表达式语言,通过其简单一致的表达式语法,可以存取对象的任意属性值,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。
Struts2的默认表达式语言是OGNL
1.1、OGNL特点
- 支持对象方法的调用
objName.methodName() 支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名|值名],例如:
@java.lang.String@format(‘foo%s’,’bar’)@tutorial.MyConstant@APP_NAME;支持赋值操作和表达式串联
price=100,discount=0.8,calculatePrice(),返回80- 访问OGNL上下文(OGNL Context)和ActionContext
- 操作集合对象
1.2、OGNL原理
- OGNL是一个对象,属性的查询语言。在OGNL中有一个类型为Map的Context(上下文),在这个上下文中有个跟元素(root),对跟元素的属性的访问可以直接使用属性名字,但是对于其他非根元素属性的访问必须加上特殊符号#
- 在Struts2种上下文为ActionContext,根元素位于Value Stack(值堆栈,值堆栈代表了一族对象而不是一个对象,其中Action类的实例也属于值堆栈的一个)。ActionContext中的内容如下:
因为Action实例被放在ValueStack中,而ValueStack又是根元素(root)中的一个,所以对Action中的属性的访问可以不使用标记#,而对其他的访问都必须使用#标记。
1.3、% # $ 三个符号的使用
- #主要有三个用途
- 访问非根对象(Struts中值栈为根对象)如OGNL上下文和Action上下文,#相当于ActionContext.getContext();
- OGNL构造Collection(List,map,set)
- 用于过滤和投影(projecting)集合
Struts2中,OGNL表达式需要配合Struts标签才可以使用。
如<s:property value=“name"/>
几个ActionContext中的属性
1.3.1、#访问属性
- 引用Action属性
<s:property value="postalCode"/>
- ActionContext中的其他非根(root)元素的属性可以按照以下方式访问:
<s:property value="#session.mySessionPropKey"/>or
<s:property value="#session["mySessionPorKey"]/>or
<s:property value="#request["mySessionProKey"]/>
1.3.2、OGNL创建集合
- 生成List的语法:{e1,e2,e3}
<s:select label="label"name="name" list="{'name1','name2',name3'}"value="%{'name2'}"/>
上面的代码生成了一个HTMLSelect对象,可选的内容为:name1,name2,name3,默认值为name2
- 生成Map的语法为:#{key1:value,key2:value2}
<s:select label="label"name="name" list="#{'foo':'foovalue','bar':'barvalue'}"/>
上面的代码生成了一个HTMLSelect 对象foo名字表示的内容为:
foovalue,bar名字表示的内容是:barvalue`
1.3.3、OGNL过滤与投影集合
- 集合的投影(过滤)有三种方式
a. “?#”:投影(过滤)所有符合条件的集合
b. “^#”:投影(过滤)第一个符合条件的元素
c. “$#”:投影(过滤)最后一个符合条件的元素
- this表示集合中的元素
- 投影(过滤)操作返回的是一个集合,可以使用索引取得集合中指定的元素。如:user.{?#this.age>19{{0}
- 投影(过滤)所有符合条件的集合
- <s:property value="users.{?#this.age>19}"/>
- 投影(过滤)所有符合条件的集合中指定的元素
- <s:property value="users.{?#this.age>19}{0}/>
- 投影(过滤)第一个符合条件的元素
- <s:property value="users.{^#this.age>19}"/>
- 投影(过滤最后一个符合条件的元素
- <s:property vlaue="users.{$#this.age>19}"/>
1.3.4、%用途
- %符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式:
<s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/>
<s:property value="#myMap['key1']"/>
<s:url value="myMap['key1']"/>
上面的代码第二行会在页面输出”value1“ 而第三行则会输出”#myMap[‘key’]字符串,如果修改为:
<s:url value="%{#myMap['key']}"/>
则输出为 value1
1.3.5、$有两种用途
-在国际化资源文件中,引用OGNL表达式
-在Struts2配置文件中,引用OGNL表达式
<action name=“savaUser” class="userAction" method="save">
<resutl type="redirect">listUser.action?msg=${msg}</result>
</action>
二、Struts标签分类
2.1、控制标签
- if
- elseif
- else
- iterator
- append
- merge
- generator
- subset
- sort
2.2、条件标签 if…elseif…else
- 主要属性:
- test:测试条件
- 示例:
<%! Random rnd = new Random();%>
<% int n=rnd.nextInt(200);
pageContext.setAttribute("n",n);
%>
<s:if test="#attr.n%7===0">hello
</s:if>
<s:elseif test="#attr.n%5==0">
hello world
</s:elseif>
<s:else>
hello java
</s:select>
2.3、迭代标签iterator
- 用于循环数组,集合或Map
属性
- value:数组,集合或map
- var:当前元素
- status:当前元素的状态
- index,count,even,odd,first,last
遍历list
<s:iterator value="{'china','usa','uae'}"var="cur"status="st">
<s:property value="#st.count"/>
<s:property value="#cur"/>
</s:iterator>
- 遍历map
<s:iterator value="#{1,'chian',2,'usa',3'japan'}" var="cur">
<s:property value="#cur.key"/>
<s:property value="cur.value"/>
</s:iterator>
2.4、 集合合并标签append和merge
- 将多个集合合并成一个集合
- 属性
- var新集合的名称
-示例
- var新集合的名称
<s:append var="newCollection">
<s:param value="{'china','usa','japan'}"></s:param>
<s:param value="{'german','tailand',sinapo'}"></s:param>
</s:append>
<s:iterator vlaue="#newCollection" var="cur">
<s:property value="#cur"/>
</s:iterator>
- merge用法和append相同,结果的组织不一样
2.5、 字符串分割标签generator
将一个字符串按照制定分隔符分割成一个字符串数组
- 属性
- separator:分隔符
- val(value):字符串
- count:字符串数组中元素个数
- 示例
<s:generator separator="," val="'chi,na'" var="arr"/>
<s:iterator value="#arr" var="cur"/>
<s:property value="#cur"/>
</s:iterator>
2.6、集合子集标签 subset
从集合中取出一个子集(子集被放在值栈的顶部,subset标签执行完后子集自动移除)
- 属性
- source:集合
- start:开始索引
- count:子集中元素个数
- 示例
<s:subset source="{'china','usa','eur'}" start="1" count="2">
<s:iterator var="cur">
<s:property value="#cur"/>
</s:iterator>
</s:subset>
2.7、 排序标签sort
- 根据定义的排序规则,对集合中的元素进行排序,排序后生成的新的集合放在值栈顶部,标签结束后自动删除
- 属性
- comparator:实现comparator的类
- source:集合
- 示例
<s:bean name="com.apache.sorted.lengthSorted" var="ls"/>
<s:sort comparator ="#ls" source="{'1','88','77',''666'}">
<s:iterator>
<s:property/>
</s:iterator>
</s:sort>
2.8、数据标签
- set
- push
- bean
- date
- debug
- include
- url
- param
- property
2.9、 设置变量标签set
- 用于设置一个新变量,并将变量放入指定的作用域中
- 属性
- var:新变量的引用
- value:值
- 示例
<s:set var="v1" value="'china'" scope="page"></s:set>
<s:property value="#attr.v1"/>
- 注意:如果不指定,默认放在StactContext中
2.10、栈顶置值标签push
- 将某个值至于值栈的顶部,标签结束后,将从值栈中移除
- 属性
- value:值
- 示例
<s:push value="'china'">
<s:property/>
</s:push>
2.11、 java bean创建标签bean
- 用于创建java bean的实例,如果设置了var值,则存于Stack Context,否则,标签结束后自动移除
- 属性
- name:javabean类名(带包)
- var:名称
- 示例
<s:bean name="com.apache.entity.Student" var="stu">
<s:param name="sid">1</s:param>
<s:param name="sname">zhang</s:param>
<s:param name="sbirthday">2009-09-10</s:param>
</s:bean>
<s:property value="#stu.sbirthday"/>
2.12、日期格式化标签 date
- 格式化日期并输出
- 属性
- name:日期
- format:格式化字符串
- 示例
<% pageContext.setAttribute("d",new Date());%>
<s:date name="#attr.d"format="yyyyMMddHHmmss"/>
2.13、 资源包含标签include
用于将一个html,jsp或servlet包含到当前页面中,使用param传递参数
- 属性
- value:包含页面名称
- 示例<S:include value="my.html"></s:include>
2.14、URL生成标签 url
生成url地址,可以通过param标签传递请求参数,如果参数为中文,自动编码
- 属性
- value:url值
- action:action名称,自动加上.aciton
- 示例
<s:url value="con.jsp" var="url">
<s:param name="id">china</s:param>
</s:url>
<a href="<s:property value="#url"/>xxx.jsp</a>
<s:url action="test" var="url2"></s:url>
<s:property value="#url2"/>
2.15、 数据标出标签 property
用于输出值栈,StactContext中的数据
- 属性
- value:要输出的值
- 如果输出值栈中的值,不用#
- 如果 输出StackContext中的值,要用#
- 如果省略value,表示取出值栈的栈顶对象输出
2.16、表单标签
- textfield
- password
- textarea
- select
- radio
- checkboxlist
- combobox
- datetimepicker
2.17、 UI标签分类
- 输入标签
textfield password textarea - 选择标签
radio checkbox checkboxlist select file - 输入选择标签
datetimepicker combox - 其他标签
form hide submit reset
2.18、输入标签
textfield password textarea
- 作用
- textfield:文本框
- password:密码框
- textarea:文本区
- 共同特征
- 向服务器传送一个值
- 共同属性
- name:名称,被服务器识别
- label:标题
- labelposition:标题位置
- value:值
2.19、 选择标签
radio checkboxlist select
- 作用
- radio:单选按钮
- checkboxlist:复选框组
- select:下拉列表框
- 共同属性
- name,value,label,labelpositon同上
- list:提供选项数据,可以是list,map,等集合,集合元素可以是javabean对象
- listkey:指定一个属性作为实际值
- listValue:指定一个属性作为显示值
-
-注意:如果有多个值传送到服务器,使用数组或list接收
2.20、选择标签checkbox,file
checkbox:表示是否之意,服务器用boolean类型接收
属性:label,value,name
file:文件选择
属性:label,value,name
2.21、 输入选择标签 datetimepicker
日期控件,用于输入和选择日期
注意:位于/struts-dojo-tags 标签库
导入<%@ taglib prefix=”ds” uri=”/struts-dojo-tags”%>
必须加入
显示月份”十一月”,“十二月”,“时”,“分”时有乱码,暂无解决方案
属性:
name
value:设成%{‘today’}默认为当前日期或时间
displayFormat:日期格式
type:如果为date表示日期,为time表示时间
2.22、输入选择标签combobox
文本框和下拉列表框的组合
文本框总是显示下拉列表框的当前选择值
属性:同select
2.23、 UI标签示例
三、总结
- OGNL是标签的基础,Struts2中,OGNL必须和标签紧密配合
- 控制标签包含一组条件判断标签和一组集合便利和操作标签
- 数据标签包含一组数据访问相关的标签