学习参考资料:
主:
辅:
一本《深入浅出Struts2》
一本《Struts2技术内幕》
注:笔者会不断修改完善,因为刚开始记笔记,时间比较紧
笔记方法:问题——答案式;
学习策略:先以运行相关具体内容为主,再进行抽象理论描述
**第一问:Struts 2是什么?**
1、Struts2运行框架和核心组件
Struts 2角度:Struts 2运行的框架结构图
Struts 2的五大核心组件分别是:
Actions
Interceptors
Value Stack/OGNL
Results/Results Types
View Technologies
MVC角度:Struts2实现MVC的比较具体的运行结构图:
PS:第一张图对Request生命周期的描述才是完整的!
Action介绍:
关键词:映射 数据类型转换 Result
Action是Struts2框架的核心,每一个URL都会被映射到一个具体的Action(URL是从V层,如一个登录界面发过来的,Action是M层,所以这种映射就是实现V层和M层的映射),这个具体的Action提供了服务来自客户端的Request的必要的处理逻辑(即处理方法,如execute)。
Action提供了另外两个重要的功能:数据类型转换和决定哪一个视图作为响应返回给客户端。
数据类型转换是指:来自Request的数据类型,转换成响应的那个视图的数据类型,也就是判断是JSP类型还是其他的Result Types。
决定哪一个视图作为响应返回给客户端就是:Result是什么。和URL有映射关系的那个Action中有一个execute方法,方法里有一个选择条件语句——用以判断返回的视图是哪一个,execute方法执行完后会返回一个result。这个Result对应于struts.xml文件中的result元素,这个元素的值就就是要返回给客户端的视图。注意:Action中的方法有一个返回的结果(result),配置文件struts.xml有一个result标签。
PS:这三个要点很集中。但需要把它们细分出来。
Interceptors介绍:
拦截器从概念上讲,就像Servlet过滤器或者JDK里的代理类(设计模式里有一个模式叫代理模式)。
Interceptor可以独立于Action实现交叉功能。用Interceptor可以实现:
Action调用前提供预处理逻辑;
Action调用后提供后处理逻辑;
捕捉异常从而实现交替处理。
Struts2提供的许多特点都是由拦截器实现的:比如异常处理,文件上传,生命周期回收,验证器。Struts2的许多功能都基于拦截器,所以一个Action分配有7、8个拦截器是很常见的。
Struts2提供了一系列配置好了的拆箱即可使用的拦截器,以下是其中一部分:
alias
checkbox
conversionError
creatSession
debuggin
execAndWait
exception
fileUpload
……
拦截器的使用:只需将拦截器配置在struts.xml文件中的action元素下。
Result Types介绍
在Struts MVC框架中,struts.xml文件中的Result标签代表着V层。动作负责执行业务逻辑,之后便是使用Result标签展示V。Result标签是Action标签的子标签,对应着的是Action类有返回的result。
result标签通常带有一些导航规则。比如用户登录有三种结果,1.登陆成功;2.登录失败——用户名或密码不正确;;3.账号锁定。这种情况下,Action的方法就会有三种可能的字符串输出,result有三种对应的值——也就是三种V,来实现响应。
Result中我们不一定要用JSP类型的文件作为响应发送给客户端。MVC范式的目的是实现层与层之间的分离和高度可配置的。Result标签的默认Type是dipatcher,用来分发JSP页面,当然你也可以用其他的标记语言来作为result type。
Value Stack值栈介绍:
值栈,是一些对象构成的集合,它按照以下顺序保存了以下对象:
1、临时对象。页面执行期间会有很多临时的对象。比如通过JSP标签循环的集合的当前迭代值。
2、模型对象。如果你在Struts2中使用模型对象Model Objects,action出现在值栈之前模型对象就会被放置在这里。
3、Action对象。就是正在被执行的当前的action对象。
4、指定的对象。比如#application,#session,#request,#attr和与servlet scope相应的#parameters。
如第二张图所示:可以通过提供给JSP、Velocity、FreeMarker的标签来set值栈。而Action可以通过get方法来获取值栈对象。值栈提供了一些方法来操作值栈对象。
OGNL对象图形导航语言介绍:
这种强大的表达语言用于引用和操作值栈里的数据。它还可以帮助数据传输和类型转换。
OGNL和JSP的EL很相似。OGNL基于上下文有一个根或者一个默认对象的思想。根对象的属性可以通过#这个标记符号来引用。
struts2为OGNL的使用建立了一张ActionContext图,这张ActionContext图包括以下部分:
application:application范围内的变量
session: session范围内的对象
root/value stack: 所有的action对象的变量都存储在这里
request: request范围内地变量
parameters:request参数
attributes:属性存储在page、request、session和application范围内。
理解action对象始终在value stack中这一点是很重要的。所以,如果你的action对象有属性x、y,那么它们就准备好可以被你使用了。
ActionContext里的对象可以通过#标记符号来访问,而值栈中的对象可以直接访问。
OGNL同样支持处理集合——Map,Set,List。