SSH和SSM框架面試題
阿新 • • 發佈:2018-11-09
SSH和SSM框架面試題
僅用於自己學習筆記,有錯誤請指出
1、Struts2的執行流程是什麼
瀏覽器向伺服器發起請求,請求被提交到web.xml前端過濾器
前端過濾器解析出請求的路徑,再根據struts.xml中的action配置,決定將請求交給那個方法來進行處理
action中處理完請求之後,返回給前端一個字串
前端過濾器拿到字串之後,再根據struts.xml中的result配置決定是重定向還是分發,一般是轉發,如果是轉發就去找相對應的jsp頁面,最後將jsp頁面返回給前端
2、值棧和OGNL作用分別是什麼
概念:值棧:struts2的資料管理中心,儲存action相關的資料和資訊
存放的資料有:action中的物件,action中的屬性和action環境相關的資料(request,session,application)
ValueStack是struts中的一個介面,OgnlValueStack是ValueStack的實現類.客戶端發起請求,struts2框架會建立一個OgnlvalueStack值棧例項,OgnlValueStack貫穿整個action的生命週期,struts中使用OGNL將請求的引數封裝為物件儲存在值棧中,並通過OGNL表示式讀取值棧中的物件屬性.
OGNL:物件圖導航語言,它是一種功能強大的開源表示式語言.使用這種表示式語言,可以存取物件的任意屬性.
用於簡化jsp程式碼中的java程式碼,訪問資料,跟jsp中的EL表示式功能相似
作用:用於獲取資料和用作型別轉換
3、Struts中JSP如何給Action傳值
通過from表單進行傳值
通過ajax進行傳值
通過url進行傳值
4、攔截器的作用,以及攔截器和過濾器之間的區別
攔截器的作用:動態攔截action呼叫的物件.定義在一個action執行的前後執行的程式碼,也可以在一個action執行前阻止其執行.同時也是提供了一種可以提取action中可以重用的部分的方式.
區別:
底層實現不同.攔截器基於反射實現的,過濾器基於函式回撥實現的.
過濾器依賴於servlet容器.攔截器不需要依賴任何容器
過濾器會對所有的請求其作用,攔截器只會作用於action,只對action
攔截器可以訪問action上下文,值棧中的物件,過濾器不能
在action的生命週期中,攔截器可以多次呼叫,而過濾器只能在容器初始化的時候被呼叫一次.
攔截器可以獲取IOC容器 中的各個bean,和值棧中的資料,而過濾器不行
5、Ioc是什麼,底層如何實現的,Ioc與DI之間關係
IOC:控制反轉.獲得物件依賴的方式反轉了,改變了物件的建立方式.原來有new構造器建立的方式現在由spring容器進行建立和管理.
底層實現:
建立xml配置檔案,配置要建立的物件類
建立 工廠類,使用dom4j解析配置檔案,得到id對應的class屬性
根據反射建立類物件(Class.forName)
IOC和DI之間的關係:IOC是一種思想,DI是實現這種思想的的途徑
DI:依賴注入,DI的作用是維護物件之間的關係,將一起工作具有關係的物件之間通過構造器或者set方法傳入值建立關係
DI注入的方式:
通過set方式注入
通過構造器方式注入
介面注入(p名稱空間簡化set方法注入值)
6、AOP作用是什麼,底層如何實現在哪些地方會用到,分別簡述切面,切入點和通知
AOP:面向切面程式設計:將一個系統中共同的業務邏輯提取出來,進行單獨的封裝成一個元件(切面),然後以配置的方式作用於系統中,實現程式的可插拔性,提高程式碼的複用性,提升系統的靈活性和效能
底層實現:JDK動態代理,只支援介面注入
CGLIB:可以支援普通類的注入
那些地方會用到:事物開啟,日誌記錄,安全驗證,許可權驗證
切面:系統中共通的業務提取出來,在某個時刻或者某個階段共同呼叫
切入點:找到目標方法,給它追加共通的業務邏輯,在spring中提供了切入點表示式幫助我們找到目標方法execution
通知:什麼時候呼叫這個共通的業務邏輯,用於指定切面方法作用到系統中的時機.
前置通知,後置通知,環繞通知,異常通知,最終通知
7、什麼是動態代理模式
給目標物件提供一個代理類來控制目標物件的訪問,在不修改目標物件的前提下,對目標物件進行功能擴充套件.代理物件和目標物件實現共同的介面或者繼承共同的類.
代理類在程式執行前就存在成為靜態代理,代理類在程式執行的時候建立稱為動態代理.
8、什麼是spring容器
spring容器是spring的核心,所有的java類和javabean都會被當做一個bean元件,這些bean元件由spring容器負責統一管理和建立,維護這些物件之間的關係
9、spring如何管理Bean物件
spring管理bean物件的例項化
構造器構造物件
靜態工廠構建物件
例項工廠構建物件
spring管理bean的作用域
scope
singleton:單例模式 預設值,容器中只有一個物件
prototype:多例,每次getBean()返回一個新的物件
web應用中
request,一個請求對應一個物件
session:一個session對應一個bean物件
global-session:多個session對應一個bean物件
spring管理物件的生命週期
例項化—>初始化–>業務邏輯–>銷燬
init-method bean的初始化方法,物件在例項化完成之後自動呼叫
destory-method bean的銷燬方法 單例物件在容器關閉的時候呼叫
spring管理物件的延遲例項化
在預設情況下,單例的bean在容器啟動的時候就會構建物件
lazy-init=“true” 將單例物件的例項化延遲到呼叫getBean()的時候建立
10、什麼是Restful
表現層狀態轉移,是一種軟體設計風格,主要作用是將網上的資源進行統一的定位和規定統一的操作方式,符合這種rest設計框架的應用 程式被稱為restful風格
資源(Resources)
REST的名稱"表現層狀態轉化"中,省略了主語。“表現層"其實指的是"資源”(Resources)的"表現層"。
所謂"資源",就是網路上的一個實體,或者說是網路上的一個具體資訊。它可以是一段文字、一張圖片、一首歌曲、一種服務,總之就是一個具體的實在。你可以用一個URI(統一資源定位符)指向它,每種資源對應一個特定的URI。要獲取這個資源,訪問它的URI就可以,因此URI就成了每一個資源的地址或獨一無二的識別符。
所謂"上網",就是與網際網路上一系列的"資源"互動,呼叫它的URI。
表現層(Representation)
“資源"是一種資訊實體,它可以有多種外在表現形式。我們把"資源"具體呈現出來的形式,叫做它的"表現層”(Representation)。
比如,文字可以用txt格式表現,也可以用HTML格式、XML格式、JSON格式表現,甚至可以採用二進位制格式;圖片可以用JPG格式表現,也可以用PNG格式表現。
URI只代表資源的實體,不代表它的形式。嚴格地說,有些網址最後的".html"字尾名是不必要的,因為這個字尾名錶示格式,屬於"表現層"範疇,而URI應該只代表"資源"的位置。它的具體表現形式,應該在HTTP請求的頭資訊中用Accept和Content-Type欄位指定,這兩個欄位才是對"表現層"的描述。
狀態轉化(State Transfer)
訪問一個網站,就代表了客戶端和伺服器的一個互動過程。在這個過程中,勢必涉及到資料和狀態的變化。
網際網路通訊協議HTTP協議,是一個無狀態協議。這意味著,所有的狀態都儲存在伺服器端。因此,如果客戶端想要操作伺服器,必須通過某種手段,讓伺服器端發生"狀態轉化"(State Transfer)。而這種轉化是建立在表現層之上的,所以就是"表現層狀態轉化"。
客戶端用到的手段,只能是HTTP協議。具體來說,就是HTTP協議裡面,四個表示操作方式的動詞:GET、POST、PUT、DELETE。它們分別對應四種基本操作:GET用來獲取資源,POST用來新建資源(也可以用於更新資源),PUT用來更新資源,DELETE用來刪除資源。
綜述
綜合上面的解釋,我們總結一下什麼是RESTful架構:
(1)每一個URI代表一種資源;
(2)客戶端和伺服器之間,傳遞這種資源的某種表現層;
(3)客戶端通過四個HTTP動詞,對伺服器端資源進行操作,實現"表現層狀態轉化"。
11、用過哪些資料庫連線池,有什麼區別
dbcp:沒有自動回收空閒連結的功能,c3p0有自動回收空閒連結的功能,
對資料庫的處理方式也不同,dbcp提供最大連線數,c3p0提供最大空閒時間
12、MyBatis中${}和#{}有什麼區別
KaTeX parse error: Expected 'EOF', got '#' at position 2: 和#̲都充當的是佔位符,不過它們的底…的底層是有statement實現的,#的底層是由PreparedStatement實現的
#是先編譯sql語句,然後在傳值,給傳入的值都加雙引號
$傳值是字串拼接,不會給傳入的值新增雙引號
不會
只有在傳入是資料庫物件的時候才會使用$
按照某個表進行查詢時傳入表名
按照某個列進行查詢時傳入列名
傳入非資料庫物件的時候,最後都使用#
13、Spring中AutoWired和,Resource之間區別是什麼
AutoWried:按照型別進行匹配—spring框架自帶的,檢視當前Spring容器中那個bean型別和引用型別一致,就進行注入,如果有多個匹配型別就會報錯.
Resource:預設按照名稱進行注入,如果找不到對應的名稱按照bean型別進行注入
14、Hibernate中延遲載入是什麼,如何實現,如何取消
lazy:延遲載入,懶載入.當真正使用到資料的時候,才會向資料庫傳送sql語句進行查詢,載入資料都記憶體中,可以避免無謂的開銷
實體物件:標籤中新增lazy屬性,true為延遲載入,false為不延遲載入
集合類:
屬性型別;
15、Hibernate的二級快取和MyBatis二級快取區別
兩個快取都是sessionfactory級別的快取
Hibernate二級快取:
是應用程式級別快取,生命週期依賴於應用程式
預設沒有開啟,在配置檔案中開啟
需要藉助第三方外掛,可以將資料快取在記憶體中,也可以將資料快取在記憶體中
mybatis二級快取:
mybatis的二級快取不需要藉助第三方外掛,預設下是開啟的,哪一個mapper需要開啟快取只需要在對應的對映檔案中進行開啟,配置就可以
16、Hibernate和MyBatis中分別是如何實現表之間的關聯查詢
hibernate:
一對一關聯 以及標籤進行關聯查詢
一對多關聯 一方在xml中根據和標籤進行管理 多方中根據標籤進行關聯
多對多關聯 和 標籤進行關係
mybatis:
一對一 藉助標籤做關聯對映
一對多 一方對映檔案中在result標籤中定義collection 在對方對映檔案中定義 多方在對映檔案中藉助resultMap標籤和assocation標籤
多對多:兩個一對多
17、Spring如何管理事物,事物的傳播特性和隔離級別有哪些
事物的概念:事物是一種機制,一組資料庫操作命令,這組命令要麼全部執行,要麼全部不執行.因此事物是一個不可拆分的工作邏輯單元.
spring管理事物有兩種方式
宣告式管理事物:使用springAop對事物進行管理,使用xml檔案或者註解來對事物進行配置,可以使業務邏輯和事物管理隔離,實現解耦合
程式設計式管理事物:直接在程式碼中開啟事物和提交事物,控制起來靈活但是不便於管理
事物的特性:原子性,一致性,隔離性,永續性
事物的傳播行為:
propagation_requierd:如果當前沒有事物就建立一個事物,如果已經存在一個事物中,加入這個事物中
propagation_supports:支援當前事物,如果沒有當前事物,就以非事物方法執行
propagation_mandatory:使用當前事物,如果沒有當前事物,就丟擲異常
propagation_required_new:新建事物,如果當前事物存在,把當前事物掛起.
propagation_not_support:以非事物方式執行操作,如果當前事物存在,就把當前事物掛起
propagation_never:以非事物的方式執行,如果當前事物存在,則丟擲異常
propagation_nested:如果當前存在事物,則巢狀事物內執行.如果當前沒有事物,則執行與propagation_required類似的操作
18、Struts如何實現檔案上傳下載.如何限制上傳檔案的大小和型別
獲取前端傳入的需要上傳的檔案(屬性,get和set方法)
獲取伺服器上傳的路徑
根據伺服器上傳路徑建立一個檔案物件
判斷資料夾是否存在,不存在則建立一個資料夾
根據伺服器上傳的路徑和上傳的檔名建立一個檔案輸出流物件
建立一個讀取資料的位元組陣列
使用輸入流物件迴圈獲取需要上傳的檔案,並使用輸入流寫入該檔案
關閉流
在sturts.xml檔案中藉助標籤限制檔案的大小
引入預設攔截器,藉助攔截器限制檔案上傳的型別