Struts2 Hibernate Spring 运行流程与部分机制

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介:

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

 


本文转自gauyanm 51CTO博客,原文链接:http://blog.51cto.com/gauyanm/1241125,如需转载请自行联系原作者

相关文章
|
2月前
|
缓存 安全 Java
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释
205 24
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
|
1月前
|
XML Java 应用服务中间件
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
168 2
|
1月前
|
JSON 前端开发 JavaScript
优雅!Spring Boot 3.3 实现职责链模式,轻松应对电商订单流程
本文介绍如何使用 Spring Boot 3.3 实现职责链模式,优化电商订单处理流程。通过将订单处理的各个环节(如库存校验、优惠券核验、支付处理等)封装为独立的处理器,并通过职责链将这些处理器串联起来,实现了代码的解耦和灵活扩展。具体实现包括订单请求类 `OrderRequest`、抽象处理器类 `OrderHandler`、具体处理器实现(如 `OrderValidationHandler`、`VerifyCouponHandler` 等)、以及初始化职责链的配置类 `OrderChainConfig`。
|
3月前
|
XML JSON Java
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
本文介绍了如何使用IntelliJ IDEA和Maven搭建一个整合了Struts2、Spring4、Hibernate4的J2EE项目,并配置了项目目录结构、web.xml、welcome.jsp以及多个JSP页面,用于刷新和学习传统的SSH框架。
88 0
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
|
3月前
|
数据库 Java 数据库连接
Struts 2 与 Hibernate 的完美邂逅:如何无缝集成两大框架,轻松玩转高效 CRUD 操作?
【8月更文挑战第31天】本文通过具体示例介绍了如何在 Struts 2 中整合 Hibernate,实现基本的 CRUD 操作。首先创建 Maven 项目并添加相关依赖,接着配置 Hibernate 并定义实体类及其映射文件。然后创建 DAO 接口及实现类处理数据库操作,再通过 Struts 2 的 Action 类处理用户请求。最后配置 `struts.xml` 文件并创建 JSP 页面展示用户列表及编辑表单。此示例展示了如何配置和使用这两个框架,使代码更加模块化和可维护。
85 0
|
3月前
|
Java Spring Maven
Struts 2遇见Spring:这个组合如何颠覆你的Web开发?
【8月更文挑战第31天】在现代Web开发中,Struts 2与Spring的结合使用能显著增强应用的模块化和可维护性。本文将介绍如何整合这两个框架,并提供代码示例。首先,在`pom.xml`中添加Struts 2和Spring的依赖,然后在`struts.xml`中配置Struts 2以识别Spring插件。接着,在Spring配置文件中定义bean,并在Struts 2的Action类中使用`@Autowired`注解进行自动注入。
47 0
|
3月前
|
Java 开发者 前端开发
Struts 2、Spring MVC、Play Framework 上演巅峰之战,Web 开发的未来何去何从?
【8月更文挑战第31天】在Web应用开发中,Struts 2框架因强大功能和灵活配置备受青睐,但开发者常遇配置错误、类型转换失败、标签属性设置不当及异常处理等问题。本文通过实例解析常见难题与解决方案,如配置文件中遗漏`result`元素致页面跳转失败、日期格式不匹配需自定义转换器、`&lt;s:checkbox&gt;`标签缺少`label`属性致显示不全及Action中未捕获异常影响用户体验等,助您有效应对挑战。
89 0
|
3月前
|
Java 数据库连接 数据库
Spring Data JPA 与 Hibernate 之区别
【8月更文挑战第21天】
83 0
|
6月前
|
SQL 缓存 Java
框架分析(9)-Hibernate
框架分析(9)-Hibernate
|
19天前
|
缓存 Java 数据库连接
Hibernate:Java持久层框架的高效应用
通过上述步骤,可以在Java项目中高效应用Hibernate框架,实现对关系数据库的透明持久化管理。Hibernate提供的强大功能和灵活配置,使得开发者能够专注于业务逻辑的实现,而不必过多关注底层数据库操作。
12 1