Struts2 Ognl表达式模拟

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方法

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值