Struts 2的标签库(1)——标签库基础

来源:互联网 发布:java邮箱正则表达式 编辑:程序博客网 时间:2024/05/02 02:17

1.         为什么要使用标签?

当JSP页面嵌入大量的Java脚本时,整个页面的可读性下降,从而可读性也随之下降。

使用自定义标签的优势:简单;有利于团队协作;可读性高。

导入struts 2标签库:<%@taglib prefix=”s” uri=”/struts-tags”%>>

2.         Struts 2把所有的标签都定义在URI为“/struts-tags”的空间下,但是我们依然可以将Struts 2的标签简单的分为以下的3类:

1)        UI标签,即用户界面标签,主要用来生成HTML元素的标签

2)        非UI标签,主要用来数据访问、逻辑控制等标签

3)        Ajax标签

3.         Struts 2的OGNL表达式支持

OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。OGNL是通常要结合Struts 2的标志一起使用。主要是#、%和$这三个符号的使用。

l         “#”主要有三种用途:

  ①访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();

  parameters 包含当前HTTP请求参数的Map #parameters.id[0]作用相当于request.getParameter("id")

  request 包含当前HttpServletRequest的属性(attribute)的Map #request.userName相当于request.getAttribute("userName")

  session 包含当前HttpSession的属性(attribute)的Map #session.userName相当于session.getAttribute("userName")

  application 包含当前应用的ServletContext的属性(attribute)的Map #application.userName相当于application.getAttribute("userName")

  attr 用于按request > session > application顺序访问其属性(attribute) #attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止

  ②用于过滤和投影(projecting)集合,如books.{?#this.price<100};

  ③构造Map,语法结构#{key1:value1,key2:value2,……}。如#{'foo1':'bar1', 'foo2':'bar2'}。

l         “%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。

l         “$”有两个主要的用途,用于在国际化资源文件中,引用OGNL表达式。

 

1)OGNL提供了两个元素符:in 和 out in,俩判断某个元素是否在指定的集合中。

如:

<s:if test=”’foo’ in {‘foo’,’bar’}”>包含</s:if><s:else>不包含</s:else><s:if test=”’foo’ not in {‘foo’,’bar’}”>不包含</s:if><s:else>包含</s:else>

2)除此之外,OGNL还允许通过某个规则取得集合的子集。有如下三个操作符:

①?   :取出所有符合选择逻辑的元素

②^    :取出所有选择逻辑的第一个元素

③$    :取出符合选择逻辑的最后一个元素

person.relatives.{? #this.gender == 'male'}

表示:取出person的所有性别为male的relatives集合。
3)OGNL访问静态成员

Struts 2默认是关闭访问静态方法的,只允许通过OGNL表达式来访问静态的Field。为了让OGNL能访问静态成员,应该在struts.xml中进行相应的设置:

<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>

一旦设置了,OGNL表达式就可以通过如下的语法来访问静态成员:

@className@staticField

@className@staticMethod(val...)

<body>访问系统环境变量:<s:property value="@java.lang.System@getenv('JAVA_HOME')"/> <br />圆周率的值:<s:property value="@java.lang.Math@PI"/></body>


4)Lambda(λ)表达式

可以允许在OGNL中使用简单的函数,如:菲波拉契数列

if n==0 retrun 0;

else if n==1 return 1;

else return fib(n-2)+fib(n-1)

求fib(11)

<s:property value="#fib =:[#this==0 ? 0:#this==1 ? 1:#fib(#this-2)+#fib(#this-1)],#fib(11)"/>

上面的表达式可以输出fib(11)的值。

原创粉丝点击