ValueStack基础:OGNL

ValueStack基础:OGNL

要了解ValueStack,必须先理解OGNL(Object Graphic Navigatino Language)!

OGNL是Struts2中使用的一种表达式语言,它可以用于JSP的标签库中,以便能够方便的访问各种对象的属性;它用于界面将参数传递到Action(并进行类型转换)中;它还可以用于struts2的配置文件中!所以,非常有必要理解OGNL的基本机制。

 

Root对象

OGNL称为对象图导航语言。所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象。如:

package cn.com.leadfar.struts2.actions;

 

public class User {

    private String username;

    private Group group;

   

    public String getUsername() {

       return username;

    }

    public void setUsername(String username) {

       this.username = username;

    }

   

    public Group getGroup() {

       return group;

    }

    public void setGroup(Group group) {

       this.group = group;

    }

}

 

package cn.com.leadfar.struts2.actions;

 

public class Group {

    private String name;

    private Organization org;

    public String getName() {

       return name;

    }

 

    public void setName(String name) {

       this.name = name;

    }

 

    public Organization getOrg() {

       return org;

    }

 

    public void setOrg(Organization org) {

       this.org = org;

    }

}

 

package cn.com.leadfar.struts2.actions;

 

public class Organization {

    private String orgId;

 

    public String getOrgId() {

       return orgId;

    }

 

    public void setOrgId(String orgId) {

       this.orgId = orgId;

    }

}

 

 

上面三个类,描述了通过一个User对象,可以导航到Group对象,进而导航到Organization对象,以User对象为根,一个对象图如下所示:

 

User(root)

   -- username

   -- group

      -- name

      -- org

         -- orgId

 

在真实的环境下,这个对象图可能会极其复杂,但是通过基本的getters方法,都应该能够访问到某个对象的其它关联对象。【对象图的导航,必须通过getters方法进行导航

 

下述代码将创建一个User对象,及其相关的一系列对象:

       User user = new User();

       Group g = new Group();

       Organization o = new Organization();

        o.setOrgId("ORGID");

       g.setOrg(o);

       user.setGroup(g);

 

如果通过JAVA代码来进行导航(依赖于getters方法),导航到Organization的orgId属性,如下所示:

 

//用JAVA来导航访问

user.getGroup().getOrg().getOrgId();

 

 

【注意:导航的目的,是为了获取某个对象的值或设置某个对象的值或调用某个对象的方法!】

【注意:OGNL表达式语言的真正目的,是为了在那些不能写JAVA代码的地方执行JAVA代码,或者是为了更方便地执行JAVA代码】

 

利用OGNL进行导航的代码如下:

 

       //利用OGNL表达式访问

       String value = (String)Ognl.getValue("group.org.orgId", user);

 

Ognl.getValue()方法的第一个参数,就是一条OGNL表达式,第二个参数是指定在表达式中需要用到的root对象!

完整代码如下:

    public void testOgnl01() throws Exception{

       User user = new User();

       user.setUsername("张三");

      

       //利用OGNL表达式访问user对象的username属性

       String value = (String)Ognl.getValue("username", user);

       log(value);

    }

   

    public void testOgnl02() throws Exception{

       User user = new User();

       Group g = new Group();

       Organization o = new Organization();

       o.setOrgId("ORGID");

       g.setOrg(o);

       user.setGroup(g);

      

       //用JAVA来导航访问

       log(user.getGroup().getOrg().getOrgId());

      

       //利用OGNL表达式访问

       String value = (String)Ognl.getValue("group.org.orgId", user);

       log(value);

    }

   

    public void testOgnl03() throws Exception{

       User user = new User();

       Group g = new Group();

       Organization o = new Organization();

       o.setOrgId("ORGID");

       g.setOrg(o);

       user.setGroup(g);

      

       //用JAVA来导航访问

       log(user.getGroup().getOrg().getOrgId());

      

       //也可以在表达式中使用#root来代表root对象

       String value = (String)Ognl.getValue("#root.group.org.orgId", user);

       log(value);

    }

    private void log(Object o){

       System.out.println(o);

    }

 

 

Context对象

在OGNL的表达式中,有可能需要访问到多个毫不相干的对象,这时候,我们需要给OGNL传递一个Map类型的对象,把表达式中需要用到的对象放到Map中即可!这个Map对象,称为context。

 

