5.1 OGNL表达式语言
OGNL(Object Graph Navigation Language)是一种强大的表达式语言,能够自动导航对象机构并访问和设置对象数据。
OGNL表达式语言是非常强大的表达式语言,它要比JSP中的EL(表达式语言)更加强大,OGNL表达式语言的特点如下:
①支持对象方法的调用;
②支持静态方法的调用;
③支持变量的赋值;
④可以操作集合数据;
struts2框架在OGNL的基础上增强,提高了对数据的访问能力。在Struts2框架中,OGNL上下文作用于Struts2中的ActionContext对象,ActionContext对象是Struts2框架中的一个核心对象。
①获取Application中的对象
在ActionContext对象中包含application,由于它不是OGNL上下文的根,其取值方法使用如下代码:
它表示调用了application.getAttribute(“name”)方法。
②获取request中的值
它表示调用了request.getAttribute(“name”)方法。
③获取session中的值
它表示调用了session.getAttribute(“name”)方法。
④获取parameters中的值
它表示调用了session.getParameter(“name”)方法。
⑤获取attr中的值
如果不指定范围,可以使用attr来获取属性值,其搜索范围按page,request,session,application的次序进行搜索。
操作普通的属性与方法
Struts2框架在OGNL的基础上增强,在Struts2框架中使用OGNL表达式语言需要借助于Struts2标签进行输出。
①获取User对象中的属性值
②获取User对象中的方法
访问数组
访问数组中的元素通过其下标进行访问,OGNL表达式中的数据与在Java中的访问方法相似,同样也是通过下标访问,使用OGNL表达式访问如下:
arr[0] //获取下标为 0 元素
arr.length //获取数组的长度
访问List ,Set ,Map集合
集合在Java中是经常使用的对象,OGNL也提供了访问集合的方法;
①List集合
有序集合对象,使用OGNL访问List集合,通过下标进行访问:
②Set集合
无序集合对象,由于集合无序,因此不能通过集合访问
③Map集合
它的数组存储结构以Key, Value的方式进行存储,使用OGNL访问Map集合,通过获取Key值来访问Value:
map.key 或 map[‘key’]
map.keys //获取所有key
map.values //获取所有value
针对集合提供了两个通用的方法:
collection.isEmpty //判断集合元素是否为空
collection.size() //获取集合的长度
投影与选择
①投影
即对集合中列的操作,就是指将集合中的某一个列形成一个集合,此列既是原集合中的投影,获取集合中的所有用户姓名:
以上代码针对的是值栈中的对象,如果是非值栈中的对象,还需要加上“#”,如“#list.name
②选择
选择是对集合中行进行操作,通过一定的条件获取集合中满足条件的数据,所得到的行的集合的操作,就是选择操作。例如获取集合中用户年龄大于20的所有用户:
以上代码针对的是值栈中的对象,如果是非值栈中的对象,还需要加上“#”,如“#list.{?#this.age>20}”
符号 | 说明 |
---|---|
? | 获取满足指定条件的所有元素 |
^ | 获取满足指定条件的所有元素中的第一个元素 |
$ | 获取满足指定条件的所有元素中的最后一个元素 |
5.2 Struts2的标签库
数据标签
① property标签
其作用是获取数值,输出到页面。
有属性:default,escape,escapeJavaScript,value;
② set标签
<s:set var=”username” value=”set标签” scope=”request”></s:set>
<s:propety default=”no datas” value=”#request.username”/>
③ a标签
④ param 标签
用于对参数赋值,name设置参数名称,value设置参数值
⑤ action标签
⑥ push 标签
用于将对象或值压入到值栈中并放置到顶部,属性只有一个value
<s:push value=”#request.name”></s:push>
⑦ date 标签
用于格式化日期时间,可以通过指定的格式化样式对日期时间进行格式化
format : 设置格式化日期的样式
name : 日期值
nice :是否输出给定日期与当前日期之间的时差。默认false
var 格式化时间的名称变量,通过该变量可以对其进行引用。
⑧ include 标签
<%@ include file=”xxx.jsp”%>
⑨ url 标签
url标签是一个常用标签,在url标签中可以向url传递请求参数,也可以通过url标签提供的属性生成不同格式的url。
控制标签
① if 标签
<s:if> <s:elseif> <s:else>
第一个可单独使用,后两个不可单独使用
<s:if test=”表达式的布尔值”>输出结果</s:if>
<s:elseif test=” ”>输出结果</s:elseif>
<s:else>输出结果</s:else>
② iterator 标签
Struts2提供的一个迭代数据的标签。
HTML语言中,表单元素有一些通用的属性:
5.3 拦截器的使用
拦截器介绍
拦截器(Interceptor) 是Struts2框架中一个非常重要的核心对象,它可以动态增强Action对象的功能。Struts2框架中,很多重要的功能都是通过拦截器进行实现的。
当浏览器在请求一个action时,会经过Struts2框架的入口对象----Struts2过滤器,此时Struts2过滤器会创建Action的代理对象,之后通过拦截器即可在Action对象执行的前后进行一些操作。
拦截器 API
在Struts2 API中有一个名称为com.opensymphony.xwork2.interceptor的包,该包中的对象是Struts2内置的一些拦截器对象,它们具有不同的功能。在这些对象中,Interceptor接口是Struts2中定义的拦截器对象,其他的拦截器都直接或间接地实现于此接口。
无论内置的拦截器对象或是自定义拦截器对象,都需直接或间接实现此接口。
public interface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}
①destroy()方法:指示拦截器的生命周期结束,它在拦截器被销毁前调用,用于释放拦截器初始化时所占用的一些资源。
②init()方法:用于对拦截器进行初始化操作,该方法在拦截器被实例化后,intercept()方法执行前调用。
③intercept()方法:是执行拦截器中的主要方法,用于执行Action对象中的请求处理方法以及在Action的前后进行操作,动态增强Action的功能。
只有调用了intercept方法的invocation参数的invoke()方法,才可以执行Action对象中的请求处理方法。
开发中主要是对intercept()方法实现,因此可以通过继承AbstractInteceptor()类来重写其中的一个方法,而不必重写所有方法。
使用拦截器
在Struts2框架中创建了一个拦截器对象后,还需要对拦截器进行配置,才可以将其应用到Action对象上,通过继承AbstractInterceptor()对象进行创建,拦截器的配置是通过标签进行的。
例:为Action对象配置输出执行时间的拦截器,查看执行Action所需的时间。
① 创建JavaWeb项目,导入相应的jar包,在web.xml中配置过滤器。
②创建名为TestAction的类。继承ActionSupport对象:
public class TestAction extends ActionSupport{
private static final long serialVersionUID = 1L;
public String excute() throws Exception{
//睡眠1s
Thread.sleep(1000);
return SUCCESS;
}
}
xml配置
<action name="testAction" class="com.muke.action.TestAction">
<interceptor-ref name="timer"/> <!-- 配置拦截器 -->
<result>first.jsp</result>
</action>