Ognl表达式语言
概述
l OGNL表达式
OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。 Struts2框架使用OGNL作为默认的表达式语言。
l OGNL优势
1、支持对象方法调用,如xxx.doSomeSpecial();
2、支持类静态的方法调用和值访问,表达式的格式:
@[类全名(包括包路径)]@[方法名 | 值名],例如:
@java.lang.String@format('foo %s', 'bar')
或@tutorial.MyConstant@APP_NAME;
3、支持赋值操作和表达式串联,如price=100, discount=0.8,
calculatePrice(),这个表达式会返回80;
4、访问OGNL上下文(OGNL context)和ActionContext;
5、操作集合对象。
l 总结
OGNL 有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现了 java.utils.Map 的接口。 OgnlContext对象
分析:
ü Struts框架默认就支持Ognl表达式语言。
(struts必须引用的包:ognl.jar)
ü 作用
页面取值用。
El表达式语言,用于页面取值,jsp页面取值的标准。(默认直接可以使用)
(应用范围更广。)
Ognl表达式语言, struts标签默认支持的表达式语言。
必须配置struts标签用,不能离开struts标签直接用。
package loaderman.b_ognl; public class Address { private String province; private String city; public Address() { super(); // TODO Auto-generated constructor stub } public Address(String province, String city) { super(); this.province = province; this.city = city; } public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } }
package loaderman.b_ognl; import ognl.Ognl; import ognl.OgnlContext; import ognl.OgnlException; import org.junit.Test; // OgnlContext用法 public class OgnlDemo1 { /** * 1. Ognl表达式语言语言取值,取非根元素的值,必须用#号 * @throws Exception */ @Test public void testOgnl() 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); } /** * 2. Ognl表达式语言语言取值,取根元素的值,不用带#号 * @throws Exception */ @Test public void testOgn2() 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); } /** * 3.Ognl对 静态方法调用的支持 * @throws Exception */ @Test public void testOgn3() 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); } }
package loaderman.b_ognl; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.util.ValueStack; /** * struts的数据流转 * */ public class OgnlDemo2 extends ActionSupport{ // 根元素值 private User user = new User(100,"Jacks"); public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String execute() throws Exception { ActionContext ac = ActionContext.getContext(); // 映射数据 ac.getContextMap().put("request_data", "request_data"); // 数据存储request // Map<String,Object> map = (Map<String, Object>) ac.get("request"); // map.put("request_data", "request_data"); // map.put("cn", "China"); ac.getSession().put("Session_data", "Session_data"); ac.getApplication().put("Application_data", "Application_data"); // 二、值栈对象的存储数据的原理 ValueStack vs = ac.getValueStack(); /***************操作根元素的几种方法*****************/ // 设置数据: 入栈 //vs.push(new User(1002,"Tom")); // 栈顶 //vs.pop(); // 移除栈顶元素 // 如何存储? map结构存储 //vs.set("user1", new User(1,"Jacky1")); //vs.set("user2", new User(2,"Jacky2")); return super.execute(); } // 一、获取值栈对象的2种方式 private void getVs() { // 获取值栈对象,方式1: HttpServletRequest request = ServletActionContext.getRequest(); ValueStack vs1 = (ValueStack) request.getAttribute("struts.valueStack"); // 获取值栈对象,方式2: ActionContext ac = ActionContext.getContext(); ValueStack vs2 = ac.getValueStack(); System.out.println(vs1 == vs2);//true } }
package loaderman.b_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; /** * struts的数据流转 * */ public class OgnlDemo3 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=1; 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 super.execute(); } }
package loaderman.b_ognl; public class User { private int id; private String name; private Address address = new Address("广东省","广州"); public User() { super(); } public User(int id, String name) { super(); this.id = id; this.name = name; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="ogn_" extends="struts-default"> <action name="ognl" class="loaderman.b_ognl.OgnlDemo3"> <result name="success">/ognl.jsp</result> </action> </package> </struts>
posted on 2018-11-28 16:46 LoaderMan 阅读(1040) 评论(0) 编辑 收藏 举报