Java個人技術知識點總結(框架篇)
框架篇
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、<action/> 裡配置 <result/> 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是基於類
如果你依然覺得有些茫然,不如加入我的Java架構師之路:766529531 跟有多年Java開發經驗的資深工程師聊一聊。也可獲取免費的影片學習資料以及電子書學習資料喔!
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標籤
首先需要引用<%@taglib prefix="s" uri="/struts-tags"%>
1.判斷標籤 後面可跟 <s:else>
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
如果你依然覺得有些茫然,不如加入我的Java架構師之路:766529531 跟有多年Java開發經驗的資深工程師聊一聊。也可獲取免費的影片學習資料以及電子書學習資料喔!
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",對處理後的跳轉進行統一配置。
H ibernate中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的區別
[if !supportLists]1、[endif]hibernate和jdbc主要區別就是,hibernate先檢索快取中的對映物件( 即hibernate操作的是物件),而jdbc則是直接運算元據庫.
[if !supportLists]2、[endif]Hibernate是JDBC的輕量級的物件封裝,它是一個獨立的物件持久層框架。Hibernate可以用在任何JDBC可以使用的場合
[if !supportLists]3、[endif]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();
H ibernate的三種狀態以及狀態的轉換
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不使用查詢快取
如果你依然覺得有些茫然,不如加入我的Java架構師之路:766529531 跟有多年Java開發經驗的資深工程師聊一聊。也可獲取免費的影片學習資料以及電子書學習資料喔!
Ssh的概述:
ssh是web開發中常見的一種框架
s-struts2
s-spring
h-hibernate
其中struts2在框架中充當控制器,實現MVC,主要用來處理使用者的請求,和跳轉頁面。使專案結構清晰,開發者只需要關注業務邏輯的實現即可。
spring在ssh充當粘合劑,粘合struts-sping-hibernate,主要用來進行事物的控制,
hibernate-充當資料庫持久層,主要用它來與資料庫互動,提高開發效率,減輕程式設計師sql控制要求,而且hibernate透過反射機制,有靈活的對映性,還支援各種關係,一對一,一對多,多對多。
在進行ssh整合的時候,我們應該注意:
1. 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動作
以“<jsp: 動作名 ” 開始,以“</jsp:動作名> ” 結束
比如:
2.JSP指令:<%@ include%><%@ %>
以“<%@ ” 開始,以“%> ” 結束。比如:
<%@ include file = " Filename" %>
3.JSP輸出表示式:<%= %><%=Java表示式 %>
輸出變數的值,後邊不能加<%= ; %>
4.JSP Scriptlet【指令碼】:<% ;%> <% Java 程式碼 %>
例子:
<% Calendar now = Calendar.getInstance(); %>
5.JSP宣告:<%! %> <%! 函式或者方法 %>
例子:
<%!
String getHello(String name) {
return "Hi," + name + "!";
}
%>
6.迭代標籤:<c:foreach>
Jstl中的核心標籤(core)
7.JSP註釋:
<%--這也是註釋,但客戶端不能檢視到 --%>
el表示式:${}
jsp:include動作是在執行時動態包含。
@include指令是在編譯時包含。
它們兩個都只能包含本專案的相關檔案,不能包含其他專案的。
如果要包含其他專案的檔案可以使用c:import
過濾器
filter的概述:
filter是一個過濾器,用來在請求前和響應後進行資料的處理。
filter的生命週期是:
例項化--->初始化(init)-->進行過濾(doFilter)--->銷燬(destroy)-->釋放資源
一個Filter必須實現javax.servlet.Filter介面
在專案中我們通常透過filter進行編碼轉換,
進行安全驗證,進行重複提交的判斷。
瞭解(不需要主動說)
filter 相當於 攔截器 相當於Spring AOP
servlet+jsp+javabean+jdbc+filter
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.leopard.filter.EncodingFilter</filter-class>
<init-param>
<param-name>encode</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
攔截器的理解
如果你依然覺得有些茫然,不如加入我的Java架構師之路:766529531 跟有多年Java開發經驗的資深工程師聊一聊。也可獲取免費的影片學習資料以及電子書學習資料喔!
什麼是攔截器:
攔截器是AOP中的概念,它本身是一段程式碼,可以透過定義“織入點”,來指定攔截器的程式碼在“織入點”的前後執行,從而起到攔截的作用
正如上面Struts2的Reference中講述的,Struts2的Interceptor,其攔截的物件是Action程式碼,可以定義在Action程式碼之前或者之後執行攔截器的程式碼。
在專案中,我們經常用來攔截透過非正常程式而進行的訪問
Struts2的攔截器和Servlet過濾器類似。在執行Action的execute方法之前,Struts2會首先執行在struts.xml中引用的攔截器,在執行完所有引用的攔截器的intercept方法後,會執行Action的execute方法。
其中intercept方法是攔截器的核心方法,所有安裝的攔截器都會呼叫之個方法。在Struts2中已經在struts-default.xml中預定義了一些自帶的攔截器,如timer、params等。如果在<package>標籤中繼承struts-default,則當前package就會自動擁有struts-default.xml中的所有配置。程式碼如下:
<package name="demo" extends="struts-default" > ... </package>
攔截器是Struts2框架的核心,它主要完成解析請求引數、將請求引數賦值給Action屬性、執行資料校驗、檔案上傳等工作
在struts-default.xml中有一個預設的引用,在預設情況下(也就是<action>中未引用攔截器時)會自動引用一些攔截器。struts2中預設的攔截器是defaultStack.
自定義攔截器需要特別注意的是不要忘記引入struts2預設的攔截器。為了實現某些操作,我們可以自定義攔截器,
自定義攔截器有三種方式定義。分別為實現Interceptor介面,繼承抽象類AbstractInterceptor,繼承MethodFilterInteceptor類。
攔截器在專案中的運用:
同時可以減輕程式碼冗餘,提高重用率。
如果要求使用者密碼、許可權等的驗證,就可以用自定義的攔截器進行密碼驗證和許可權限制。對符合的登入者才跳轉到正確頁面。
Spring融入框架
我們透過在web.xml中配置ContextLoaderListener這個監聽器也載入
spring的配置檔案,從而融入到專案框架中。
專案的部署方式
1、如果專案單獨部署到tomcat中的時候,應該看tomcat中的server.xml;
2、如果和eclipse結合使用進行專案部署的時候,應該看eclipse裡面的server.xml.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555151/viewspace-2219437/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java個人技術知識點總結(優化篇)Java優化
- Java個人技術知識點總結(資料庫篇)Java資料庫
- Java個人技術知識點總結(最佳化篇)Java
- Java個人技術知識點總結(業務場景篇)Java
- Java個人知識點總結(基礎篇)Java
- Java知識點總結——IO流框架Java框架
- Java 知識點總結Java
- Java知識點總結Java
- 好程式設計師Java教程分享Java技術知識點總結程式設計師Java
- java面試知識點總結Java面試
- Java 面試知識點總結Java面試
- Java知識點總結(Java泛型)Java泛型
- Java知識點總結(Java容器-List)Java
- Java知識點總結(Java容器-Vector)Java
- Java知識點總結(Java容器-Set)Java
- 【java學習】java知識點總結Java
- Flutter 知識點總結-基礎篇Flutter
- Java基礎知識點總結Java
- Core Java 的知識點總結Java
- 總結的Java知識點集合Java
- Java常見知識點彙總(⑦)——集合框架Java框架
- Java基礎面試知識點總結Java面試
- Java類和物件知識點總結Java物件
- Java集合 - 集合知識點總結概述Java
- 常見Java面試知識點總結Java面試
- 知識點總結
- 個人技術棧總結
- 關於 SSH 框架面試知識點的總結框架面試
- linux知識知識點總結Linux
- Android 開發需要掌握的技術知識點全面總結Android
- Java知識點總結(註解-介紹)Java
- Java中IO流的知識點總結Java
- HDFS知識點總結
- MongoDB知識點總結MongoDB
- django知識點總結Django
- jQuery 知識點總結jQuery
- MySQL知識點總結MySql
- HBase知識點總結