1,Struts2框架主要组件的处理流程

在说ValueStack之前,笔者先说一说Struts2中常用的组件,struts2中常用组件有strutsPrepareAndExecuteExceptionn,以及一般执行流程:

  1. 请求来进入 Filter 控制器
  2. Filter 控制器创建 ValueStack 对象并初始化
  3. Filter 控制器根据 struts.xml 调用 defaultStack 拦截器栈
  4. Filter 控制器根据 struts.xml 调用 Action 处理
  5. Filter 控制器会根据 Action 返回值 +struts.xml 调用 Result 处理
  6. Filter 控制器销毁 ValueStack 对象信息
  7. Filter 控制器将 Result 生成的响应信息输出

想必搭建过Struts2框架的读者都知道上面的过程的类几乎都是需要我们在搭建的时候就进行配置。但是ValueStack对象的配置我们并没有显示指定出来,为了研究struts2中反射,我们打开struts-default.xml文件,找到里面的params拦截器(这是struts2框架中所有默认执行拦截器的一种,主要完成对参数的赋值和取值功能),找到它关联的类(ParametersInterceptor)。打开ParametersInterceptor的原码后我们可以在里面看到ValueStack。ValueStack其实是一个接口,其实现子类只有一个OgnlValueStack类。再继续剖析OgnlValueStack类,我们可以看出这个类其实是对OGNL工具包的包装。OGNL是一个封装了反射操作的工具包,因此Struts2底层参数赋值的反射操作是通过使用OGNL这个工具包来完成的。

Struts2中的ValueStack不仅仅用于参数方面,它是用于存储request,session,application,action,parameters等请求相关的数据对象。

下面通过一张图片了解一下ValueStack看一看:

通过这张图片,我们可以非常清楚的了解到valueStack是基于OGNL工具包的,并且valueStack存储数据的形式分为两种root好context。root是ArrayList栈结构,并且Action对象是最后压入栈的,所以Action对象永远在栈的最顶部。另一种存储数据的结构是Context,它和root不同,context是一种map结构。

2,OGNL工具的使用

OGNL是Object Graphics Navigation Language 的简写,是一种对象图导航语言。

上面介绍了ValueStack是基于OGNL工具的,如果说我们也想使用OGNL做一些封装,那么首先应该导入ognl.jar包和javassist-GA.jar包。

Ognl.getValue("OGNL 表达式 ",context,root)
Ognl.getValue("OGNL 表达式",context);
Ognl.getValue("OGNL 表达式",root);Ognl.setValue("OGNL 表达式 ",context,root,value)
Ognl.setValue("OGNL 表达式",context,value);
Ognl.setValue("OGNL 表达式",root,value);

在有context和root的语句中,可以使用OGNL表达式加以区分操作的对象,如果以#开头表示在context中操作数据,如果不以#开头表示在root中操作数据。

User.java文件

package cn.ongl.test;public class User {private int id;private String userName;private String userPassword;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getUserPassword() {return userPassword;}public void setUserPassword(String userPassword) {this.userPassword = userPassword;}}

User.java

