Struts2-----Ognl表达式语言

1,Ognl表达式:

Ognl表达式是Object Graphic navigation Language(对象图导航语言)的缩写,是一个开源项目,Struts2框架使用Ognl作为默认的表达式语言(必须引入ognl.jar)


2,作用:主要用于页面取值


3,主要对象详解:

OgnlContext对象:

是ognl表达式语言的核心,实现了java.utils.Map接口,

使用硬编码熟悉OgnlContext对象如下:

package ognl;

import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;

import org.junit.Test;

//OgnlContext用法
/*
	使用ognl表达式语言取值,如果取非根元素的值必须用#
 */
public class OgnlDemo {
	@Test
	public void testOgnl1() throws Exception{
		//创建一个ognl上下文对象
		OgnlContext context=new OgnlContext();
		//放入数据
		User user=new User();
		user.setId(100);
		user.setName("Jack");
		
		//往非根元素放入数据,取值的时候表达式要用"#"
		context.put("user", user);
		//获取数据(map)
		//先构建一个Ognl表达式,再解析表达式
		Object ognl=Ognl.parseExpression("#user.name");
		Object value=Ognl.getValue(ognl, context, context.getRoot());
		System.out.println(value);
	}
	
	//取根元素的值不用带#
	@Test
	public void testOgnl2() throws Exception{
		//创建一个ognl上下文对象
		OgnlContext context=new OgnlContext();
		//放入数据
		User user=new User();
		user.setId(100);
		user.setName("Jack");
		
		//往根元素放入数据
		context.setRoot(user);
		
		//获取数据(map)
		//先构建一个Ognl表达式,再解析表达式
		Object ognl=Ognl.parseExpression("address.province");
		Object value=Ognl.getValue(ognl, context, context.getRoot());
		System.out.println(value);
	}
	//静态方法调用
	@Test
	public void testOgnl3() throws Exception{
		//创建了一个Ognl表达式对象
		OgnlContext context=new OgnlContext();
		//Ognl表达式语言,调用类的静态方法
//		Object ognl=Ognl.parseExpression("@Math@floor(10.9)");
		//由于Math类在开发中比较常用,也可以如下书写:
		Object ognl=Ognl.parseExpression("@@floor(10.9)");
		Object value=Ognl.getValue(ognl, context, context.getRoot());
		System.out.println(value);
	}
	
}

ValueStack对象:

值栈对象,是整个Struts数据存储的核心,是数据中转站.

用户每次访问Action,都会创建一个Action实例,ValuesStack实例,ActionContext实例然后把Action对象放入值栈对象中,

把值栈对象放入request中,传入jsp页面(Struts2框架把 ValueStack 对象保存在名为 “struts.valueStack” 的request请求属性中).

开发者只需要通过ActionContext对象就可以访问struts的其他关键对象.(ActionContext是给开发者使用的,便于学习和使用)


4,ValueStack详解:

ValueStack中的数据分为根元素和非根元素,其中根元素取值不需要"#",非根元素取值必须要有"#".

根元素至于CompoundRoot中,存储动作和相关对象,以list的方式存储;非根元素至于OgnlContext中,保存映射关系,以map的方式存储.

struts会把以下元素压入OgnlContext中:

  parameters: 该 Map 中包含当前请求的请求参数
        request: 该 Map 中包含当前 request 对象中的所有属性
        session: 该 Map 中包含当前 session 对象中的所有属性
        application:该 Map 中包含当前 application  对象中的所有属性
        attr: 该 Map 按如下顺序来检索某个属性: request, session, application

注意:使用Struts标签中的调试标签能查看对象栈(值栈):<s:debug></s:debug>

OgnlContext是Struts2的数据中心(如下图):



注意
       Struts2中,OGNL表达式需要配合Struts标签才可以使用。如:<s:property value="name"/>  


4,Struts常用标签

property标签:用于输出指定值:
<s:property value=“#name" default="a default value" />     
    * default:可选属性, 如果需要输出的属性值为null,则显示该属性指定的值
     *  escape:可选属性,指定是否格式化HTML代码。
     *  value:   可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输
                                           出ValueStack栈顶的值。

<br>1.取根元素的值<br/>	
	<s:property value="user.id"/>
	<s:property value="user.name"/>
	<s:property value="user.address.province"/>
	<s:property value="user.address.city"/>
	
	<br>2.取非根元素的值<br/>
	<s:property value="#request.request_data"/>	
	<!-- 自动找request/session/application中的数据,找到后立刻返回 -->
	<s:property value="#attr.session_data"/>
	
	<!-- 获取请求的参数数据 -->
	<s:property value="#parameters.userName"/>
	
	<!-- struts的调试标签:可以观测值栈数据 -->
	<s:debug></s:debug>

Iterator:标签用于对集合进行迭代,这里的集合包含List、Set和数组。
value:可选属性,指定被迭代的集合,如果没有设置该属性,则使用ValueStack栈顶的集合。
var:    可选属性,引用变量的名称.
status:可选属性,该属性指定迭代时的IteratorStatus实例。该实例包含如下几个方法:
int getCount(),返回当前迭代了几个元素。
int getIndex(),返回当前迭代元素的索引。
boolean isEven(),返回当前被迭代元素的索引是否是偶数
boolean isOdd(),返回当前被迭代元素的索引是否是奇数
boolean isFirst(),返回当前被迭代元素是否是第一个元素。
boolean isLast(),返回当前被迭代元素是否是最后一个元素。

案例:使用迭代标签迭代list集合和map集合:


package ognl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class OgnlDemo03 extends ActionSupport{
	@Override
	public String execute() throws Exception {
		//测试迭代标签
		List<User> list=new ArrayList<User>();
		Map<Integer,User> map=new HashMap<Integer, User>();
		
		//初始化
		for(int i=0;i<11;i++){
			User user=new User(i,"Jack"+i);
			list.add(user);
			map.put(user.getId(), user);
		}
		
		//保存
		ActionContext.getContext().getContextMap().put("list", list);
		ActionContext.getContext().getContextMap().put("map", map);
		
		return SUCCESS;
	}
}


<style type="text/css">
   		.odd{
           background-color: red;}
  		.even{
           background-color:blue;}
  	</style>
  </head>
  
  <body>
  	<br>1.list迭代<br/>
  	<table border="1" align="left">
  		<tr>
  			<th>编号</th>
  			<th>姓名</th>
  		</tr>
  		<s:iterator var="user" value="#request.list" status="sta">
  			<tr class=<s:property value="#sta.even?'even':'odd'"/>>
  				<td>
  					<s:property value="#user.id"/>
  				</td>
  				<td>
  					<s:property value="#user.name"/>
  				</td>
  			</tr>
  		</s:iterator>
  	</table>
  	
  	<br/>2.map迭代<br/>
  	<table border="1" align="left">
  		<tr>
  			<th>编号</th>
  			<th>姓名</th>
  		</tr>
  		<s:iterator var="entry" value="#request.map" status="sta">
  			<tr class=<s:property value="#sta.even?'even':'odd'"/>>
  				<td>
  					<s:property value="#entry.key"/>
  				</td>
  				<td>
  					<s:property value="#entry.value.name"/>
  				</td>
  			</tr>
  		</s:iterator>
  	</table>
  </body>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值