Struts2_ValueStack,OGNL详解

本文详细介绍了Struts2框架中ValueStack的作用、生命周期及内存结构,以及如何通过OGNL表达式操作ValueStack,包括获取、存储和访问数据的方法,并解释了OGNL的基本概念和使用场景。

引言: 闲话不多说,最近项目结束,天天泡在CSDN论坛上,不乏看到一些好的文章,在此与君共勉...

原文地址:http://blog.csdn.net/wyply115/article/details/8257140 ,有兴趣的朋友可以去他博客学习学习...

 

一、ValueStack
    1
.ValueStack是一个接口,在struts2中使用OGNL(Object-Graph Navigation Language)表达式实际上是使用
        实现了ValueStack接口的类OgnlValueStack.它是ValueStack的默认实现类.
   2.ValueStack贯穿整个action的生命周期,每一个action实例都拥有一个ValueStack对象,其中保存了当前action对象和其他相关对象.

    3.struts2把ValueStack对象保存在名为:struts.valueStack的request域中.即ValueStack作用域为request.当action创建的时候,ValueStack就创建了,action被销毁的时候,ValueStack就销毁了

    4.ValueStack中的数据分两部分存放:root(栈结构,CompoundRoot)和context(map形式,OgnlContext)
         (1)    * 其中的root对象是CompoundRoot,CompoundRoot继承了ArrayList,提供了额外的方法:push(),和pop()方法,
                 用来对root对象中所包含的数据进行存取.正是由于这两个方法,CompoundRoot变成了一个栈结构.
            * struts2中,一个请求在最终到达Action的方法之前,Action对象本身会被压入ValueStack(实际上就是放到ValueStack
                的CompoundRoot中),所以action对象是CompoundRoot中的一个元素.
        (2)* 其中的context对象是OgnlContext,它实现了map接口,在valuestack的默认实现类中,即OgnlValueStack类中,
                调用ongl中的方法:Ognl.createDefaultContext(..)给context赋值,查看源代码可知,
                此方法返回的是一个OgnlContext对象.
    5.获取ValueStack的三种方式
        (1)ValueStack valueStack = ActionContext.getContext().getValueStack();   
                ActionContext为Action的上下文,其中有重要的6大对象
                    * valueStack,parameters,request,session,application,attr
                    * 而ognl表达式必须选择AcitonContext中的一个对象作为根对象(root),默认为valueStack,因此访问valueStack中的数据不加#
                        而如果要使用另外5个对象作为根对象,需要加#前缀.
        (2)ValueStack valueStack = ServletActionContext.getValueStack(ServletActionContext.getRequest());       
                ServletActionContext继承了ActionContext,它与web容器耦合,可以获取web容器的一些信息.

        (3)ValueStack valueStack = (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");

    6.ValueStack内存结构图

    7.常用的存储数据的方法
        (1)向map栈中存数据,即ValueStack中的context(OgnlContext)
            * 通过request,session等向map中存储数据
                ServletActionContext.getRequest().setAttribute("username","joey");
                ServletActionContext.getSession().put("pwd","123");
            * 直接向map栈中放数据
                ActionContext.getContext().put("msg","how you doing");   
        (2)向对象栈中存数据,即ValueStack中的root(CompoundRoot)对象
            * 先得到root,再把数据压入到root中,这中方式是放入到栈底.
                ValueStack valueStack = ActionContext.getContext().getValueStack();
                valueStack.getRoot().add(new Person());
            * 先得到root,利用add(index,Object)把一个对象压入到root中指定位置.
                ValueStack valueStack = ActionContext.getContext().getValueStack();
                valueStack.getRoot().add(0,new Person());//这里0,表示压入栈顶.
            * 存放一个map到对象栈中
                ValueStack valueStack = ActionContext.getContext().getValueStack();
                valueStack.set("msg","dude"); //先封装成Map,在把Map放入到对象栈中,且放入栈顶.
            * 利用valueStack的push方法把一个对象直接压入栈顶
                ValueStack valueStack = ActionContext.getContext().getValueStack();
                valueStack.push(new Person());

   8.利用OGNL表达式取ValueStack中的数据
        (1)<s:property />:取栈顶的元素.
        (2)<s:iterator />:取栈顶的元素.
            注意:此标签的value属性值无论来自对象栈还是Map栈,都可以不加#前缀(<s:select/>标签也适用).
                因为此标签在迭代的时候,总是把当前正在迭代的元素放入到栈顶.

二、ognl
    1
.ognl是struts2中使用的一种表达式语言,可用于jsp的标签库中,以方便访问各种对象的属性.
        它用于把界面的参数传递到Action中(并进行类型转换),它还可以用于struts2的配置文件中.
    2.Root对象
        OGNL称为对象图导航语言,所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象.
        例如:

  1. public class User{ 
  2.     private String username; 
  3.     private Group group; 
  4.     //省略setter,getter方法 
  5. public class Group{ 
  6.     private String name; 
  7.     private Organization org; 
  8.     //省略setter,getter方法 
  9. public class Organization{ 
  10.     private String orgId; 
  11.     //省略setter,getter方法 
	public class User{
		private String username;
		private Group group;
		//省略setter,getter方法
	}
	public class Group{
		private String name;
		private Organization org;
		//省略setter,getter方法
	}
	public class Organization{
		private String orgId;
		//省略setter,getter方法
	}


        以上三个类,描述了通过一个User对象,同过User对象可以导航到Group对象,进而导航到Organization对象.
            以User为根,通过基本的getters方法,可以访问到此根对象的其它关联对象.【对象图的导航,必须通过getters方法导航】
        注意:    * 导航的目的,就是为了获取某个对象的值或设置某个对象的值或调用某个对象的方法.
            * OGNL表达式语言的真正目的,是为了在那些不能写java代码的地方执行java代码,或者是为了更方便的执行java代码.
    3.Context对象
        * 在OGNL表达式中,有可能需要访问到多个毫不相干的对象,这时候,我们需要给OGNL传递一个Map类型的对象,把表达式中需要用到的对象放到
            Map中即可.而这个Map对象称为Context
        * 要在表达式访问到context中的对象,需要使用"#对象名称"的语法规则.
        * 存在context的主要原因就是在OGNL中,不支持多个root对象,而如果需要在表达式中访问多个毫不相关的对象时,
            只能通过一个Map来把这些对象统一传递给OGNL.

内容概要 本资源是一套完整可运行的 Qt Widgets 批量图片压缩桌面工具源码,基于 Qt5/C++ 从零开发,专为初学者设计,分步实现图片批量处理全套功能。工具支持多选单张图片、直接读取整个文件夹内所有 JPG/PNG 图像,可自定义输出图片分辨率、调节 JPG0~100 区间压缩质量,自带锁定宽高比防拉伸变形功能;批量处理完成后自动统计每张图片压缩前后文件体积,计算整体压缩缩小比例,直观展示压缩效果。 适用人群 Qt/C++ 零基础初学者,学习 QImage 图像绘图、文件目录遍历、UI 交互开发; 需要本地批量处理图片的办公、设计、自媒体从业者; 想要学习图片缩放、JPG 压缩、本地文件 IO、进度条交互的开发学习者。 使用场景 自媒体批量压缩配图,降低图片体积节省上传流量; 摄影、设计批量统一图片尺寸,批量轻量化相册图片; 程序开发学习:QFileDialog 文件选择、QDir 文件夹遍历、QImage 缩放保存、QSlider 参数联动、批量循环界面防卡顿、文件大小格式化转换全套 Qt 图像开发实战案例。 工具核心功能清单 双模式导入图片:手动多选单张图片 / 一键读取整个文件夹全部图片; 自定义输出宽高分辨率,支持锁定原始宽高比,避免图片拉伸变形; 滑块调节 JPG 压缩质量 0~100,平衡图片清晰度与文件占用大小; 自定义输出保存目录,批量生成压缩后的图片文件; 实时进度条展示处理进度,循环中刷新界面,程序不会假死卡顿; 自动统计每张图片压缩前后体积,换算 KB/MB 直观展示; 批量完成弹窗汇总:图片总数、成功数量、单张大小对比、整体压缩节省空间比例; 完整模块化代码,功能拆分清晰,每段代码附带详细注释,新手可分步拆解学习。 其他说明 开发环境:Qt Creator + Qt5.15 MSVC,Windows 平台可直接编译运行; 源码结构清晰,功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值