OGNL表达式

    |     2016年12月29日   |   struts2   |     0 条评论   |    1672

一、OGNL介绍

OGNL全称是Object-Graph Navigation Language(对象图导航语言)是一个用来获取 和设置 java对象属性的表达式语言,需在Struts2标签中使用。

在OGNL的使用中,需访问一系列对象,这些对象都存放在OGNL的context(上下文)中,context是一个Map结构,
存放了一系列的key-value对,实际上,它和ActionContext类是相对应的。

在发送Http请求给Struts2框架后,Struts2框架会创建ActionContext、ValueStack和对应的action对象,而action对象会被放入ValueStack对象中,ValueStack对象则会放入ActionContext对象中。

在jsp页面中访问context的数据时,都需用”#”,但ValueStack是其根对象则不需要,因此,在访问action对象的属性时
不需要使用”#”。

二、主要功能

1.取数据,它可以利用一段简短的表达式取出各种各样丰富的数据.
2.附带了一些便捷的功能,如:方法调用、静态方法和属性调用、数值运算……

三、如何取数据

  ognl会从两个地方取数据:一个是Action的实例属性;另一个是ValueStack(中文名叫值栈)。
    ognl会先从前者里面取,如果没取到再到ValueStack里取。ValueStack里存储了request、session、application、response、action实例、parameters数组……
 

1.取action实例的属性数据

  action实例的属性数据可以直接在struts2的标签中通过属性名取到。如:
  注意:不要加#号。

2.取ValueStack中的数据。

  struts2提供三种方式通过ognl表达式来取ValueStack中的数据:#、%{}、${}
  #和%{}需要放到struts2提供的标签里才生效。如:

<s:property value="#name"/>、<s:property value="%{'hello struts2'}"/>

  “%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。

<s:url value="%{#myMap['key1']}"/>

 最常用的方式是:#
 

 1.#能取request、session、application里的attribute,但需要加前缀。如:
<s:property value="#session.name2"/>、
<s:property value="#application.name3"/>。

如果是取request范围的attribute,那么不需要加request前缀,加上反而取不到数据,ognl默认从request里取,如果没有取到并不会到session或application里取。
如:<s:property value="#name"/>

  2.#能取request里的请求参数,但必须加parameters前缀,且取到的是一个数组,所以如果你要得到参数的第一项值,那么还要加下标。
如:<s:property value="#parameters.name[0]"/>。这相当于调用request.getParameterValues("name")[0];

  3.#加attr前缀能按request > session >application顺序获取attribute,这样当在request中取不到时,会自动向session里取,如果session里也取不到,会再向application里取。如果取到则返回,不再向上游历。
如:<s:property value="#attr.name"/>

  4.#能构造Map,
 如:<s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" /><s:property value="#foobar['foo1']" />
    <s:radio list="#{'0':'男','1':'女'}" name="sex" label="性别" value="%{user.sex}"></s:radio>
  5.#能用于过滤和投影(projecting)集合,
如:books.{?#this.price<100}

   6、“$”有两种用途   
  
(1)、在国际化资源文件中,引用OGNL表达式。   
  
(2)、在Struts 2配置文件中,引用OGNL表达式:    
  
<action name="saveUser" class="userAction" method="save">   
  
<result type="redirect">listUser.action?msg=${msg}</result>   
  
</action>   
  
<action name="saveUser" class="userAction" method="save">       
  
<result type="redirect">listUser.action?msg=${msg}</result>   
  
</action>  

三、代码实例

如:java:

/**
 *   通过ognl表达式从ognl上下文(context)获取值显示到jsp页面,ognl表达式只使用在struts2标签中
 *   ognl上下文(context) <=> ActionContext <- ValueStack <- action对象
 *   
 *   值栈 ValueStack 包含如下对象:
 *   action实例、request、session、application、response、parameters数组  attr...
 *
 */
public class OgnlAction extends BaseServletAction{
	private String name;
	private User user = new User();
	private List<User> list = new ArrayList<User>();
	
	@Override
	public String execute() throws Exception {
		ActionContext actionContext = ActionContext.getContext();
		ValueStack  valueStack = actionContext.getValueStack();
		valueStack.push("ognl名称");
		
		name="张三";
		user.setName("李四");
		user.setPassword("abcd");
		
		list.add(new User("王二","456"));
		list.add(new User("小明","123"));
		
		actionContext.put("number", "request=1001");
		
		session.setAttribute("age", "session=23");

		return SUCCESS;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public List<User> getList() {
		return list;
	}
	public void setList(List<User> list) {
		this.list = list;
	}
}

jsp:

<body>
	<!-- 显示valuestack值栈内容 -->
	<s:property value="name"/>
	<s:property value="user.name"/>
	<s:property value="user.password"/>
	
	<hr>
	<s:iterator value="list" var="u">
		<s:property value="#u.name"/><br>
	</s:iterator>
	
	<s:property value="#number"/>
	
	<s:property value="#session.age"/>
	
<%-- <s:set var="name"  value="小明" ></s:set>  --%>
	<%--ognl 从action对象中取属性值 --%>
	<s:property value="name" default="默认值" />
	<s:property value="user.username" default="默认值" />

	<br>用户名:
	<s:property value="userLists[1].username" default="默认值" />
	密码:
	<s:property value="userLists[1].password" default="默认值" />
	<br>
	<%--ognl 从ServletAPI request session .... 对象中取属性值 --%>
	<s:property value="#request.age" default="request默认值" />
	<s:property value="#session.sex" default="session默认值" />
	<!-- reqeust > session > application -->
	<s:property value="#attr.age" default="attr默认值" />

	<%--ognl 从valueStack中取属性值 --%>
	<s:property value="stack2.username" default="valueStack默认值" />

	${stack2.password}
	<br> ${user.username}

	<br>
	<s:form action="ognltag.jsp" method="post">
		<s:textfield label="用户名" name="user_name"></s:textfield>

		<s:password label="密码" name="pass_word"></s:password>

		<s:submit value="提交"></s:submit>
	</s:form>
	
	<s:property value="#parameters.user_name"/>
	<s:property value="#parameters.pass_word"/>

	<s:debug></s:debug>
</body>
转载请注明来源:OGNL表达式

上一篇:

下一篇:

回复 取消