003--struts2原理
2015-07-30 15:19
639 查看
struts2原理
1、struts原理
1.1、整体结构
官方站点提供的Struts 2 整体结构的图1.2、Struts2框架处理请求的基本步骤
1、客户端提起一个(HttpServletRequest)请求。如在浏览器中输入”http://localhost:8080/TestMvc/add.action”就是提起一个(HttpServletRequest)请求。2、请求被提交到一系列(主要是三层)的过滤器(Filter)。先ActionContextCleanUp,再其他过滤器(SiteMesh等),最后到FilterDispatcher。
3、FilterDispatcher是控制器的核心,就是mvc中c控制层的核心。FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个(request)请求(如在struts.properties配置接受何种后缀的url),如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。
4、ActionProxy通过Configuration Manager(struts.xml)询问框架的配置文件,找到需要调用的Action类。ActionProxy创建一个ActionInvocation的实例。
5、ActionInvocation通过代理模式调用Action。但在调用之前ActionInvocation会根据配置加载Action相关的所有Interceptor。
6、ActionInvocation处理好结果后返回用户。
2、ongl表达式
2.1、简介
OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图。2.2、结构图
stuts2的ongl结构图:OGNL标准结构有3个重要组成部分,一个OGNL引擎,一个是root对象,另一个是context对象。
注意:访问context区域需要使用"#"前缀。
2.3、操作
a.可以访问对象属性基本类型属性:属性名,如:id
数组类型属性:属性名加下标,如:roles[0]
List类型属性:属性名加下标,如:organs[0]
Map类型属性:属性名加key,如:role_modules.key 或者 role_modules['key']
b.可以访问对象的方法
id.toString()
c.可以访问静态常量和方法
@java.lang.Math@PI
d.可以访问集合中的数据,进行集合过滤等操作
"persons.{?#this.age>20}" : 返回persons集合中,满足age>20的所有元素.
?指的是返回所有满足条件的元素
^指的是返回第一满足条件的元素
$指的是最后一个满足条件的元素
e.支持Java中的运算符和表达式
\"name\"+name,
id+10
f.定义一个List和Map类型的常量
List常量:{1,2,3}
Map常量:#{'age':20,'name':\"tom\"}
2.4、应用
1)OGNL在xwork中进行了改造xwork将OGNL中的root对象进行了改造,将其改造成了一个栈结构,类型是CompountRoot继承自ArrayList.在访问root属性时,从栈顶对象向下依次查找,找到属性值返回.
2)ValueStack结构
ValueStack是Struts2中非常重要的数据对象,当客户发送一个请求后,控制器会根据当前请求创建一个ValueStack,并将请求处理相关的数据进行填充.
root栈:存放当前请求对应的Action对象(栈顶)
context(Map):存放request,session,application,parameters等信息
3)JSP获取业务数据,需要使用Struts标签+OGNL表达式技术组合
相关文章推荐
- java技巧之我要关窗口
- Java compiler level does not match解决方法
- 秘Java虚拟机——内存管理与垃圾回收
- Java中int类型和tyte[]之间转换及byte[]合并
- CMD下编译运行Java包文件
- 细小知识点之Spring
- eclipse的快捷键--收藏
- 为什么java局部变量没有初始化就会报错,而成员变量没有初始化就不会报错?
- eclipse中启动项目报内存溢出问题通过修改配置解决
- Java构造函数链
- java 二叉树的实现与先序遍历和层次遍历
- java获取动态代理的target目标
- 黑马程序员_Java基础:JDK1.5后的新特性:自动拆装箱,以及注意事项
- 在eclipse中创建android工程
- java web 开发(二)
- Spring4的IoC和DI的区别
- 回调函数透彻理解Java
- JAVA代码获取月份的第一天跟最后一天
- eclipse中不能找到dubbo.xsd解决方法
- 使用Eclipse_Memory_Analyzer进行内存泄漏分析三部曲