Struts2的根本
1.Struts的数据传输
1.1 如何将参数从界面传递到Action?
- 在jsp中提供名称
- 在action中有和该jsp对应的属性名称,并且有getter和setter方法
- 对于表单对象,我们可以使用模型驱动的方式,继承ActionSupport和实现ModelDriven接口,(好像非表单对象也是可以的,前提是对象存在该属性),User user = new User(),并提供get、set方法
1.2 如何将数据从Action传输到JSP?
- 通过Action属性传输
- 该方式使用的是默认方式,属性提供get和set方法
- 我们就可以在对应的jsp通过
<s:property value="name"/>
获取到
Struts执行过程–主要是分析StrutsPrepareAndExecuteFilter
1.请求示意图
2. 一个请求在Struts2框架中的处理步骤:
- 客户端初始化一个指向Servlet容器的请求
- 根据web.xml配置,请求先经过ActionContextCleanUp过滤器,主要清理当前线程中ActionContext和Dispatcher
- 请求经过插件过滤器(该步可以略过)
- 请求经过StrutsPrepareAndExecuteFilter核心过滤器,执行doFilter方法,在该方法中,询问ActionMapper来决定这个请求是否需要调用Action
- 如果ActionMapper决定调用某个Action,则ActionMapper会返回一个ActionMapping实例(存储Action的配置文件),并创建ActionProxy(Action代理)对象,将请求交给代理对象继续处理
- ActionProxy对象根据ActionMapping和Configuration Manager询问框架的配置文件,找到需要调用的Action类
- ActionProxy对象创建时,会同时创建一个ActionInvocation的实例
- ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器的调用
- 一旦Action执行完毕,ActionInvocation实例负责struts.xml中的配置创建并返回到result结果视图,result通常是一个需要被表示的JSP或者FreeMarker的模板,也可能是另外的一个Action链
- 如果要在返回result之前做些什么,可以实现PreResultListener接口,PreResultListener可以在Interceptor中实现,也可以在Action中实现
- 根据Result对象信息,生成用户响应信息response
源码分析(根据上面的步骤)
服务器启动阶段
- 服务器启动后,进入web.xml,跳进配置的核心过滤器StrutsPrepareAndExecuteFilter
- 类内部首先是三个变量的声明