一、Struts2的工作原
上图来源于Struts2官方站点,是Struts 2 的整体结构。
一个请求在Struts2框架中的处理大概分为以下几个步骤
1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求
2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
6 ActionProxy创建一个ActionInvocation的实例。
7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper
在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。
一个请求在Struts2框架中的处理大概分为以下几个步骤
1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求
2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
6 ActionProxy创建一个ActionInvocation的实例。
7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper
在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。
二、
Core(The IoC container)和AOP 只是Spring 框架中的一部分。
Spring 对JDBC 的整合,属于DAO。
如上所示,Spring 的功能共6 大模块。(请查看Spring帮助手册)
1) Core 封装包是Spring 框架的最基础部分,提供Ioc 和(DI)依赖注入。
2) DAO 提供了JDBC 的抽象层。还有注解声明类型的事务管理方法。
3) ORM 该封装包提供了常用的“对象/关系”APIs。我们频繁使用的是Hibernate,除此之外还可以整合JPA、JDO、iBatis 等。
4) AOP 提供了符合AOP 规范的面向切面的编程实现
5) Web 该封装包提供了基础的针对web 开发的集成特性。此外Spring 也提供了一种MVC 实现。spring-mvc\struts\jsp\jsf
6) J2EE 一般使用较少。提供了EJB、JMS、Email 等集成。Spring 可以将发送邮件等功能整合。
Spring 对JDBC 的整合,属于DAO。
如上所示,Spring 的功能共6 大模块。(请查看Spring帮助手册)
1) Core 封装包是Spring 框架的最基础部分,提供Ioc 和(DI)依赖注入。
2) DAO 提供了JDBC 的抽象层。还有注解声明类型的事务管理方法。
3) ORM 该封装包提供了常用的“对象/关系”APIs。我们频繁使用的是Hibernate,除此之外还可以整合JPA、JDO、iBatis 等。
4) AOP 提供了符合AOP 规范的面向切面的编程实现
5) Web 该封装包提供了基础的针对web 开发的集成特性。此外Spring 也提供了一种MVC 实现。spring-mvc\struts\jsp\jsf
6) J2EE 一般使用较少。提供了EJB、JMS、Email 等集成。Spring 可以将发送邮件等功能整合。
三、
Servlet过滤器和生命周期
servlet的生命周期 ***
所谓生命周期,指的是servlet容器如何创建servlet实例、分配其资源、调用其方法、并销毁其实例的整个过程。
阶段一: 实例化(就是创建servlet对象,调用构造器) 在如下两种情况下会迚行对象实例化。
第一种情况:当请求到达容器时,容器查找该servlet对象是否存在,如果丌存在,才会创建实例。
第二种情况: 容器在启 劢时,戒者新部署了某个应用时,会检查web.xml当中,servlet是否有 load-on-starup配置。如果有,则会创建该servlet实例。
load-on-starup参数值越小,优先级越高(最小值为0,优先级最高)。
阶段二: 初始化 为servlet分配资源,调用init(ServletConfig config);方法 config对象可以用来访问servlet的初始化参数。 初始化参数是使用init-param配置的参数。 init可以override。
阶段三: 就绪/调用 有请求到达容器,容器调用servlet对象的service()方法。 HttpServlet的service()方法,会依据请求方式来调用doGet()戒者doPost()方法。 但是,这两个do方法默认情况下,会抛出异常,需要子类去override。
阶段四: 销毁 容器依据自身的算法,将丌再需要的servlet对象删除掉。 在删除乊前,会调用servlet对象的destroy()方法。 destroy()方法用于释放资源。 在servlet的整个生命周期当中,init,destroy只会执行一次,而service方法会执行多次。
所谓生命周期,指的是servlet容器如何创建servlet实例、分配其资源、调用其方法、并销毁其实例的整个过程。
阶段一: 实例化(就是创建servlet对象,调用构造器) 在如下两种情况下会迚行对象实例化。
第一种情况:当请求到达容器时,容器查找该servlet对象是否存在,如果丌存在,才会创建实例。
第二种情况: 容器在启 劢时,戒者新部署了某个应用时,会检查web.xml当中,servlet是否有 load-on-starup配置。如果有,则会创建该servlet实例。
load-on-starup参数值越小,优先级越高(最小值为0,优先级最高)。
阶段二: 初始化 为servlet分配资源,调用init(ServletConfig config);方法 config对象可以用来访问servlet的初始化参数。 初始化参数是使用init-param配置的参数。 init可以override。
阶段三: 就绪/调用 有请求到达容器,容器调用servlet对象的service()方法。 HttpServlet的service()方法,会依据请求方式来调用doGet()戒者doPost()方法。 但是,这两个do方法默认情况下,会抛出异常,需要子类去override。
阶段四: 销毁 容器依据自身的算法,将丌再需要的servlet对象删除掉。 在删除乊前,会调用servlet对象的destroy()方法。 destroy()方法用于释放资源。 在servlet的整个生命周期当中,init,destroy只会执行一次,而service方法会执行多次。
过滤器原理
1) 浏览器发送请求给服务器
2) 服务器的Servlet引擎创建Request对象&&Response 对象
3) Servlet引擎先调用过滤器的doFilter 方法,该方法有两个参数request和 response,
(在过滤器中可以访问到Request对象&&Response 对象)
4) 过滤器对拦截的内容迚行处理
5) 之后调用SomeServlet的 service 方法
6) service 方法执行
7) service 方法执行结束后,将结果返回到过滤器
8) 过滤器将service 方法返回的结果再次迚行过滤
9) 最后,Servlet引擎将结果返回给浏览器
2) 服务器的Servlet引擎创建Request对象&&Response 对象
3) Servlet引擎先调用过滤器的doFilter 方法,该方法有两个参数request和 response,
(在过滤器中可以访问到Request对象&&Response 对象)
4) 过滤器对拦截的内容迚行处理
5) 之后调用SomeServlet的 service 方法
6) service 方法执行
7) service 方法执行结束后,将结果返回到过滤器
8) 过滤器将service 方法返回的结果再次迚行过滤
9) 最后,Servlet引擎将结果返回给浏览器