接下来看一看测试:

    @Testpublic void testName() throws OgnlException{User user=new User();user.setId(1);user.setUserName("jame");user.setUserPassword("123456");Object root=user;Map<String,Object> context=new HashMap<String,Object>();context.put("userName","brace");//设置为userName,表示将root中userName属性值设置为lucyOgnl.setValue("userName",context,root, "lucy");//从root中获取userName字段的值String uname= (String)Ognl.getValue("userName",context,root);System.out.println(uname);//lucy//从context中获取userName的值uname=(String)Ognl.getValue("#userName", context, root);System.out.println(uname);//brace//设置为#userName,表示将context中userName属性值设置stevenOgnl.setValue("userName",context,"steven");//从root中获取userName属性字段的值uname=(String)Ognl.getValue("userName", context, root);System.out.println(uname);//lucy//从context中获取userName字段的值uname=(String)Ognl.getValue("#userName", context,root);System.out.println(uname);//steven}

接下来模拟一下请求参数给struts2中Action对象赋值的过程:

        Enumeration<String> parameterNames = request.getParameterNames();//将所有的参数和值封装到parameter中去Map<String,String> parameters = new HashMap<String,String>();String value;String nextElement;/** 循环遍历,将请求的参数以key-value的形式封装到Map集合 */while(parameterNames.hasMoreElements()){nextElement = parameterNames.nextElement();value=request.getParameter(nextElement);parameters.put(nextElement, value);}//循环访问请求参数,给Action对象中同名的属性赋值User root = new User();Set<String> keys = parameters.keySet();for(String key:keys){try {Ognl.setValue(key, root, parameters.get(key));} catch (OgnlException e) {e.printStackTrace();}}//打印root对象值System.out.println(root.getId()+" "+root.getUserName()+" "+root.getUserPassword());

在上面的请求中,我们只需要得到request,我们也可以完成一个简单的框架自动赋值映射的功能了。

Ognl.getValue("OGNL 表达式",context);

转载于:https://www.cnblogs.com/HDK2016/p/7348220.html

【Struts2】剖析Struts2中的反射技术 ValueStack(值栈)相关推荐

  1. Struts2的ValueStack(值栈)介绍

    1.在之前写的一些文章中,有用到<s:debug></s:debug>这个Struts2自带的标签,会在jsp页面中产生一个Debug按钮,点击这个按钮时,就会出现ValueS ...

  2. 深入理解Java中的反射技术

    Java中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法:并且对于任意一个对象,都能够调用它的任意一个方法:这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射 ...

  3. Struts2——(3)ValueStack(值栈)

    一.ValueStack 主要用于存储请求相关信息,内部结构如下 root区:被称为根存储区,是一个栈结构,栈顶元素为当前请求的Action对象. context区:被称为变量存储区,是一个Map结构 ...

  4. 深入分析JavaWeb Item48 -- Struts2中OGNL表达式与ValueStack

    一.OGNL表达式 1.OGNL表达式介绍 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. Struts2框架使用OGNL作 ...

  5. struts2中的值栈对象ValueStack

    ValueStack, 即值栈对象. 值栈对象: 是整个struts数据存储的核心,或者叫中转站. 用户每次访问struts的action,都会创建一个Action对象.值栈对象.ActionCont ...

  6. Struts2数据传输的背后机制:ValueStack(值栈)

    1.     数据传输背后机制:ValueStack(值栈) 在这一切的背后,是因为有了ValueStack(值栈)! ValueStack基础:OGNL 要了解ValueStack,必须先理解OGN ...

  7. 关于Struts2中的值栈与OGNL表达式

    1.1.1    OGNL概述: Object Graphic Navigation Language(对象图导航语言)的缩写 * EL     :OGNL比EL功能强大很多倍. 它是一个开源项目. ...

  8. 反射创建对象_如何应用Java反射技术灵活地创建程序类的对象实例

    软件项目实训及课程设计指导--如何应用Java反射技术灵活地创建程序类的对象实例 1.如何应用属性配置文件实现对系统中的配置信息进行读写操作 Java中的属性配置文件主要可以作为软件应用系统及项目的配 ...

  9. struts2值栈、struts2标签、ONGL表达式、EL表达式、JSTL表达式、jsp标签

    1.struts2值栈: 参考:https://blog.csdn.net/superit401/article/details/83994149 (1) ValueStack是Struts2的一个接 ...

  10. java中的反射机制是什么

    给大家介绍一下java中的反射机制,java中反射机制更体现出了java的灵活性.多态.和类之间的耦合性. 1:反射是一种间接操作目标对象的机制,只要给定类的名字,就可以通过反设机制获取所有的类信息. ...

最新文章

  1. mysql正在加载_本地坏境或者服务器环境下phpmyadmin出现始终正在加载问题的解决方法...
  2. AI零基础入门之人工智能开启新时代—下篇
  3. SQLServer存储过程的返回值 查询分析器/程序
  4. 在浏览器中进行深度学习:TensorFlow.js (一)基本概念
  5. golang go mod包管理
  6. matlab在统计学中的简单应用
  7. 中国电信:全业务IP网络的安全运营
  8. WAV文件格式终极解析
  9. hadoop yarn 获取日志_「大数据」「Hadoop」-安装及数据目录
  10. [引]VS2005 主题(Theme)和外观(skin)帮助文档:主题和外观概述
  11. 3D视觉创新方案分享:仓储VSLAM/商品三维重建/静态场景重建/表情识别等多个方向...
  12. cl.exe is unable to create an executable file
  13. java中的字符串处理
  14. 斐讯路由刷华硕固件后指示灯颜色修改
  15. win10 clion msvc opencv4.10 报错Process finished with exit code -1073741515 (0xC0000135)
  16. 国际化批量获取en-US.json,zn-CN.json字典内容
  17. Ubuntu 无法连接网络
  18. 虚拟服务器共享文件夹禁用,虚拟机共享文件夹禁用,vm虚拟机共享文件夹
  19. 【卡尔曼滤波】离散线性系统的卡尔曼滤波
  20. 华为m2青春版刷机android6,华为揽阅M2青春版(PLE-703L)一键救砖教程,轻松刷回官方系统...

热门文章

  1. jmeter html插件,Jmeter最常见的几个插件(一)
  2. echo输出大花括号 php_PHP的echo输出内容过多会很慢
  3. 散粉在哪个步骤用_无限回购的散粉
  4. EnvironmentLocationNotFound: Not a conda environment:
  5. tensorflow2.0内存溢出解决办法
  6. Python实现多变量序列堆叠式LSTM模型,并实现未来多时刻预测
  7. 2021-07-04应用的生命周期
  8. 搭建SpringMVC详解
  9. 区块容量 以太坊 比特币
  10. function signature是什么