Struts2 Action原理
一、6大核心组件原理
6大核心组件作用
1、FC
前端控制器,负责统一的分发请求。
2、Action
业务控制器,负责处理某一类业务。
3、ValueStack
Action与JSP数据交互的媒介。
4、Interceptor
拦截器,负责扩展Action,处理Action的共通事务。
5、Result
负责输出的组件。
6、Tags
标签,负责显示数据、生成框体
Struts2中包含6大核心组件,它们彼此关联、相互协作,共同处理了一次请求。深刻的理解这6大核心组件的关系,实际上也就是理解了Struts2的基本原理。
二、Session获取
Struts2中获取Session的方式有3种,大家掌握其中任何一种都可以。
1、通过ActionContext.getContext().getSession()获得Session,
注意其返回类型为Map<String,Object>。
2、通过ServletActionContext.getRequest().getSession()获得Session,
其返回类型为HttpSession。
3、让Action实现SeesionAware接口,实现setSession方法,Struts2会在实例化Action后调用该方法,通过方法参数将Session对象注入进来。定义成员变量,接收注入进来的Session对象。
各种方式的对比
1、返回类型的对比
第1、3种方式,获取的Session是Map<String,Object>类型,Struts2采用该类型的目的是简化Session对象,而Session的存储结构和Map是一致的。
第2种方式,获取的Session是HttpSession,为了保持兼容性,Struts2提供了获取该类型的方式。
2、获取方式的对比
第1、2种方式,是我们主动的获取Session。
第3种方式,是采用注入的方式自动注入Session,这种方式是被动的。
3、推荐使用第3种方式
这种方式采用了注入的思想,更为灵活。并且是面向接口编程,符合主流的规范。
三、Result原理
Result是用于做输出的组件,用于向页面输出一些内容,转发、重定向可以理解为特殊方式的输出。每一个Result实际上就是一个类,这些类都实现了共同的接口Result,Struts2预置了10种类型的Result,他们被定义在struts-default.xml中 。
常用类型的Result
1. dispatcher
dispatcher类型是用于转发的Result,可以将请求转发给JSP。这种类型的Result对应的类为ServletDispatcherResult,它是Struts2默认的Result类型,该默认行为是定义该Result时,通过default="true"指定的 。
在此之前,我们使用的Result都是这种默认的dispatcher类型的Result。
2. redirectAction
redirectAction类型是用于将请求重定向给另外一个Action,这种类型Result对应的类为ServletActionRedirectResult 。
四、streamResult&图片验证码
stream
stream类型是用于向页面输出二进制数据,这种类型的Result,可以将二进制数据输出到请求发起端, 它会自动创建输出流,接入Action中定义的输入流并将其输出。
语法
<result name=”success” type=”stream”>
<param name=”inputName”>codeStream</param>
</result>
type=”stream”中的stream,引用的是Struts2在
struts-default.xml中定义的result的名称,是固定写法。
name=”inputName”中的inputName,指的是该result对应的类StreamResult中的属性,用意是要为其属性赋值,是固定写法。
codeStream指的是Action中某属性名,该属性需为InputStream类型,这里的写法不固定,看属性名而定。
使用步骤:
1、在Action中,定义InputStream类型的输出属性 。
2、在struts.xml中,配置该Action。
3、在action下,配置stream类型的result。
笔者将在下一节演示验证码的生成和获取,请继续关注!