天天看点

Struts2框架的学习4(Struts-2.5.x)

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提供的一个迭代数据的标签。

Struts2框架的学习4(Struts-2.5.x)

HTML语言中,表单元素有一些通用的属性:

Struts2框架的学习4(Struts-2.5.x)

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>