框架篇
一、Struts1的運行原理
在啟動時通過前端總控制器ActionServlet加載struts-config.xml并進行解析,當用戶在jsp頁面發送請求被struts1的核心控制器ActionServlet接收,ActionServlet在用戶請求時將請求參數放到對應的ActionForm對象中的成員變量中,然后ActionServlet則會根據struts-config.xml中的映射關系找到相應的Action中的方法,將對應的ActionForm一并傳給這個Action中的方法里,然后執行相應的業務邏輯操作,最后就根據ActionMapping的findforward方法返回一個ActionForward,之后在struts-config.xml中找到與之對應的forward標簽,根據它的配置路徑找到對應的jsp頁面。
二、Struts2的運行原理
1、tomcat 啟動的時候會加載 web.xml 、核心控制器 FilterDispatcher 會加載并解析 struts.xml
2、客戶端會發送一個請求到 action 、FilterDispatcher 會根據后綴名進行攔截
3、FilterDispatcher根據 struts.xml 的配置文件信息 找到 某個action 對應的某個類里的指定方法
4、執行相關的業務邏輯最后返回 一個String
5、 里配置 name的屬性值與返回的String 進行匹配,跳轉到指定的jsp 頁面
三、struts2的體系結構
1、客戶端向Servlet容器(例如Tomcat)發送一個請求;
2、這個請求經過一系列的過濾器(Filter);
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中的配置找到對應的返回結果。返回結果通常是jsp或者FreeMarker的模版。(體系結構圖見下一頁)
四、Spring MVC運行原理
整個處理過程從一個HTTP請求開始:
1.Tomcat在啟動時加載解析web.xml,找到spring mvc的前端總控制器DispatcherServlet,并且通過DispatcherServlet來加載相關的配置文件信息。
2.DispatcherServlet接收到客戶端請求,找到對應HandlerMapping,根據映射規則,找到對應的處理器(Handler)。
3.調用相應處理器中的處理方法,處理該請求后,會返回一個ModelAndView。
4.DispatcherServlet根據得到的ModelAndView中的視圖對象,找到一個合適的ViewResolver(視圖解析器),根據視圖解析器的配置,DispatcherServlet將要顯示的數據傳給對應的視圖,最后顯示給用戶。
五、Struts1.x與Struts2.x的區別
Struts 2以WebWork為核心,
采用攔截器的機制來處理用戶的請求,struts1嚴重依賴于servletAPI,
屬于侵入性框架,struts2不嚴重依賴于servletAPI,屬于非侵入型框架。
線程模型方面:
Struts1的Action是單實例的,
一個Action的實例處理所有的請求。
Struts2的Action是一個請求對應一個實例(每次請求時都新new出一個對象),
沒有線程安全方面的問題
封裝請求參數:
Struts1中強制使用ActionForm對象封裝請求的參數。
Struts2可以選擇使用POJO類來封裝請求的參數,或者直接使用Action的屬性。
struts1的前端總控制器(核心總控制器)為ActionServlet,
struts2的前端總控制器(核心總控制器)為FilterDispather
六、Spring MVC、struts1和struts2區別
1.spring mvc 單例 非線程安全
struts1單例 非線程安全
struts2線程安全對每個請求都產生一個實例
2.spring mvc的入口是servlet,而struts2是filter
spring 的前端總控制器為 DispatcherServlet
struts2 的前端總控制器為 FilterDispatcher
struts1 的前端總控制器為 actionServlet
3. 參數傳遞:struts是在接受參數的時候,
可以用屬性來接受參數,這就說明參數是讓多個方法共享的。
springmvc 用方法來接受參數
4.spring mvc是基于方法的設計,而sturts是基于類
七、Struts2中result中的type類型
1.dispatcher:它是默認的,用來轉向頁面,通常處理JSP
2.redirect:將用戶重定向到一個已配置好的URL
3.redirectAction:將用戶重定向到一個已定義好的action
4.chain:將action和另外一個action鏈接起來
5.freemarker:呈現Freemarker模板
6.httpheader:返回一個已配置好的HTTP頭信息響應
7.stream:向瀏覽器發送InputSream對象對下載的內容和圖片非常有用
8.velocity:呈現Velocity模板
9.xslt:該XML可以通過XSL模板進行轉換
10.plaintext:顯示原始文件內容,例如文件源代碼
八、Struts2標簽
首先需要引用
1. 判斷標簽 后面可跟
2. 迭代標簽
3. 引入標簽 可以把一個JSP頁面或者servlet引入一個頁面中
4. 輸出標簽
5. 標簽賦予變量一個特定范圍內的值
6.
表單標簽7. 文本域標簽
8. 下拉標簽
9. 聲明一個url的路徑
最常用的是:
判斷
循環
輸出
九、SSI整合
1、Action繼承于Actionsupport
2、引入struts-spring-plugin.jar包,從而完成struts和spring的整合
3、在struts2的action中注入service,保證service的名字和配置文件中的一致,并生成get,set方法
4、Dao層繼承于SqlMapClientDaoSupport
5、在dao層的配置文件中注入sqlMapClient
十、SSH整合
1.首先在web.xml中通過ContextLoaderListener來融入spring,
并加載spring的相關配置文件
2.同樣配置sturts2的前端總控制器filterDispatcher來過濾相關的
請求并且加載struts.xml
3.action繼承ActionSupport,然后通過引入struts-spring-plugin.jar
包并且根據配置文件中service的id生成get,set方法來注入service層。
4.dao層繼承于HibernateDaoSupport,并且在dao的配置文件中注入sessionFactory.
5.通過spring中的配置文件加載hibernate.cfg.xml文件從而融入hibernate.
在ssh框架中是怎么整合spring?
首先在web.xml中通過ContextLoaderListener來融入spring,
并加載spring的相關配置文件
在ssh框架中是怎么整合hibernate?
通過spring中的配置文件加載hibernate.cfg.xml文件從而融入hibernate
dao層繼承于HibernateDaoSupport,并且在dao的配置文件中注入sessionFactory
在ssh框架中是怎么整合struts2?
配置sturts2的前端總控制器filterDispatcher來過濾相關的
請求并且加載struts.xml
十、Spring MVC整合
1.首先,要在web.xml里面配置SpringMVC的核心控制器,DispatcherServlet,對指定的后綴請求進行攔截。
2.Controller層要加 @Controller注解,表明該類是MVC的控制層。
3.創建Service接口,給接口加上注解 @Component或者 @Service 表明這是Service業務處理層
4.在Controller層聲明Service變量(屬性),給變量(屬性) 加上 @Autowired注解,通過自動綁定機制將Service注入到Controller。 (注:@Autowired默認是ByType,如果想根據屬性名注入,那么就再加上注解 @Resource(name=“屬性名”))
5.在Controller層的方法上加上注解 @RequestMapping(“requestAddress”) 表明該方法的請求地址
6.Dao層要加上注解 @Repository 表明這是數據庫持久層
7.同樣將dao實例注入到service層中。
8.配置視圖解析器 “InternalResourceViewResolver”,對處理后的跳轉進行統一配置。
十一、Hibernate 中get 和 load的區別
加載方式:
load為延遲加載(返回的是一個只有id屬性的代理,只有使用該對象屬性時,才發出sql語句);
get為立即加載(執行時,會立即向數據庫發出sql語句)
返回結果:
load檢索不到記錄時,會拋ObjectNotFoundException異常
get檢索不到記錄時,會返回null
十二、Hibernate、Ibatis、Jdbc三者的區別
Hibernate屬于全自動, Ibatis屬于半自動,Jdbc屬于手動,從開發效率上講hibernate較高,ibatis居中,jdbc較低,從執行效率上講hibernate較低,ibatis居中,jdbc較高,因為jdbc是手工寫sql語句,程序員對sql的控制能力更大,可以根據業務需要進行優化,而ibatis雖然也可以對sql進行優化,但是他里面將resultset封裝為實體的過程中采用了反射機制所以一定程度上影響了性能,而hibernate因為高度封裝所以開發效率相對較高,但正因為這個原因,所以程序員在對sql語句的控制和優化方面相對比較弱,而且在將resultset封裝成實體的過程中也采用了反射機制,所以在性能方面較低
十三、Hibernate的運行原理
首先通過configuration去加載hibernate.cfg.xml這個配置文件,根據
配置文件的信息去創建sessionFactory,sessionFactory是線程安全的,
是一個session工廠,用來創建session,session是線程不安全的,相當于
jdbc的connection,最后通過session去進行數據庫的各種操作,在進行操作
的時候通過transaction進行事務的控制。
十四、Hibernate五大核心(類/接口)簡述
1 .Configuration接口的作用是對Hibernate進行配置,以及對它進行啟動。(加載hibernate.cfg.xml)并創建一個SessionFactory對象。
2 .SessionFactory接口
SessionFactory接口負責初始化Hibernate。它充當數據存儲源的代理,并負責創建Session對象。SessionFactory是線程安全的。
3 .Session接口
Session(會話)接口是Hibernate應用使用的主要接口。Session接口負責執行被持久化對象的CRUD操作(增刪改查)。Session對象是非線程安全的。Session 相當于jdbc的connection
4 .Query與Criteria接口
總之Query和Criteria接口負責執行各種數據庫查詢。
5 .Transaction接口
Transaction(事務)負責操作相關的事務。
十五、Hibernate與JDBC的區別
1、hibernate和jdbc主要區別就是,hibernate先檢索緩存中的映射對象( 即hibernate操作的是對象),而jdbc則是直接操作數據庫.
2、Hibernate是JDBC的輕量級的對象封裝,它是一個獨立的對象持久層框架。Hibernate可以用在任何JDBC可以使用的場合
3、Hibernate是一個和JDBC密切關聯的框架,所以Hibernate的兼容性和JDBC驅動,和數據庫都有一定的關系,但是和使用它的Java程序,和App Server沒有任何關系,也不存在兼容性問題。
4、如果正確的使用JDBC技術,它的執行效率一定比hibernate要好,因為hibernate是基于jdbc的技術.
5、JDBC使用的是SQL語句,Hibernate使用的是HQL語句,但是HQL語句最終還會隱式轉換成SQL語句執行。
十六、Hibernate中的兩大配置文件
.hbm.xml:主鍵生成策略,映射關系,一對多,一對一的關系。
Hibernate.cfg.xml:方言(用哪個數據庫),數據庫連接信息,包含.hbm.xml內容,映射文件,也可以配事務。
十七、Hibernate事務處理
開啟事務 session.beginTransaction();
執行相關的操作,如果成功則session.getTransaction().commit();
執行操作失敗則 session.getTransaction.rollback();
十八、Hibernate的三種狀態以及狀態的轉換
Transient(臨時)
new 一個初始化對象后,并沒有在數據庫里保存數據,處于臨時狀態;
Persistent(持久化)
當執行save()方法,調用session.close()方法之前,內存中的對象與數據庫有 對應關系處于持久化狀態;
Detached(托管/游離)
當執行session.close()之后,處于托管狀態;
狀態的轉換
處于托管狀態下,調用update()方法后,轉換為持久化狀態;
在持久化狀態下,執行delete()方法后,轉換為臨時狀態;
在未初始化對象之前,調用get(),load(),find(),iterate()之后,直接進入持久化狀態。
十九、分頁步驟
①前臺封裝一個顯示分頁的組件
②查詢總條數
③后臺封裝分頁工具類,計算開始位置、結束位置、總頁數
④后臺寫支持分頁的sql語句
⑤前臺包含分頁組件,實現分頁效果
注意:
查詢總條數的where和查詢列表信息的where條件要保證一致。
二十、hibernate緩存概述
hibernate分為一級緩存即session緩存也叫事務級別的緩存以及
二級緩存sessionFactory即應用級別的緩存,還有查詢緩存即三級緩存.
一級緩存的生命周期和session的生命周期保持一致,
hibernate默認就啟用了一級緩存,
不能將其關閉,可以通過session.clear()和session.evict(object)來管理一級緩存。其中get,load,iterate都會使用一級緩存,一級緩存緩存的是對象。
二級緩存的生命周期和sessionFactory的生命周期保持一致,可以跨session,被多個session共享,hibernate3默認開啟二級緩存,也可以手動開啟并指定緩存插件如ehcache,oscache
等。二級緩存也只能緩存對象。
三級緩存也叫查詢緩存,查詢緩存是針對普通屬性結果集的緩存,
對實體對象的結果集只緩存id。對query.list()起作用,query.iterate不起作用,也就是query.iterate不使用查詢緩存
二十一、Ssh的概述:
ssh是web開發中常見的一種框架
s-struts
s-spring
h-hibernate
其中struts在框架中充當控制器,實現MVC,主要用來處理用戶的請求,和跳轉頁面。使項目結構清晰,開發者只需要關注業務邏輯的實現即可。
spring在ssh充當粘合劑,粘合struts-sping-hibernate,主要用來進行事物的控制,
hibernate-充當數據庫持久層,主要用它來與數據庫交互,提高開發效率,減輕程序員sql控制要求,而且hibernate通過反射機制,有靈活的映射性,還支持各種關系,一對一,一對多,多對多。
在進行ssh整合的時候,我們應該注意:
- Action繼承于ActionSupport
- 引入struts-spring-plugin.jar包,從而完成struts和spring的整合
- 在struts2的action中注入service,保證service的名字和配置文件中的一致,并生成get,set方法
- Dao層繼承于hibernateDaoSupport
- 在dao層的配置文件中注入sessionFactory
二十二、防止表單重復提交
針對于重復提交的整體解決方案:
1.用redirect來解決重復提交的問題
2.點擊一次之后,按鈕失效
3.通過loading
4.自定義重復提交過濾器
5.解決struts2重復提交
可以結合s:token標簽來解決重復提交問題
利用token的原理:
1.在前端的jsp頁面中加入s:token標簽,在訪問該頁面時就會生成
隱藏域,該隱藏域中包含一個隨機生成的字符串,并把該字符串
存入session中
2.在struts2的配置文件中加入token攔截器后,當正常訪問action
的時候,會從session中取出該字符串,然后和頁面隱藏域中提交
字符串做對比,如果一致則正常執行并刪除session中存儲的字符串。
二十三、JSP標簽:
1.JSP include動作
jsp:include 動作
以“ ” 結束
比如:
2.JSP指令:
以“ ” 結束。比如:
3.JSP輸出表達式:
輸出變量的值,后邊不能加
4.JSP Scriptlet【腳本】:
例子:
5.JSP聲明:
例子:
String getHello(String name) {
return “Hi,” + name + “!”;
}
%>
6.迭代標簽:
Jstl中的核心標簽(core)
7.JSP注釋:
8.el表達式:${}
9.jsp:include動作是在運行時動態包含。
@include指令是在編譯時包含。
它們兩個都只能包含本項目的相關文件,不能包含其他項目的。
如果要包含其他項目的文件可以使用c:import
二十四、過濾器
filter的概述:
filter是一個過濾器,用來在請求前和響應后進行數據的處理。
filter的生命周期是:
實例化—>初始化(init)–>進行過濾(doFilter)—>銷毀(destroy)–>釋放資源
一個Filter必須實現javax.servlet.Filter接口
在項目中我們通常通過filter進行編碼轉換,
進行安全驗證,進行重復提交的判斷。
了解(不需要主動說)
filter 相當于 攔截器 相當于Spring AOP
servlet+jsp+javabean+jdbc+filter
encodingFilterorg.leopard.filter.EncodingFilterencodeutf-8encodingFilter*
二十五、攔截器的理解
什么是攔截器:
攔截器是AOP中的概念,它本身是一段代碼,可以通過定義“織入點”,來指定攔截器的代碼在“織入點”的前后執行,從而起到攔截的作用
正如上面 Struts2的Reference中講述的,Struts2的Interceptor,其攔截的對象是Action代碼,可以定義在Action代碼之前或者之后執行攔截器的代碼。
在項目中,我們經常用來攔截通過非正常程序而進行的訪問
Struts2的攔截器和Servlet過濾器類似。在執行Action的execute方法之前,Struts2會首先執行在struts.xml中引用的攔截器,在執行完所有引用的攔截器的intercept方法后,會執行Action的execute方法。
其中intercept方法是攔截器的核心方法,所有安裝的攔截器都會調用之個方法。在Struts2中已經在struts-default.xml中預定義了一些自帶的攔截器,如timer、params等。如果在標簽中繼承struts-default,則當前package就會自動擁有struts-default.xml中的所有配置。代碼如下:
…
攔截器是Struts2框架的核心,它主要完成解析請求參數、將請求參數賦值給Action屬性、執行數據校驗、文件上傳等工作
在struts-default.xml中有一個默認的引用,在默認情況下(也就是中未引用攔截器時)會自動引用一些攔截器。struts2中默認的攔截器是defaultStack.
自定義攔截器需要特別注意的是不要忘記引入struts2默認的攔截器。為了實現某些操作,我們可以自定義攔截器,
自定義攔截器有三種方式定義。分別為實現Interceptor接口,繼承抽象類AbstractInterceptor,繼承MethodFilterInteceptor類。
攔截器在項目中的運用:
同時可以減輕代碼冗余,提高重用率。
如果要求用戶密碼、權限等的驗證,就可以用自定義的攔截器進行密碼驗證和權限限制。對符合的登入者才跳轉到正確頁面。
二十六、Spring融入框架
我們通過在web.xml中配置ContextLoaderListener這個監聽器也加載
spring的配置文件,從而融入到項目框架中。
二十七、項目的部署方式
1、如果項目單獨部署到tomcat中的時候,應該看tomcat中的server.xml;
2、如果和eclipse結合使用進行項目部署的時候,應該看eclipse里面的server.xml.