要在表达式中访问到context中的对象,需要使用“#对象名称”的语法规则。

如:

    public void testOgnl04() throws Exception{

       User user = new User();

       user.setUsername("张三");

       Group g = new Group();

       Organization o = new Organization();

       o.setOrgId("ORGID");

       g.setOrg(o);

       user.setGroup(g);

      

       User user2 = new User();

       user2.setUsername("李四");

      

       /**

        * 所谓context其实就是一个Map类型的对象。主要是因为在OGNL中,不支持多个root对象,那么

        * 如果需要在表达式中访问更多毫不相干的对象时,只能通过一个Map来把这些对象统一传递给OGNL。

        */

       Map context = new HashMap();

       context.put("u1", user);

       context.put("u2", user2);

      

       //在表达式中需通过“#+对象的名称”来访问context中的对象

       //如果表达式中没有用到root对象,那么可以用任意一个对象代表root对象!

       String value = (String)Ognl.getValue("#u1.username + ',' + #u2.username", context,new Object());

       log(value);

    }

   

    public void testOgnl05() throws Exception{

       User user = new User();

       user.setUsername("张三");

       Group g = new Group();

       Organization o = new Organization();

       o.setOrgId("ORGID");

       g.setOrg(o);

       user.setGroup(g);

      

       User user2 = new User();

       user2.setUsername("李四");

      

       User user3 = new User();

       user3.setUsername("王五");

      

       Map context = new HashMap();

       context.put("u1", user);

       context.put("u2", user2);

      

       //给OGNL传递root对象及context对象,以便解释对应的表达式

       String value = (String)Ognl.getValue("#u1.username + ',' + #u2.username + ',' + username", context,user3);

       log(value);

    }

 

利用OGNL表达式进行赋值

 

OGNL表达式也可以用于赋值操作。

    public void testOgnl06() throws Exception{

       User user = new User();

      

       //调用setValue()方法来进行赋值

       //第一个参数:OGNL表达式

       //第二个参数:root对象

       //第三个参数:要赋的值     

       Ognl.setValue("username", user, "张三");

 

       log(user.getUsername());

    }

   

    public void testOgnl07() throws Exception{

       User user = new User();

      

       Map context = new HashMap();

       context.put("u", user);

      

       //调用setValue()方法来进行赋值

       //第一个参数:OGNL表达式

       //第二个参数:context对象

        //第三个参数:root对象

       //第四个参数:要赋的值

       Ognl.setValue("#u.username", context, new Object(), "张三");

 

       log(user.getUsername());

    }

   

    public void testOgnl08() throws Exception{

       User user = new User();

      

       Map context = new HashMap();

       context.put("u", user);

       

       //利用赋值符号"="来进行赋值

       Ognl.getValue("#u.username = '李四'", context, new Object());

 

       log(user.getUsername());

    }

   

    public void testOgnl09() throws Exception{

       User user1 = new User();

       User user2 = new User();

       Map context = new HashMap();

       context.put("u1", user1);

       context.put("u2", user2);

      

       //在一个表达式中可以用逗号分隔,同时执行多个表达式

       Ognl.getValue("#u1.username = '李四',#u2.username='王五'", context, new Object());

 

       log(user1.getUsername());

       log(user2.getUsername());

    }

 

利用OGNL调用对象的方法

 

    //************************* OGNL调用对象的方法 *****************************//

    public void testOgnl10() throws Exception{

       User user = new User();

      

       //如果是调用root对象的方法,可以直接使用方法的名称来调用方法

       Integer value = (Integer)Ognl.getValue("addSomething(1,1)", user);

       log(value);

    }

   

    public void testOgnl11() throws Exception{

       User user = new User();

       user.setUsername("李四");

       //如果是调用root对象的方法,可以直接使用方法的名称来调用方法

       String value = (String)Ognl.getValue("getUsername()", user);

       log(value);

    }

   

    public void testOgnl12() throws Exception{

       User user = new User();

       Ognl.getValue("setUsername('王五')", user);

       String value = (String)Ognl.getValue("getUsername()", user);

       log(value);

    }

   

    //************************* OGNL调用静态方法和变量 *********************//

    public void testOgnl13() throws Exception{

       User user = new User();

       user.setUsername("王五");

       //调用静态变量

       //注意:out是System中的静态变量,out是PrintStream类型的一个对象

       //而println()则是out这个对象中的实例方法(不是静态方法)

       //调用静态方法,需要在类名和变量名前面加上@来调用,对于实例方法,用"."来调用

       Ognl.getValue("@System@out.println(username)", user);

    }

   

    public void testOgnl14() throws Exception{

       User user = new User();

       user.setUsername("wangwu");

       //调用静态方法,注意使用全路径类名

       Ognl.getValue("@System@out.println(@cn.com.leadfar.utils.Utils@toUpperCase(username))", user);

    }

 

