程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> Struts2 Hibernate Spring 運行流程與部分機制

Struts2 Hibernate Spring 運行流程與部分機制

編輯:關於JSP

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

剛工作不久,自己總結的,如果錯誤以及不正確的地方,歡迎大家指正哈。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved