框架工作流程

Struts2 运行流程分析 

1. Struts2 运行流程如下: 

1). 请求发送给 StrutsPrepareAndExecuteFilter

 2). StrutsPrepareAndExecuteFilter 询问 ActionMapper: 该请求是否 是一个 Struts2 请求(即是否返回一个非空的 ActionMapping 对象)

 3). 若 ActionMapper 认 为 该 请 求 是 一 个 Struts2 请 求 , 则 StrutsPrepareAndExecuteFilter 把请求的处理交给 ActionProxy 

4). ActionProxy 通过 ConfigurationManager 询问框架的配置文件,确 定需要调用的 Action 类及 Action 方法 

5). ActionProxy 创建一个 ActionInvocation 的实例,并进行初始化

 6). ActionInvocation 实例在调用 Action 的过程前后,涉及到相关拦截 器(Intercepter)的调用。

 7). Action 执行完毕,ActionInvocation 负责根据 struts.xml 中的配 置找到对应的返回结果。调用结果的 execute 方法,渲染结果。在渲染 的过程中可以使用 Struts2 框架中的标签。

 8). 执行各个拦截器 invocation.invoke() 之后的代码 9). 把结果发送到客户端 2. 流程图: 

Struts2 Hibernate Spring 运行流程与部分机制
Tomcat容器被加载,找到该webApplication相对应的web.xml
开始解析web.xml中的信息

读取到一个spring的监听器,告诉spring容器开始初始化配置文件中的信息,spring容器配置文件默认applicationContext.xml www.2cto.com
<listener>
<listener-class> org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

容器开始实例化spring相关bean和配置文件,
Spring容器创建dataSource数据源,
创建hibernate的sessionFactory(传入dataSource)
创建操作数据库所需的操作模板HibernateTemplate(传入sessionFactory)
并扫描生成配置文件中的bean(IOC注入)
生成各个dao 传入hibernateTemplate
生成各个service 传入相对应的dao
(初始化工作完成,等待用户的请求,只初始化spring容器中的bean)
spring容器初始化完成(如果action是prototype,不是单例的话)
action如果是单例就会先初始化action,service,dao,hibernateTemplate,sessionFactory,datasource)

一个请求发送到tomcat(产生了HttpServletRequest)
Tomcat接收到请求根据url寻找web application,开始加载该web application的web.xml
读取到
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
的时候
1.通过filter过滤所有的url,调用把请求传给StrutsPrepareAndExecuteFilter(前端控制器)
开始struts2的工作
struts2一起动就会去加载配置文件,其中包括struts—plugin。xml读取顺序:
struts-default.xml
struts-plugin.xml
(struts2-spring-plugin.jar中的配置文件中的
<constant name="struts.objectFactory" value="spring" />,这句配置就指明了我们产生struts对象的工厂交给spring来产生,如果action配置了注解,则交给spring在最初的时候产生,如果没有,则由struts2和plugin插件产生)
struts.xml
struts.properties
web.xml
2.StrutsPrepareAndExecuteFilter调用actionMapper来确定是否
有action需要调用
3.如果actionMapper确定请求需要调用某个action,那么StrutsPrepareAndExecuteFilter
调用Dispatcher类中的serviceAction方法产生valuestack(值栈)与 actioncontext(action上下文)并产生actionproxy代理对象
把请求的处理交给actionProxy
4.actionProxy通过configurationManager查看struts.xml
来找到需要调用的action和action所有的配置信息(拦截器,转换器等)
5.actionProxy创建一个actionInvocation的实例。
6.actionInvocation使用命令模式在action的前后来调用配置文件中
配置的拦截器和拦截器栈(比如将HttpServletRequest的参数解析出来封装成对象传给action)
(通过xml的代码然后再解析xml文档用dom解析或者sax解析,得到xml的内容和节点,然后通过反射技术,进行java类的加载以及方法的加载 )
7.调用完拦截器后调用action对应的方法方法处理请求(页面控制器)
8.由struts2生成action或者spring产生的,并struts-spring-plugin插件将action中所需的serviceImpl在spring容器中寻找并将实例传入action(或者由工厂模式提供serviceImpl组件的实例)
9.action调用service,service调用dao
dao层中调用hibernateTemplate的相关方法完成数据库操作将结果逐层返回给action
10.action返回试图名
10.actionInvacation根据struts.xml中action返回的视图名对应result的值寻找到对应的视图将视图和返回值结合(jsp拿到值)并产生新的jsp返回给上层的filter。
StrutsPrepareAndExecuteFilter将jsp返回给tomcat
Tomcat的jsp引擎(org.apache.jasper.servlet.JspServlet)生成serlvet源程序(.java文件)
.之后又将Servlet源程序编译为.class类文件;编译成.class文件后返回给用户产生html

一。Struts2生成action
不声明@Component,由struts2生成的action(默认是prototype一个请求new一个)
action中需要访问的service层的对象生成的set方法由struts-spring-plugin.jar这个jar包 帮我们去spring容器中找与set方法名字一样的bean帮我们注入,
注意这里struts-spring-plugin提供的注入方法是不可替换的,即使
使用@Resource指定其他的实现也无效。

二。Spring生成action
由Spring容器生成的action,配置了@Component和@Scope("prototype")  struts,xml中action的class属性指定成
@Component的value
该action中的service的set方法 需要使用@Resource注入,struts-spring-plugin 则不会自动去spring容器中寻找相应的bean

注意:
如果action不使用@Component("actionName") 那么action是由struts2产生,如果加上@Component("u") 则struts.xml中的
<action name="u" class="u"> 的class要为u,则为spring产生的action,struts2找action的时候,去spring容器中找action

刚工作不久,自己总结的,如果错误以及不正确的地方,欢迎大家指正哈。

SpringMVC 运行流程分析 
在整个 Spring MVC 框架中, DispatcherServlet 处于核心位置,负责协调和组织不 同组件以完成请求处理并返回响应的工作 SpringMVC 处理请求过程: 
1). 若一个请求匹配 DispatcherServlet 的请求映射路径(在 web.xml 中指定), WEB 容器将该请求转交给 DispatcherServlet 处理 
2). DispatcherServlet 接收到请求后, 将根据请求信息(包括 URL、HTTP 方法、请求 头、请求参数、Cookie 等)及 HandlerMapping 的配置找到处理请求的处理器(Handler). 可将 HandlerMapping 看成路由控制器,将 Handler 看成目标主机。
 3). 当 DispatcherServlet 根据 HandlerMapping 得到对应当前请求的 Handler 后, 通过 HandlerAdapter 对 Handler 进行封装,再以统一的适配器接口调用 Handler。 
4). 处理器完成业务逻辑的处理后将返回一个 ModelAndView 给 DispatcherServlet, ModelAndView 包含了视图逻辑名和模型数据信息 
5). DispatcherServlet 借助 ViewResoler 完成逻辑视图名到真实视图对象的解析 
6). 得 到 真 实 视 图 对 象 View 后 , DispatcherServlet 使用这个 View 对 ModelAndView 中的模型数据进行视图渲染 
UML 时序图:     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值