利用OGNL访问数组、集合对象

 

    public void testOgnl15() throws Exception{

      

       Object root = new Object();

       Map context = new HashMap();

      

       //利用OGNL创建java.util.List对象

       List list = (List)Ognl.getValue("{123,'xxx','kdjfk'}", context, root);

       context.put("list", list);

      

       //利用OGNL创建数组

       int[] intarray = (int[])Ognl.getValue("new int[]{23,45,67}", context, root);

       context.put("intarray", intarray);

      

       //利用OGNL表达式创建java.util.Map对象

       Map mapvalue = (Map)Ognl.getValue("#{'listvalue':#list,'intvalue':#intarray}", context, root);

       context.put("mapvalue", mapvalue);

      

       //利用OGNL表达式访问这些数组和集合对象

       Ognl.getValue("@System@out.println(#list[1])", context,root);

       Ognl.getValue("@System@out.println(#intarray[2])", context,root);

       Ognl.getValue("@System@out.println(#mapvalue.listvalue[0])", context,root);

       Ognl.getValue("@System@out.println(#mapvalue['intvalue'][0])", context,root);

    }

   

    public void testOgnl16() throws Exception{

      

       List root = new ArrayList();

       User user1 = new User();

       user1.setUsername("张三");

       User user2 = new User();

       user2.setUsername("李四");

       root.add(user1);

       root.add(user2);

      

       //如果root对象是List类型

       log(Ognl.getValue("#root[0].username", root));

       log(Ognl.getValue("#root[1].username", root));

    }

 


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/4826365.html,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4.H - 组合

题目连接:http://acm.hust.edu.cn/vjudge/contest/125308#problem/H 题目大意:下面是一个二人小游戏:桌子上有M堆扑克牌;每堆牌的数量分别为Ni(i1…M);两人轮流进行;每走一步可以任意选择一堆并取走其中的任…

结构体指针需要申请指针内存,结构体对象不需要申请对象内存

struct frame_info { char* data;//图像数据 int bufsize;//图像大小 }; 1、struct frame_info* finfoDT new struct frame_info; finfoDT->data new 1280*720 2、struct frame_info finfoDT new struct frame_info; finfoDT.data new 1280*720

图论——连通图

Tyvj 2059 元芳看电影 描述 神探狄仁杰电影版首映这天,狄仁杰、李元芳和狄如燕去看电影。由于人实在是太多了,入场的队伍变得十分不整齐,一个人的前面可能会出现并排的好多人。“元芳,这队伍你怎么看?”“大人&#xf…

linux-ftools查看Linux 的cached里面有哪些内容

最近,公司有几台java服务器经常出现can not allocate memory 的情况。导致SSH登录失败。 因此,有必要做点什么。 我们可以使用linux-ftools查看Linux 的cached里面有哪些内容(工具: https://code.google.com/p/linux-ftools/)&…

matlab常用函数——软件常用函数

一、软件操作函数 1)命令窗口函数: clc:清空命令窗口,使用向上箭头翻看命令。 open:打开文件,文本文件(*.doc),可执行文件(*.exe),图形文件(*.fig),超文本文件(*.html,*.htm),MATLAB数据库文件(*.mat),simulink模型文件*.mdl),MATLAB p文件(*.p),…

stanford corenlp的TokensRegex

最近做一些音乐类、读物类的自然语言理解,就调研使用了下Stanford corenlp,记录下来。 功能 Stanford Corenlp是一套自然语言分析工具集包括: POS(part of speech tagger)-标注词性NER(named entity recognizer)-实体名识别Parser树-分析句子…

