资讯专栏INFORMATION COLUMN

Struts2【OGNL、valueStack】就是这么简单

Jenny_Tong / 804人阅读

摘要:也被称作值栈对象当用户访问,都会创建一个对象,对象对象把对象放进对象之中。对象维护了对象的数据存储着等数据也就是说通过对象可以获取大部分我们需要的数据了。

什么是OGNL表达式?

OGNL是Object Graphic Navigation Language 是操作对象属性的开源表达式。 Struts2框架使用OGNL作为默认的表达式语言。

为什么我们学习OGNL

在学习JSP的时候,我们已经学习过了EL表达式。EL表达式用起来也十分简单...我们在Struts2框架中也是可以使用EL表达式的...那么OGNL表达式好在哪里呢??

支持对象方法调用,如xxx.doSomeSpecial()

支持类静态的方法调用和值访问,表达式的格式【例如:"@@floor(10.9)"就是调用Math.floor()的方法了】

支持赋值操作和表达式串联【这个其实EL表达式也能做】

访问OGNL上下文(OGNL context)和ActionContext

操作集合对象【EL只能遍历集合,OGNL可以创建集合】

OGNL是Struts2的默认表达式语言,OGNL是配搭Strut2的标签使用的..我们学习了OGNL表达式,就可以更好地理解Struts2标签的运行以及Struts2内部的存储结构.

valueStack对象

在讲解OGNL表达式之前,我们先来看看valueStack对象...valueStack是Struts2数据存储的核心...我们首先要知道数据是怎么存的,存到哪里,然后才讲解OGNL表达式是怎么取出数据的

valueStack也被称作值栈对象..

当用户访问Action,都会创建一个Action对象,ActionContext对象、valueStack对象..

Struts2把Action对象放进valueStack对象之中

将valueStack放进request域中,传入JSP页面(key: struts.valueStack)

JSP页面就可以使用OGNL表达式获取值栈中的数据了

获取valueStack对象

在Action中我们可以手动获取值栈对象,有两种方式获取

</>复制代码

  1. //获取值栈对象的2种方式
  2. private void getVs() {
  3. // 获取值栈对象,方式1:
  4. HttpServletRequest request = ServletActionContext.getRequest();
  5. ValueStack vs1 = (ValueStack) request.getAttribute("struts.valueStack");
  6. // 获取值栈对象,方式2:
  7. ActionContext ac = ActionContext.getContext();
  8. ValueStack vs2 = ac.getValueStack();
  9. System.out.println(vs1 == vs2);//true
  10. }
valueStack内部存储结构

上面已经说了,用户访问Action时,会创建Action对象,valueStack对象。Struts2内部会将Action对象存到valueStack对象之中...那么valueStack的存储结构是什么样的呢???我们来看看

CompoundRoot

Action对象和Action的成员属性等值都是存到CompoundRoot下的.该CompoundRoot继承着ArrayList,因此它是List结构的

</>复制代码

  1. public class CompoundRoot extends ArrayList {}
OgnlContext

OgnlContext对象存储着相关的域对象:request、response、session等数据,实现Map集合,是Map结构..

为了让request、response等域对象可以存储多个值,值也是使用Map结构...

</>复制代码

  1. public class OgnlContext implements Map {}
小总结

CompoundRoot保存着这样的数据:

Action对象以及Action对象的成员属性数据

使用ValueStack对象.push()进去的数据

使用ValueStack对象.set()进去的数据

其他代理对象的数据

OgnlContext保存着这样的数据:

维护了CompoundRoot中所有的数据

request、response等域对象所有的数据

OGNL表达式取值

Struts2会将valueStack对象封装进request对象域中,传入JSP页面。

valueStack存储着OgnlContext对象。

OgnlContext对象维护了CompoundRoot对象的数据

CompoundRoot存储着Action等数据

也就是说通过OgnlContext对象可以获取大部分我们需要的数据了。

那么OGNL表达式是怎么取出OgnlContext对象中数据的呢??下面我们通过硬编码的方式来讲解

