学习:Struts2框架学习笔记_OGNL与标签库

  • 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新集合的名称
      -示例
<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必须和标签紧密配合
  • 控制标签包含一组条件判断标签和一组集合便利和操作标签
  • 数据标签包含一组数据访问相关的标签

猜你喜欢

转载自blog.csdn.net/qq_35206244/article/details/81279217