将Linux系统下交叉编译的依赖库推到ARM平台下无法建立以来关系解决

问题:平常把opencv库使用源码交叉编译好之后,从windows推到飞机里发现,该库的依赖关系都没有了,导致程序运行的时候报该库大小有问题 解决办法: 1、将linux下的库推到ARM平台中的一个文件夹中,然后将ARM平台…

Java:switch语句例子

1、输入一个名次,第1~4名,分别称为冠军、亚军、季军、殿军,5名及5名以上,称为其他名次。 import java.util.Scanner; public class switch1 {public static void main(String[] args){Scanner snew Scanner(System.in)…

SQL计算100以内的质数(可以把100换成任意的整数)

declare i int --定义局部变量ideclare j int --定义局部变量jset i1 --给变量i赋值while i<100 --最外层while循环控制计算20以内的质数&#xff0c;每循环一次提供一个数&#xff0c;判断它是不是质数begin --最外层while循环开始set j1 --给变量j赋…

matlab常用函数——数据类型函数

三、基本数据类型函数 1)数值函数 double:转换为双精度浮点数 single:转换为单精度浮点数 typecast:在不改变数据大小情况下转换数据类型 Y=typecast(X,type) type可选范围:uint8、int8、uint16、int16、uint32、int32、uint64、int64、single、double arrayfun:把函数…

Courses hdu 1083(匹配)

http://acm.hdu.edu.cn/showproblem.php?pid1083 题意&#xff1a;一共有N个学生跟P门课程,一个学生可以任意选一门或多门课,问是否达成: 1.每个学生选的都是不同的课(即不能有两个学生选同一门课) 2.每门课都有一个代表(即P门课都被成功选过) 今天学姐讲匹配时讲的题目&#…

进程编译连接动态库,需要将动态库改为lib***.so

1、本身该库可能编译成npuDetect.so,但是需要改其名字为libnpuDetect.so,CMakelists才能找到该库 2、进程中连接动态库&#xff0c;如果该库还依赖别的动态库&#xff0c;则需要继续把其他的库也要连接进来

Drbd+Pacemaker实现高可用

What is Pacemaker? Pacemaker是一个集群资源管理器。它利用集群基础构件&#xff08;OpenAIS 、heartbeat或corosync&#xff09;提供的消息和成员管理能力来探测并从节点或资源级别的故障中恢复&#xff0c;以实现群集服务&#xff08;亦称资源&#xff09;的最大可用性。 前…

matlab常用函数——矩阵函数

五、数组和矩阵函数 1)数组基本函数 display:显示字符或者数组 isempty :判断数组是否为空,空返回1,不空返回0 isequal :判断数组是否相同 (认为NaN不同) isequalwithequalnans:判断数组是否相同,把NaN看成相同的数 isfinite :判断数组元素是否为有限数 isfloat…

记录下面试中的回答的不好的问题

1 伙伴系统在linux中的作用&#xff0c;具体咋回事 2 tcp拥塞控制 滑动窗口 3 linux sed&#xff0c;awk的具体使用 4 ftp哪几种模式 5 中断与轮询 6 C stl的vector是怎么是实现的 7 I/O多路复用是怎么回事&#xff0c;select(),epoll()具体怎么回事。 一个文件中每行一个单词&…

Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、...

去空格及特殊符号 s.strip().lstrip().rstrip(,) 复制字符串 #strcpy(sStr1,sStr2)sStr1 strcpysStr2 sStr1 sStr1 strcpy2print sStr2 连接字符串 #strcat(sStr1,sStr2)sStr1 strcatsStr2 appendsStr1 sStr2print sStr1 查找字符 #strchr(sStr1,sStr2)# < 0 为未找到…

周赛题解

A - An easy problemTime Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2601Description When Teddy was a child , he was always thinking about some simple math problems ,such as “What it’s 1 cup of wa…

matlab常用函数——数学函数

六、基本数学函数 1)基本运算符 +:加法运算符 -:减法运算符 *:矩阵乘法 .*:数组乘法 /:斜杠或者矩阵右除 B/A等于公式B*inv(A) ./:数组右除 A./B等于A(i,j)/B(i,j) \:反斜杠或者矩阵左除 A\B等于inv(A)*B .\:数组左除 A.\B等于B(i,j)/A(i,j) ^…