</>复制代码

  1. /**
  2. * 1. Ognl表达式语言语言取值,取非根元素的值,必须用#号
  3. * @throws Exception
  4. */
  5. @Test
  6. public void testOgnl() throws Exception {
  7. // 创建一个Ognl上下文对象
  8. OgnlContext context = new OgnlContext();
  9. // 放入数据
  10. User user = new User();
  11. user.setId(100);
  12. user.setName("Jack");
  13. // 【往非根元素放入数据, 取值的时候表达式要用"#"
  14. context.put("user", user);
  15. // 获取数据(map)
  16. // 先构建一个Ognl表达式, 再解析表达式
  17. Object ognl = Ognl.parseExpression("#user.name");
  18. Object value = Ognl.getValue(ognl, context, context.getRoot());
  19. System.out.println(value);
  20. }
  21. /**
  22. * 2. Ognl表达式语言语言取值,取根元素的值,不用带#号
  23. * @throws Exception
  24. */
  25. @Test
  26. public void testOgn2() throws Exception {
  27. // 创建一个Ognl上下文对象
  28. OgnlContext context = new OgnlContext();
  29. // 放入数据
  30. User user = new User();
  31. user.setId(100);
  32. user.setName("Jack");
  33. // 【往根元素放入数据】
  34. context.setRoot(user);
  35. // 获取数据(map)
  36. // 先构建一个Ognl表达式, 再解析表达式
  37. Object ognl = Ognl.parseExpression("address.province");
  38. Object value = Ognl.getValue(ognl, context, context.getRoot());
  39. System.out.println(value);
  40. }

也就是说,JSP页面中取出数据的时候,它会先构建一个OGNL表达式,再解析表达式

如果是CompoundRoot类的数据,表达式不需要带#号

如果不是CompoundRoot类的数据,表达式需要带#号

例子:

</>复制代码


  1. 1. 取根元素的值

  2. 2. 取非根元素的值


OGNL对静态方法的调用

</>复制代码

  1. /**
  2. * 3.Ognl对 静态方法调用的支持
  3. * @throws Exception
  4. */
  5. @Test
  6. public void testOgn3() throws Exception {
  7. // 创建一个Ognl上下文对象
  8. OgnlContext context = new OgnlContext();
  9. // Ognl表单式语言,调用类的静态方法
  10. //Object ognl = Ognl.parseExpression("@Math@floor(10.9)");
  11. // 由于Math类在开发中比较常用,所以也可以这样写
  12. Object ognl = Ognl.parseExpression("@@floor(10.9)");
  13. Object value = Ognl.getValue(ognl, context, context.getRoot());
  14. System.out.println(value);
  15. }
OGNL创建集合

</>复制代码


  1. 一、.构建 list集合

  2. 一、.构建 map集合

构建Map集合的时候,需要使用#号

OGNL 几个特殊的符号

#获取非根元素值 、 动态都建map集合
$ 在配置文件取值
% 提供一个ognl表达式运行环境

</>复制代码


  1. 获取request域数据



  2. 国家:

</>复制代码

  1. 如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68738.html

相关文章

  • 纳税服务系统【总结】

    摘要:要是使用到日历的话,我们想到使用这个日历类上面仅仅是我个人总结的要点,如果有错误的地方还请大家给我指正。 纳税服务系统总结 纳税服务系统是我第一个做得比较大的项目(不同于javaWeb小项目),该项目系统来源于传智Java32期,十天的视频课程(想要视频的同学关注我的公众号就可以直接获取了) 我跟着练习一步一步完成需求,才发觉原来Java是这样用来做网站的,Java有那么多的类库,页面...

    ispring 评论0 收藏0
  • Java3y文章目录导航

    摘要:前言由于写的文章已经是有点多了,为了自己和大家的检索方便,于是我就做了这么一个博客导航。 前言 由于写的文章已经是有点多了,为了自己和大家的检索方便,于是我就做了这么一个博客导航。 由于更新比较频繁,因此隔一段时间才会更新目录导航哦~想要获取最新原创的技术文章欢迎关注我的公众号:Java3y Java3y文章目录导航 Java基础 泛型就这么简单 注解就这么简单 Druid数据库连接池...

    KevinYan 评论0 收藏0
  • Struts2【UI标签、数据回显、资源国际化】

    摘要:值得注意的是的值是文件的全名也就是说,如果有包,就把包名写上并且,不需要写上后缀标签使用国际化的值是配置文件中配置的信息,写上就行了登陆测试注意,已经替换成了中文了如果文章有错的地方欢迎指正,大家互相交流。 Struts2UI标签 Sturts2为了简化我们的开发,也为我们提供了UI标签...也就是显示页面的标签..... 但是呢,Struts2是服务端的框架,因此使用页面的标签是需要...

    graf 评论0 收藏0
  • Struts 拦截器

    摘要:介绍实现的方式用于实现之前之后执行一般用于事物操作一般用于对某些未授权的页面访问的时候进行拦截操作拦截非法访问开箱即用拦截器拦截器传递属性拦截器测算执行时间必须有传递属性这个拦截器运行输出日志如下可以 介绍 实现aop的方式用于实现action之前,之后执行一般用于事物操作.一般用于对某些未授权的页面访问的时候,进行拦截操作,拦截非法访问. 开箱即用拦截器 ...

    roland_reed 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<