Struts2 Ognl表达式模拟

OGNL表达式解析实战
本文通过一个实战案例介绍如何使用OGNL表达式获取不同层级的对象属性。首先创建了一个包含多个对象的Map,并设置了根对象,然后展示了如何根据不同对象作为根对象来获取其属性。
package com.xs;

import java.util.HashMap;
import java.util.Map;

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

public class OgnlTest {
	public static void main(String[] args) throws Exception{
		Action a = new Action();
		a.setUsername("Tom");
		
		Request r = new Request();
		User u = new User();
		u.setUsername("Jim");
		u.setPassword("123");
		r.setAttribute("user", u);
		
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("action", a);
		map.put("request", r);
		
		OgnlContext context = new OgnlContext(map);
		context.setRoot(a);//设置当前的Action为根对象
		
		System.out.println(Ognl.getValue("username", context, context.getRoot()));//根对象属性,可直接取
		System.out.println(MyOgnl.getValue("#request.user.username", context, context.getRoot()));//非根对象属性的取法
		System.out.println(MyOgnl.getValue("#request.user.password", context, context.getRoot()));//非根对象属性的取法
		
		Object object = MyOgnl.getValue("#request.user", context, context.getRoot());//非根对象属性的取法
		OgnlContext userContext = new OgnlContext();
		userContext.put("user", object);
		userContext.setRoot(object);//设置根对象
		System.out.println(Ognl.getValue("username", userContext, userContext.getRoot()));//根对象属性直接取
		System.out.println(Ognl.getValue("password", userContext, userContext.getRoot()));//根对象属性直接取
	}
}

class MyOgnl{
	public static Object getValue(String expression, OgnlContext context, Object root){
		Object result = null;
		try {
			String newExpression = "";
			if (expression.indexOf("request") > -1) {
				String[] keys = expression.split("\\.");
				newExpression += "#request.attributes";
				for (int i = 1; i < keys.length; i++) {
					newExpression += "." + keys[i];
				}
			} else {
				newExpression = expression;
			}
			result = Ognl.getValue(newExpression, context, root);
		} catch (OgnlException e) {
			e.printStackTrace();
		}
		return result;
	}
}

class Action{
	private String username;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}
}
class Request{
	private Map<String, Object> attributes = new HashMap<String, Object>();
	
	public void setAttribute(String key, Object object){
		attributes.put(key, object);
	}
	
	public Object getAttribute(String key){
		return attributes.get(key);
	}

	public Map<String, Object> getAttributes() {
		return attributes;
	}
}

class User{
	private String username;
	private String password;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
}





输出:

Tom
Jim
123
Jim
123

我们可以看到,根对象都是相对于上下文(OgnlContext)而言的。

注意:对象的属性需要有getter方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值