談?wù)剬?duì)mvc的理解?
MVC是Model-view-Controler的簡(jiǎn)稱.即模型-試圖-控制器.MVC是一種設(shè)計(jì)模式,它強(qiáng)制性的把應(yīng)用程序的輸入,處理和輸出分開(kāi).MVC中的模型 試圖 控制器他們分別擔(dān)負(fù)不同的任務(wù).
(1) 試圖:試圖是用戶看到并與之交互的界面.試圖向用戶顯示相關(guān)的數(shù)據(jù),并接受用戶的輸入.試圖不進(jìn)行任何業(yè)務(wù)邏輯處理.
(2) 模型:模型表示業(yè)務(wù)數(shù)據(jù)和業(yè)務(wù)處理.相當(dāng)于javaBean,一個(gè)模型能為多個(gè)試圖提供數(shù)據(jù).這提高了應(yīng)用程序的重要性.
(3)控制器:當(dāng)用戶單擊Web頁(yè)面中提交按鈕時(shí),控制器接受請(qǐng)求并調(diào)用相應(yīng)的模型去處理請(qǐng)求.然后根據(jù)處理的結(jié)果調(diào)用相應(yīng)的試圖來(lái)顯示處理的結(jié)果.
MVC的處理過(guò)程:首先控制器接受用戶的請(qǐng)求.調(diào)用相應(yīng)的模型來(lái)進(jìn)行業(yè)務(wù)處理,并返回?cái)?shù)據(jù)給處理過(guò)程.控制器調(diào)用相應(yīng)的試圖來(lái)顯示處理的結(jié)果.并通過(guò)試圖呈現(xiàn)給用戶.
項(xiàng)目中為什么使用SSH?實(shí)際開(kāi)發(fā)中如何界定選擇使用哪個(gè)框架進(jìn)行開(kāi)發(fā)?
(1)使用Struts2是因?yàn)镾truts2是基于MVC模式的,很好的將應(yīng)用程序進(jìn)行了分層,使開(kāi)發(fā)者更關(guān)注于業(yè)務(wù)邏輯的實(shí)現(xiàn);第二,struts有著豐富的taglib,如能靈活運(yùn)用,則能大大提高開(kāi)發(fā)效果.
(2)使用Hibernate:是因?yàn)閔ibernate為java應(yīng)用提供了一個(gè)易用的.高效率的對(duì)象關(guān)系映射框架.hibernate是一個(gè)輕量級(jí)的持久性框架,功能豐富.
(3)使用Spring,因?yàn)镾pring基于loc(反向控制)和AOP(面向切面)架構(gòu)多層j2ee系統(tǒng)的框架,但它不強(qiáng)迫比必須在每一層中必須使用Spring,因?yàn)樗哪K化很好,允許你根據(jù)自己的需求選擇使用,它的某一模塊:采用IOC使得很容易的實(shí)現(xiàn)bean的裝配,提供了簡(jiǎn)潔的Aop并據(jù)此實(shí)現(xiàn)事物管理.
Struts2中轉(zhuǎn)發(fā)和重定向的區(qū)別?
轉(zhuǎn)發(fā): 一次請(qǐng)求,一次響應(yīng).地址欄的url不會(huì)改變.在服務(wù)器端執(zhí)行,所以必須在同一臺(tái)服務(wù)器上.轉(zhuǎn)發(fā)速度快.
重定向:兩次請(qǐng)求.地址欄的url會(huì)隨之改變?yōu)槎ㄏ蚝蟮哪莻€(gè)url.在客戶端執(zhí)行,所以可以在不同的服務(wù)器上.重定向速度慢.
action是單實(shí)例還是多實(shí)例,為什么?
action是單實(shí)例,當(dāng)多個(gè)用戶訪問(wèn)一個(gè)請(qǐng)求的時(shí)候,服務(wù)器內(nèi)存中只有一個(gè)與之對(duì)應(yīng)的action類對(duì)象.
因?yàn)楫?dāng)服務(wù)器第一次加載struts的配置文件的時(shí)候,創(chuàng)建了一個(gè)Action后,每發(fā)送一個(gè)請(qǐng)求,服務(wù)器都會(huì)檢索相應(yīng)范圍內(nèi)(request,session)是否存在,這樣一個(gè)action實(shí)例,如果存在,則使用這個(gè)實(shí)例,如果不存在,則創(chuàng)建一個(gè)Action實(shí)例.
struts2.0的mvc模式與struts1.0的區(qū)別?
struts2的mvc模式:當(dāng)用戶在頁(yè)面提交用戶請(qǐng)求時(shí),該請(qǐng)求需要提交給struts2的控制器處理,struts2的控制器根據(jù)結(jié)果處理結(jié)果,決定將那個(gè)頁(yè)面呈現(xiàn)給客戶端.與struts1最大的不用是:struts2的控制器.struts2的控制器不在想struts1的控制器,需要繼承一個(gè)action父類,甚至可以無(wú)需實(shí)現(xiàn)任何接口,struts2的Action就是一個(gè)普通的POJO.實(shí)際上,struts的action就是一個(gè)包含execute方法的普通java類,該類中包含的多個(gè)屬性封裝用戶的請(qǐng)求參數(shù).
struts的工作機(jī)制
大致流程如下:
(1)瀏覽器發(fā)送請(qǐng)求.
(2)核心控制器FilterDispatcher根據(jù)請(qǐng)求決定調(diào)用合適的Action.
(3)WebWork的攔截器鏈自動(dòng)對(duì)請(qǐng)求應(yīng)用通用功能,例如workflow,validation或文件上傳等功能.
(4)回調(diào)Action的execute方法,該方法先獲取用戶請(qǐng)求參數(shù),然后執(zhí)行某種數(shù)據(jù)庫(kù)操作,既可以是將數(shù)據(jù)保存到數(shù)據(jù)庫(kù),也可以從數(shù)據(jù)庫(kù)中檢索信息.實(shí)際上,因?yàn)锳ction只是一個(gè)控制器,它會(huì)調(diào)用業(yè)務(wù)邏輯組件來(lái)處理用戶的請(qǐng)求.
(5)Action的execute方法處理結(jié)果信息將被輸出到瀏覽器中,可以是HTML頁(yè)面.圖像,也可以是PDF文檔或者其他文檔.此時(shí)支持的試圖技術(shù)非常多,即支持JSP,也支持Velocity.FreeMarker等模板技術(shù).
什么是hibernate的并發(fā)機(jī)制?怎么去處理并發(fā)問(wèn)題?
Hibernate并發(fā)機(jī)制:
1.hibernate的session對(duì)象是非線程安全的,對(duì)于單個(gè)請(qǐng)求,單個(gè)會(huì)話,單個(gè)的工作單元(即單個(gè)事務(wù),當(dāng)線程),它通常只使用一次,然后就丟棄.如果一個(gè)session實(shí)例允許共享的話,那些支持并發(fā)運(yùn)行的例如 Http request session beans將會(huì)導(dǎo)致出現(xiàn)資源爭(zhēng)用.如果在Http session中有hibernate的session的話,就冷會(huì)出現(xiàn)同步訪問(wèn)HttpSession.只要用戶足夠快的點(diǎn)擊瀏覽器刷新,就會(huì)導(dǎo)致兩個(gè)并發(fā)運(yùn)行的線程使用一個(gè)session
2.多個(gè)事務(wù)并發(fā)訪問(wèn)同一塊資源,可能會(huì)引發(fā)第一類丟失跟新,臟讀 幻讀 不可重復(fù)讀 第二類丟失跟新一系列問(wèn)題.
解決方案:設(shè)置事務(wù)隔離級(jí)別.
Serializable:串行化席函。隔離級(jí)別最高
Repeatable Read:可重復(fù)讀
Read Committed:已提交數(shù)據(jù)讀
Read Uncommitted:未提交數(shù)據(jù)讀。隔離級(jí)別最差
設(shè)置鎖:樂(lè)觀鎖和悲觀鎖。
樂(lè)觀鎖:使用版本號(hào)或時(shí)間戳來(lái)檢測(cè)更新丟失,在的映射中設(shè)置 optimisticlock=”all”可以在沒(méi)有版本或者時(shí)間戳屬性映射的情況下實(shí)現(xiàn)
版本檢查,此時(shí)Hibernate 將比較一行記錄的每個(gè)字段的狀態(tài) 行級(jí)悲觀鎖:Hibernate 總是使用數(shù)據(jù)庫(kù)的鎖定機(jī)制,從不在內(nèi)存中鎖定對(duì)象!只要為 JDBC 連接指定一下隔 離級(jí)別庐舟,然后讓數(shù)據(jù)庫(kù)去搞定一切就夠了队贱。類 LockMode 定義了 Hibernate 所需的不同的鎖定級(jí)別:LockMode.UPGRADE,LockMode.UPGRADE_NOWAIT,LockMode.READ;
Hibernate與jdbc有何聯(lián)系?與Spring有何聯(lián)系?
1.hibernate是jdbc的輕量級(jí)封裝,包括jdbc的與數(shù)據(jù)庫(kù)的連接(用hibernate,property的配置文件實(shí)現(xiàn)當(dāng)然本質(zhì)是封裝了jdbc的formame),和查詢,刪除等代碼,都用面向?qū)ο蟮乃枷胗么a聯(lián)系起來(lái),hibernate通過(guò)hbm配置文件把po類的字段和數(shù)據(jù)庫(kù)的關(guān)聯(lián)起來(lái)比如數(shù)據(jù)庫(kù)的id,在 po 類中就是 pravite Long id; public Long getId() ;public setId(Long id);然后hql語(yǔ)句也是面向?qū)ο蟮?它的查詢語(yǔ)句不是查詢數(shù)據(jù)庫(kù)而是查詢類,這些實(shí)現(xiàn)的就是xml文件,其實(shí)hibernate=封裝的jdbc+xml文件.
2.hibernate中一些對(duì)象可以給Spring來(lái)管理,讓Spring容器來(lái)創(chuàng)建hibernate中一些對(duì)象實(shí)例化.hibernate本來(lái)是對(duì)數(shù)據(jù)庫(kù)的一些操作,放在Dao層,而Spring給業(yè)務(wù)層的方法定義了事務(wù),業(yè)務(wù)層調(diào)用Dao層的方法,很好的將HIbernate的操作也加入到事務(wù)中來(lái)了.
Hibernate3 種狀態(tài)如何轉(zhuǎn)換色冀?
當(dāng)對(duì)象由瞬時(shí)狀態(tài)(Transient)一 save()時(shí),就變成了持久化狀態(tài)柱嫌。
當(dāng)我們?cè)?Session 里存儲(chǔ)對(duì)象的時(shí)候呐伞,實(shí)際是在 Session 的 Map 里存了一份,
也就是它的緩存里放了一份慎式,然后伶氢,又到數(shù)據(jù)庫(kù)里存了一份,在緩存里這一份叫持
久對(duì)象(Persistent)瘪吏。
Session 一 Close()了癣防,它的緩存也都關(guān)閉了,整個(gè) Session 也就失效了掌眠,
這個(gè)時(shí)候蕾盯,這個(gè)對(duì)象變成了游離狀態(tài)(Detached),但數(shù)據(jù)庫(kù)中還是存在的蓝丙。
當(dāng)游離狀態(tài)(Detached)update()時(shí)级遭,又變?yōu)榱顺志脿顟B(tài)(Persistent)。
當(dāng)持久狀態(tài)(Persistent)delete()時(shí)渺尘,又變?yōu)榱怂矔r(shí)狀態(tài)(Transient),
此時(shí)挫鸽,數(shù)據(jù)庫(kù)中沒(méi)有與之對(duì)應(yīng)的記錄。