熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Struts&Spring&Hibernate面試總結

2022-06-13   來源: Java開源技術 

介紹一下Struts的Action類
Struts框架采用ActionServlet和RequestProcessor組件進行集中控制並采用Action組件來處理單項業務ActionServlet把全部提交的請求委托到RequestProcessor對象RequestProcessor使用strutsconfigxml文件檢查請求URI找到響應的Action
Action類是用戶請求和業務邏輯之間的橋梁每個Action充當客戶的一項業務代理這樣使得客戶請求和Action類之間可以有多個點對點的映射Action類還提供了其它的輔助功能比如:日志(logging)和數據驗證(validation)
當控制器收到客戶請求的時候在將請求轉移到一個Action實例時如果這個實例不存在控制器會首先創建然後會調用這個Action實例的execute()方法在RequestProcessor類預處理請求時在創建了Action的實例後就調用自身的processActionperform()方法該方法再調用Action類的execute()方法 execute()方法再調用模型組件的業務方法完成用戶請求的業務邏輯處理然後根據執行結果把請求轉發給合適的Web組件Struts Framework為應用系統中的每一個Action類只創建一個實例因為所有的用戶都使用這一個實例所以必須確定你的Action 類運行在一個多線程的環境中
ActionForward類
Action類的execute()方法返回一ActionForwad對象ActionForward對象代表了Web資源的邏輯抽象這裡的資源可以是JSP頁\Java Servlet或Action從execute()方法中返回ActionForward對象有兩種方法:
第一:在execute()方法中動態創建一個ActionForward實例
return new ActionForward(&#;Failure&#;&#;/security/errorjsp&#;&#;true&#;);
以上ActionForward構造方法的第一個參數代表ActionForward實例的邏輯名第二個參數指定轉發路徑第三個參數指定是否進行重定向(true:重定向;false:請求轉發)
第二:在Struts配置文件中配置元素
parameter=reqCode
path=/login
scope=request
validate=false
type=comeRedLabeRedCIPframewebLoginAction>
Failure path=/security/errorjsp />

配置了元素後在Struts框架初始化時就會創建存放元素配置信息的ActionForward對象在Action的execute方法中只需調用Actionmapping實例的findForward()方法來獲得特定的ActionForward實例:
return mappingfindForward(&#;Failure&#;);
介紹一下Struts的ActionServlet類
ActionServlet繼承自javaxservlethttpHttpServlet類其在Struts framework中扮演的角色是中心控制器它提供一個中心位置來處理全部的終端請求按照Servelt的標准所有得Servlet必須在web配置文件(webxml)聲明同樣ActoinServlet必須在Web Application配置文件(webxml)中描述有關配置信息如下

name>actionname>
class>orgapachestrutsactionActionServletclass>

全部的請求URI以*do的模式存在並映射到這個servlet其配置如下:
mapping>
name>actionname>
*do
mapping>
中心控制器為所有的表示層請求提供了一個集中的訪問點當用戶向服務器端提交請求的時候實際上信息是首先發送到控制器ActionServlet一旦控制器獲得了請求其就會將請求信息傳交給一些輔助類(help classes)處理
Struts對MVC的體現
M: 在Struts中模型由JavaBean和EJB組件組成用來實現程序的業務邏輯部分
C: ActionServletRequestProcessor和Struts輔助類來實現控制器ActionServlet是Struts中的核心控制器ActionServlet會根據在Struts配置文件中的配置將控制權轉交給相應的Action類Action 類是業務的代理在Action類中可以調用模型組件或者編寫其他業務邏輯代碼來完成一項具體的業務
V: Struts框架中的視圖主要由JSP文件構成在JSP文件中可應用Struts標簽和自定義標簽來表現模型組件中的數據進行簡單的處理ActionForm Bean實際上是一個遵循了特殊約定的JavaBean在Struts中ActionForm Bean可看作為一個中間存儲器在視圖與控制器之間進行數據傳遞
Struts框架工作流程
當啟動一個采用Struts框架開發的Web應用程序時ActionServlet就會被加載並被初始化然後ActionServlet讀取Struts配置文件中的信息並根據文件中的各模塊配置來初始化相應的配置對象
當用戶的請求屬於ActionServlet所處理請求的模式時ActionServlet被調用Struts的處理工作開始:
中央控制器根據用戶的請求在Struts配置文件中的元素中查找匹配該請求的子元素如果不存在則返回異常;
在匹配的元素中查找有Scope屬性指定的范圍中是否存在由name屬性指定的ActionForm Bean如果不存在就創建一個新的ActionForm對象然後將用戶提交的表單中的數據保存在給ActionFrom對象中並將ActionForm對象放入Scope屬性指定的范圍內;
如果元素中Validate屬性值為true則調用ActionFrom中的Validate()方法進行表單驗證;
ActionForm的Validate()方法返回NULL或返回的ActionErrors對象中不包含任何ActionMessage對象則表單驗證成功否則表單驗證失敗ActionServlet將請求轉發給Input屬性指定的頁面;
中央控制器將控制權轉交給元素Type屬性指定的Action類如果相應的Action類對象不存在則創建該類對象接下來Action類的Execute()方法被調用;
在Action類的Execute()方法中進行業務邏輯處理並返回一個ActionForward對象控制權被交回ActionServletActionServlet將返回的ActionForward對象與元素中的子元素進行匹配並將請求轉發給指定的JSP組件;
如果ActionForward對象指定的是另外的Action動作則返回第()步在次執行流程否則生成動態網頁返回給用戶
Struts中DispatchAction和Action類有什麼不同?
DispatchAction是Struts包含的另一個能大量節省開發時間的Action類與其它Action類僅提供單個execute()方法實現單個業務不同DispatchAction允許你在單個Action類中編寫多個與業務相關的方法這樣可以減少Action類的數量並且把相關的業務方法集合在一起使得維護起來更容易
要使用DispatchAction的功能需要自己創建一個類通過繼承抽象的DispatchAction得到例如我們想要提供一個方法來實現對購物車添加商品清單創建了一個類ShoppingCartDispatchAction提供以下的方法:
public ActionForward addItem(ActionMapping mapping ActionForm form HttpServletRequest request HttpServletResponse response){throws Exception;}
那麼這個類很可能還需要一個deleteItem()方法從客戶的購物車中刪除商品清單還有clearCart()方法清除購物車等等這時我們就可以把這些方法集合在單個Action類不用為每個方法都提供一個Action類
在調用ShoppingCartDispatchAction裡的某個方法時只需在URL中提供方法名作為參數值就是說調用addItem()方法的 URL看起來可能類似於:http://myhost/storefront/action/cart?method=addItem
其中method參數指定ShoppingCartDispatchAction中要調用的方法參數的名稱可以任意配置這裡使用的method只是一個例子參數的名稱可以在Struts配置文件中自行設定
Struts中最核心的類和包有哪些?
orgapachestrutsaction
控制整個struts framework的運行的核心類組件都在這個包中比如我們上面提到的控制器ActionServlet已經ActionActionFormActionMapping等等struts多了 DynaActionForm 類增加了動態擴展生成FormBean功能
orgapachestrutsactions
這個包是主要作用是提供客戶的http請求和業務邏輯處理之間的特定適配器轉換功能版本中的部分動態增刪FromBean的類也在struts中被Action包的DynaActionForm組件所取代
ornfig
提供對配置文件strutsconfigxml元素的映射這也是sturts中新增的功能
orgapachestrutsutil
Strtuts為了更好支持web application的應用體統了一個些常用服務的支持比如Connection Pool和Message Source
orgapachestrutstaglib
這不是一個包而是是一個客戶標簽類的集合下面包括Bean TagsHTML TagsLogic TagsNested TagsTemplate Tags這幾個用於構建用戶界面的標簽類
orgapachestrutsvalidator
Struts framework中增加了validator framework用於動態的配置from表單的驗證
如何在Web項目中保護JSP源代碼不被未經授權的訪問和窺視?
把頁面文件移到WEBINF 目錄下基於Servlet的聲明WEBINF不作為Web應用的公共文檔樹的一部分因此WEBINF 目錄下的資源不是為客戶直接服務的唯一要注意的是必須把JSP和一個Struts action聯系起來
Struts的控制器如何知道什麼樣的信息轉發到什麼樣的Action類呢?
在struts 中控制器信息轉發的配置映射信息是存儲在特定的XML文件(比如strutsconfigxml)中的這些配置信息在系統啟動的時候被讀入內存供struts framework在運行期間使用在內存中每一個元素都與orgapachestrutsactionActionMapping類的一個實例對應
如何用Struts實現國際化?
建立struts的config文件:resources parameter=resourcesapplication/>messageresources標簽是指message資源的文件是存放多種語言的提示信息的文件parameter只是文件名沒有語言_國家
建立資源文件:默認的資源文件applicationproperties
# &#; international test – 這是注釋
testtitle=international application test
testbody=This is a international application test
簡體中文的資源文件:application_cnproperties國際化通過unicode碼來實現所以要把代碼轉為unicode碼
nativeascii application_cnproperties application_zh_CNproperties
JSP 訪問:testtitle/>
Struts Validator驗證器
在strutsconfigxml 文件中配置驗證器插件

property property=pathnames value=/WEBINF/validatorrulesxml/WEBINF/validationxml /> in> 擴展ValidatorForm而不是ActionForm以便它能加載你的Validator資源他根據strutsconfigxml文件中的action的name屬性為當前form的調用相應的驗證器因此在validatorrulesxml中的form元素的名稱屬性應該與action的name屬性值相匹配使用驗證器進行驗證的Form不能實現validate()方法
Struts動態Form
動態ActionForm使得用戶無須為應用程序的每一個HTML表單創建具體的ActionForm類

bean> 在Action中訪問動態ActionForm
DynaActionForm dynaForm =(DynaActionForm)form;
String userName = (String)dynaFormget(&#;userName&#;);
String userPwd = (String)dynaFormgetString(&#;userPwd&#;);

Hibernate的執行流程
通過Configuration()configure();讀取並解析hibernatecfgxml配置文件
由hibernatecfgxml中的
com/xx/Userhbmxml/>讀取解析映射信息
通過configbuildSessionFactory();//得到sessionFactory
sessionFactoryopenSession();//得到session
sessionbeginTransaction();//開啟事務
persistent operate;
sessiongetTransaction()commit();//提交事務
關閉session;
關閉sessionFactory;
為什麼要用Hibernate
封裝了jdbc簡化了很多重復性代碼
簡化了DAO層編碼工作使開發更對象化了
移植性好支持各種數據庫如果換個數據庫只要在配置文件中變換配置就可以了不用改變hibernate代碼
支持透明持久化因為hibernate操作的是純粹的(pojo)java類沒有實現任何接口沒有侵入性所以說它是一個輕量級框架
Hibernate的延遲加載
get不支持延遲加載load支持延遲加載
hibernate對實體對象和集合實現了延遲加載hibernate對提供了屬性的延遲加載功能
hibernate延遲加載就是當使用sessionload(Userclass )或者sessioncreateQuery()查詢對象或者屬性的時候這個對象或者屬性並沒有在內存中只有當程序操作數據的時候才會存在內存中這樣就實現延遲加載節省了內存的開銷從而提高了服務器的性能
Hibernate的緩存機制
一級緩存: session級的緩存也叫事務級的緩存只緩存實體生命周期和session一致不能對其進行管理不用顯示的調用二級緩存: sessionFactory緩存也叫進程級的緩存使用第方插件實現的也指緩存實體生命周期和sessionFactory一致可以進行管理
首先配置第放插件我們用的是EHCache在hibernatecfgxml文件中加入

true 在映射中也要顯示的調用readonly/>
二級緩存之查詢緩存: 對普通屬性進行緩存如果關聯的表發生了修改那麼查詢緩存的生命周期也結束了
在程序中必須手動啟用查詢緩存: querysetCacheable(true);
優化Hibernate
使用一對多的雙向關聯盡量從多的一端維護
如果將t_student(多)表裡的classesid字段設置為非空則無法保存不在student這一端維護關系存儲student時不會存學生對應的班級在存儲班級時需要發出多余的update語句來更新關系
不要使用一對一盡量使用多對一
配置對象緩存不要使用集合緩存
表字段要少表關聯不要怕多有二級緩存撐腰
Hibernate對象的三種狀態
Persitent狀態的對象不能引用Transient對象不然會拋出TransientObjectException異常
Transient(瞬時)狀態的特征:
* 在數據庫中沒有與之匹配的數據
* 沒有納入session的管理
可通過session的save()或 saveOrUpdate()方法將瞬時對象與數據庫相關聯並將數據對應的插入數據庫中此時該瞬時對象轉變成持久化對象
Persistent(持久)狀態的特征:
* persistent狀態的對象在數據庫中有與之匹配的數據
* 納入了session的管理
* 在清理緩存(髒數據檢查)的時候會和數據庫同步
Detached(游離)狀態的特征:
* 在數據庫中有與之匹配的數據
* 沒有納入session的管理
當與某持久對象關聯的session被關閉後該持久對象轉變為游離對象當游離對象被重新關聯到session上時並再次轉變成持久對象游離對象和比瞬時對象相比多了一個數據庫記錄標識值其它沒什麼不同
Hibernate的映射方式
一對一: Person和IdCard
添加Person的時候不會出現TransientObjectException異常因為一對一主鍵關聯映射中默認了cascade屬性
主鍵單向: 在Person端
id>
foreign>

idCard

toone name=idCard constrained=true/>
主鍵雙向: 在IdCard端也加入toone name=person/>
外鍵單向外鍵雙向
一對多: 單向雙向
單向: 在多的一端加入一個外鍵指向一的一端它維護的關系是一指向多
tomany>標簽的定義示例(在一的一端):
students>
classesid notnull=true/>
tomany class=Student/>

加載時: 加載一的一端時會把多的一端的數據也都加載上(相當於執行兩次查找操作)
雙向: 在一的一端的集合上使用在對方表中加入一個外鍵指向一的一端
students inverse=true cascade=all>
classesid/>
tomany class=Student/>

在多一端采用toone>
toone name=classes column=classesid/>
標簽指定的外鍵字段必須和toone>指定的外鍵字段一致否則引用字段的錯誤
一對多的關系一般采用雙向的在一的一端設置inverse屬性把關聯關系交給多的一端避免發出多余的update
inverse:主控方外鍵的關系有誰控制
inverse=false 是主控方外鍵是由它控制的
inverse=true 是被控方外鍵與它沒關系
要想實現主控方的控制必須將被控方作為主控方的屬性
cascade:級聯 主表增從表增主表修從表修主表刪從表刪
多對一: 會在多的一端加入一個外鍵指向一的一端
toone name=group column=groupid/>
多對多: 單向雙向
hibernate的核心類是什麼它們的相互關系是什麼?重要的方法是什麼?
Configuration 接口:配置Hibernate根據其啟動hibernate創建SessionFactory 對象;
SessionFactory 接口:初始化Hibernate充當數據存儲源的代理創建session 對象sessionFactory 是線程安全的意味著它的同一個實例可以被應用的多個線程共享是重量級二級緩存;
Session 接口:負責保存更新刪除加載和查詢對象是線程不安全的避免多個線程共享同一個session是輕量級一級緩存;
Session如下方法: saveloadupdatedelete
Query q=CreateQuery(&#;from Customer where customerName=:customerName&#;)
beginTransaction close transaction commit
Transaction 接口:管理事務;
Query 和Criteria 接口:執行數據庫的查詢
Hibernate的查詢方式 HQL與SQL
執行SQL查詢的步驟如下:
()獲取Hibernate Session對象;
()編寫SQL語句;String sqlString = &#;select {s*} from student s where sname like &#;xxx&#;&#;;
()以SQL語句作為參數調用Session的createSQLQuery方法創建查詢對象;
()如果SQL語句包含參數調用Query的setXxx方法為參數賦值;
List l = sessioncreateSQLQuery(sqlString) addEntity(&#;s&#;Studentclass) list();
()調用SQLQuery對象的addEntity或addScalar方法將選出的結果與實體或標量值關聯;
()調用Query的list方法返回查詢的結果集
Criteriaobject comptosition
Hql: * 屬性查詢 * 參數查詢命名參數查詢 * 關聯查詢 * 分頁查詢 * 統計函數
實體查詢例子:
String hql=from User user ;
List list=sessionCreateQuery(hql)list();
HQL面向對象而SQL操縱關系數據庫
HQL僅用於查詢數據不支持insertupdate和delete語句
Hibernate的主鍵生成機制
) assigned 主鍵由外部程序負責生成無需Hibernate參與
) increment
主鍵按數值順序遞增此方式的實現機制為在當前應用實例中維持一個變量以保存著當前的最大值之後每次需要生成主鍵的時候將此值加作為主鍵這種方式可能產生的問題是: 如果當前有多個實例訪問同一個數據庫那麼由於各個實例各自維護主鍵狀態不同實例可能生成同樣的主鍵從而造成主鍵重復異常因此如果同一數據庫有多個實例訪問此方式必須避免使用
) identity 采用數據庫提供的主鍵生成機制如DBSQL ServerMySQL中的主鍵生成機制
) sequence 采用數據庫提供的sequence 機制生成主鍵如Oralce 中的Sequence
) native 由Hibernate根據底層數據庫自行判斷采用identityhilosequence其中一種作為主鍵生成方式
) uuidhex 由Hibernate基位唯一值產生算法生成 進制數值(編碼後以長度 的字符串表示)作為主鍵
) uuidstring uuidhex類似只是生成的主鍵未進行編碼(長度)
) foreign 使用外部表的字段作為主鍵
在數據庫中條件查詢速度很慢的時候如何優化?
)建索引 )減少表之間的關聯
)優化sql盡量讓sql很快定位數據不要讓sql做全表查詢應該走索引把數據量大的表排在前面
)簡化查詢字段沒用的字段不要已經對返回結果的控制盡量返回少量數據
Hibernate 事務處理機制
Hibernate是對JDBC的輕量級對象封裝Hibernate本身是不具備Transaction 處理功能的Hibernate的 Transaction實際上是底層的JDBC Transaction的封裝或者是JTA Transaction的封裝
談談SSH整合
Struts(表示層)+Spring(業務層)+Hibernate(持久層)
Struts: Struts是一個表示層框架主要作用是界面展示接收請求分發請求
在MVC框架中Struts屬於VC層次負責界面表現負責MVC關系的分發(View: 沿用JSPHTTPFormTagResourse ;Controller: ActionServletstrutsconfigxmlAction)
Hibernate: Hibernate是一個持久層框架它只負責與關系數據庫的操作
Spring: Spring是一個業務層框架是一個整合的框架能夠很好地黏合表示層與持久層
JDBCHibernate 分頁怎樣實現?
) Hibernate 的分頁:
Query query = sessioncreateQuery(from Student);
querysetFirstResult(firstResult);//設置每頁開始的記錄號
querysetMaxResults(resultNumber);//設置每頁顯示的記錄數
Collection students = querylist();
) JDBC 的分頁:根據不同的數據庫采用不同的sql 分頁語句
例如: Oracle 中的sql 語句為: SELECT * FROM (SELECT a* rownum r FROM TB_STUDENT) WHERE r between and ″ 查詢從記錄號 到記錄號 之間的所有記錄
Servlet都有哪些方法?主要作用是什麼?
HttpServlet 類包含 init() destroy() service() 等方法其中 init() 和 destroy() 方法是繼承的
() init() 方法
在 Servlet 的生命期中僅執行一次 init() 方法它是在服務器裝入 Servlet 時執行的 可以配置服務器以在啟動服務器或客戶機首次訪問 Servlet 時裝入 Servlet 無論有多少客戶機訪問 Servlet 都不會重復執行 init() 例如初始化數據庫連接在調用 service() 方法之前應確保已完成了 init() 方法
() service() 方法
service() 方法是 Servlet 的核心每當一個客戶請求一個 HttpServlet 對象該對象的 service() 方法就要被調用而且傳遞給這個方法一個請求(ServletRequest)對象和一個響應(ServletResponse)對象作為參數例如 如果 HTTP 請求方法為 GET 則缺省情況下就調用 doGet() Servlet 應該為 Servlet 支持的 HTTP 方法覆蓋 do 功能因為 HttpServletservice() 方法會檢查請求方法是否調用了適當的處理方法不必要覆蓋 service() 方法只需覆蓋相應的 do 方法就可以了
Servlet 的響應可以是下列幾種類型:一個輸出流浏覽器根據它的內容類型(如 text/HTML )進行解釋一個 HTTP 錯誤響應 重定向到另一個 URL servlet JSP
() destroy() 方法
destroy() 方法僅執行一次即在服務器停止且卸裝 Servlet 時執行該方法典型的將 Servlet 作為服務器進程的一部分來關閉缺省的 destroy() 方法通常是符合要求的但也可以覆蓋它典型的是管理服務器端資源例如如果 Servlet 在運行時會累計統計數據則可以編寫一個 destroy() 方法該方法用於在未裝入 Servlet 時將統計數字保存在文件中另一個示例是關閉數據庫連接
當服務器卸裝 Servlet 時將在所有 service() 方法調用完成後或在指定的時間間隔過後調用 destroy() 方法一個 Servlet 在運行 service() 方法時可能會產生其它的線程因此請確認在調用 destroy() 方法時這些線程已終止或完成
() GetServletConfig()方法
GetServletConfig ()方法返回一個 ServletConfig 對象該對象用來返回初始化參數和 ServletContext ServletContext 接口提供有關 servlet 的環境信息


From:http://tw.wingwit.com/Article/program/Java/ky/201404/30501.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.