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