Ognl表达式与Struts标签
来源:互联网 发布:微信制作软件 编辑:程序博客网 时间:2024/05/05 18:47
概述
OGNL表达式
OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。 Struts2框架使用OGNL作为默认的表达式语言。
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、操作集合对象。
总结
OGNL 有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现了 java.utils.Map 的接口。 OgnlContext对象
OgnlContext对象(了解)
OgnlContext对象是ognl表达式语言的核心。源码类: public class OgnlContext extends Object implements Map{..}硬编码方式,了解OgnlContext对象:
// 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); }}
ValueStack对象
ValueStack, 即值栈对象。值栈对象: 是整个struts数据存储的核心,或者叫中转站。 用户每次访问struts的action,都会创建一个Action对象、值栈对象、ActionContext对象; 然后把Action对象放入值栈中; 最后再把值栈对象放入request中,传入jsp页面。(key: struts.valueStack); 开发者只需要通过ActionContext对象就可以访问struts的其他的关键对象。 (ActionContext是给开发者用的,便于学习与使用。)
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 }}
在jsp中取值:
<body> <!-- 页面: 必须要拿到ValueStack --> <br/>1. 取根元素的值<br/> <s:property value="user.id"/> <s:property value="user.name"/> <s:property value="user.address"/> <s:property value="user.address.city"/> <s:property value="user.address.province"/> <br/>2. 取非根元素的值<br/> <s:property value="#request.cn"/> <s:property value="#session.Session_data"/> <s:property value="#application.Application_data"/> <br/> <!-- 自动找request/session/application,找到后立刻返回 --> <s:property value="#request_data"/> <s:property value="#attr.Session_data"/> <s:property value="#attr.Application_data"/> <br/> <!-- 获取请求的参数数据 --> <s:property value="#parameters.userName"/> <!-- struts的调试标签:可以观测值栈数据 --> <s:debug></s:debug> </body>
OGNL表达式
#号
1. 主要用于访问访问Map栈信息,不使用#号主要用于访问List(对象栈)信息2. #号还有一个作用就是在JSP页面中构建Map集合。 格式:#{key:value,key:value...}
<s:property value="#request.username"/><s:property value="#request.userpsw"/><s:property value="address"/> // 获取对象栈信息(默认从栈顶检索)
%号
用于通知执行环境%{}里的是OGNL表达式。
为了方便使用%{}我们可以在任何地方都直接添加%{}来确保运行OGNL表达式: <s:property value="%{#request.username}"/>
常用Struts2标签
property标签
property标签用于输出指定值:<s:property value=“#name" default="a default value" /> * default:可选属性, 如果需要输出的属性值为null,则显示该属性指定的值 * escape:可选属性,指定是否格式化HTML代码。 * value: 可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输出ValueStack栈顶的值。
<s:property value="#user.id"/>
iterator标签
Iterator: 标签用于对集合进行迭代,这里的集合包含List、Set和数组。value: 可选属性,指定被迭代的集合,如果没有设置该属性,则使用ValueStack栈顶的集合。var: 可选属性,引用变量的名称.status: 可选属性,该属性指定迭代时的IteratorStatus实例。该实例包含如下几个方法: int getCount(),返回当前迭代了几个元素。 int getIndex(),返回当前迭代元素的索引。 boolean isEven(),返回当前被迭代元素的索引是否是偶数 boolean isOdd(),返回当前被迭代元素的索引是否是奇数 boolean isFirst(),返回当前被迭代元素是否是第一个元素。 boolean isLast(),返回当前被迭代元素是否是最后一个元素。
<s:iterator var="user" value="#request.list" status="st"> <tr class=<s:property value="#st.even?'even':'odd'"/> > <td><s:property value="#user.id"/></td> <td><s:property value="#user.name"/></td> </tr></s:iterator>
1 0
- Ognl表达式与Struts标签
- Struts框架中OGNL标签与EL标签表达式使用
- Struts标签与OGNL表达式语言实例演练
- Struts2 入门(笔记三):Ognl表达式语言与struts标签
- Struts中的OGNL表达式语言1/Struts标签与OGNL表达式语言实例演练2/Struts2常用标签总结3
- struts标签,el表达式,ognl表达式
- OGNL表达式语言和struts标签
- ognl表达式与struts2标签
- struts标签 Ognl表达式 EL表达式 jstl标签
- struts标签,ognl表达式,el表达式,jstl表达式的区别
- Struts的标签和Struts的OGNL表达式(三)
- Struts2学习——(六)值栈与OGNL表达式[结合struts标签]
- Struts中OGNL与EL表达式
- Struts中OGNL与EL表达式
- Struts中OGNL与EL表达式
- Struts中OGNL与EL表达式
- Struts 简单UI标签,ognl表达式语言几个符号
- 简单学习struts标签中使用ognl表达式
- 递归提取文件夹下所有叶子节点文件至指定文件夹
- RSA签名加密
- Visual studio 2008 安装与部署
- java8 时间
- codeforces 675D 模拟构建二叉排序树
- Ognl表达式与Struts标签
- 【leetcode】226. Invert Binary Tree
- vs上C/C++并行计算#pragma omp
- 解读分库分表中间件Sharding-JDBC
- 二进制流
- 各种jar包下载网址
- Android BroadcastReceiver 注册和反注册
- 协同过滤算法的Python实现
- JDBC DBUtil 的使用.pdf