一、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;前端
二、这个请求通过一系列的过滤器(Filter)(这些过滤器中有一个叫作ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其余框架的集成颇有帮助,例如:SiteMesh、Plugin);java
三、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否须要调用某个Action(2.1.3开始核心控制器是StrutsPrepareAndExecuteFilter);apache
四、若是ActionMapper决定须要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;json
五、ActionProxy经过Configuration Manager询问框架的配置文件,找到须要调用的Action类;浏览器
六、ActionProxy建立一个ActionInvocation的实例。安全
七、ActionInvocation实例(它应该对应到具体的Method<不肯定>)使用命名模式(里面声明了一个接口,接口里面只有一个方法,使用到命名模式的主方法传入的“命令”就是这个接口参数,主方法直接调用接口里面的这个方法就行)来调用,在调用Action的过程先后,涉及到相关拦截器(Intercepter)的调用。服务器
八、一旦Action执行完毕,ActionInvocation负责根据struts、xml中的配置找到对应的返回结果。返回结果一般是(但不老是,也多是另外的一个Action链)一个须要被表示的JSP或者FreeMarker的模版。在表示的过程当中可使用Struts2框架中继承的标签。在这个过程当中须要涉及到ActionMapper。session
第二个加载的是一批配置文件app
Strtus-plugin.xml 插件的配置声明框架
当一个请求来时,若是查找不到指定的class及对应的method就会执行ActionSupport类中的execute方法。
能够直接在strtus.xml文件中定义常量 (推荐)
模型驱动
1.让Action类要实现一个指定接口ModelDriven
2.实例化模型对象(就是要new出来javaBean)
3.重写getModel方法将实例化的模型返回。
属性驱动
直接在action类中提供与请求参数匹配属性,提供get/set方法
若是从根中获取数据,不须要添加#号,若是不是从根中获取,须要#
在struts2框架中咱们使用ognl表达式的做用是从valueStack中获取数据
想在jsp页面上使用ognl表达式,就须要结合struts2框架的标签,<s:property value=”表达式”>来使用
咱们使用valueStack的主要目的是为我将咱们action中产生的数据携带到页面上,也就是说valueStack它就是一个容器,接口,。咱们主要使用的是它的实现类com.opensymphony.xwork2.ognl.OgnlValueStack,struts2框架将valueStack保存在request中。
当客户端向咱们发送一个请求,服务器就会创始一个Action来处理请求,struts2中的action是一个多例,每一次请求都会有一个新的action对应。因此它不存在线程安全问题。
request---ActionContext----Action-----ValueStaci它们都对应着一次请求(一个线程).
第一种方式:能够直接经过request对象来获取.
第二种方式:使用ActionContext来获取
ActionContext它是action上下文,strtus2框架它使用actionContext来保存Action在执行过程当中所须要的一些对象,例如 session, application…
ActionContext的获取 是经过它的静态方法getContext()获得。
Struts2会根据每一次的http请求来建立对应的ActionContext,它是与当前线程绑定的。
每一次请求,就是一个线程,对应着一个request,每一次请求,会建立一个Action,每个action对应一个ActionContext.每一次请求也对应着一个valueStack.
request---ActionContext----Action-----ValueStaci它们都对应着一次请求(一个线程).
问题:为何el表达式能够从valueStack中获取数据?
org.apache.struts2.dispatcher.StrutsRequestWrapper
Struts2框架对request进行了加强,重写了getAttribute方法,若是在request域中查找不到数据,就会在valueStack中获取。
com.opensymphony.xwork2.interceptor.Interceptor
在配置文件中声明Interceptor
咱们也能够将多个interceptor封装成一个stack
能够在Action的配置中引入本身的interceptor
注意:当咱们显示的引入了一个自定义的Interceptor,那么默认的defaultStack就不会在导入,须要手动导入
表单提交方式method=post
表单中必须有一个<input type=”file”>组件
表单中必须设置enctype=”multipart/form-data”
若是对Date类型进行格式化输出
关于属性是否生成在json串中设置
设置如期
过滤属性
将咱们本身配置文件中的<package extends=”json-default”>
Action的返回视图<result name=”” type=”json”>配置了上面两步,那么struts2框架就会将valueStack中的栈顶元素转换成json响应到浏览器
在action的配置中引用