首页 > 代码库 > struts2_13_OGNL表达式

struts2_13_OGNL表达式

全称Object Graphic Navigation Language(对象图导航语言)是一个开源项目,是Struts2框架的默认表达式语言。

 

相对于EL表达式,它提供了平时我们需要的一些功能,如:

·支持对象方法调用,如method.sayHello();

·支持类静态方法调用和值访问,表达式的格式为@[类全名(包括路径)]@[法名|值名],例如:@java.lang.String@format(foo %s,bar)或   

   @cn.itcast.Constant@APP_NAME;

·操作集合对象

 

Ognl有一个上下文(Context)概念,用来实现java.utils.Map接口,在Struts2中上下文(Context)的实现为ActionContext

 

下面为ActionContext包含的对象:

·ValueStack(值栈,它是跟对象)

·parameters

·request

·session

·application

·attr

Struts2接受一个请求时,会迅速创建ActionContextValueStackaction然后把action存放入ValueStack中,所以action的实例变量可以被OGNL访问。

 

访问上下文(Context)中的对象需要使用#符号标注命名空间,如:#application#session,另外OGNL会设定一个根对象(root对象),在Struts2中根对象就是ValueStack(值栈),如果要访问根对象的属性,则可以省略#命名空间,直接访问该对象的属性。

 

Struts2中,根对象ValueStack的实现类为OgnlValueStack,该对象存放一组对象,在OgnlValueStack类里面有一个List类型的root变量,就是使用它存放一组对象。

root变量中处于第一位的对象叫做栈顶对象,通常我们在OGNL表达式里直接写上属性的名称即可访问root变量对象的属性,搜索顺序是从栈顶对象开始寻找,如果栈顶对象不存在该属性,就会从第二个对象寻找,如果没有就继续依次往下访问,直至找到为止。

 

注意:Struts2中,OGNL表达式需要配合Struts标签才能使用,如:<s:property value=http://www.mamicode.com/name/>

 

由于ValueStackstruts2OGNL的根对象,如果用户需要访问值栈中的对象,在JSP页面可以直接通过下面的EL表达式访问ValueStack中的属性:

${propertise }//获得值栈中某个对象的properties属性

 

如果访问其它Context中的对象,由于不是根对象,所以在访问时需要添加#前缀:

·application对象:用于访问ServletContext方法:#application.userName#application[userName]

  相当于调用ServletContext的   getAttributeuserName)。


·session对象:用于访问HttpSession方法:#session.userName#session[userName]

  相当于调用session.getAttributeuserName)。

 

·request对象:用于访问HttpServletrequest属性的Map方法:#request.userName#request[userName]

  相当于调用request.getAttributeuserName)

 

·parameters对象:用于访问Http的请求参数方法:#parameters.userName#parameters[userName]

  相当于调用request.getparameteruserName)

 

·attr对象:用于按page->request->session->application顺序访问起属性。


property标签:

property标签用于输出指定值:

<s:set name=”name” value=http://www.mamicode.com/”kk”/>>

default:可选属性,如果需要输出属性的值为null,则显示该属性的值

escape:可选属性,指定是否格式化HTML代码

value:可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输出ValueStack栈顶的值

id:可选属性,指定该元素的标识

 

iterate标签:

iterate标签用于对集合进行迭代,这里的集合包含ListSet和数组。

<span style="font-size:12px;"><s:set name=”list” value=http://www.mamicode.com/”{‘zhao’,’qian’,’sun’}”/>>

value:可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输出ValueStack栈顶的值

status:可选属性,该属性指定迭代时的iterateStatus实例,

该方法有如下几个方法:

int getCount(),返回当前迭代了几个元素

int getIndex(),返回当前迭代元素的索引

boolean isEven(),返回当前被迭代的元素的索引是否是偶数

boolean isOdd(),返回当前被迭代的元素的索引是否是奇数

boolean isFirst(),返回当前被迭代的元素是否为第一个元素

boolean isLast(),返回当前被迭代的元素是否为最后一个

 

if/elseif/else标签:

<s:set name=”age” value=http://www.mamicode.com/”33”/>>


url标签:

<span style="font-size:12px;"><s:set name="age" value=http://www.mamicode.com/"33" scope="request" />>

输出为:/Ognl/test/hello.action?personId=33  

当标签的属性值为字符串类型处理时,”%”符号的用途是计算OGNL表达式的值。

<s:set name="myurl" value=http://www.mamicode.com/"'http://www.hao123.com'" />>

输出为:http://www.hao123.com 


表单标签checkBoxList复选框:

如果集合为list

<struts>
<!--默认的视图主题-->
  	<constant name="struts.ui.theme" value=http://www.mamicode.com/"simple"/>>


防止表单的重复提交:

1)登录界面index.jsp中的代码:

<s:form action="hello" namespace="/test" method="post">
	  	姓名:<s:textfield name="name" />
		<s:token />
		<input type="submit" value=http://www.mamicode.com/"发送" />>

2)struts.xml文件中的代码:

<package name="base" namespace="/test" 				
extends="struts-default">
		<action name="hello" class="struts2.personAction">
		<!-- 加入拦截器,当再一次访问已经访问到的页面时,会跳转到登陆页面 -->
			<interceptor-ref name="defaultStack" />
			<interceptor-ref name="token" />
			<result name="invalid.token">/index.jsp</result>
			<result name="success">/show.jsp</result>
		</action>
	</package>
</struts>

3)personAction中的代码:

public class personAction {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public String execute(){
		return "success";
	}
}

4)显示层show.jsp中的代码:

<body>
	<s:property value=http://www.mamicode.com/"name" />>

注意:以上配置了“token”拦截器和“invalid.token”结果,因为“token”拦截器在会话的token与请求的token不一致时,将会直接返回“invalid.token”结果。













struts2_13_OGNL表达式