SSH中一些典型的问题
struts2
1-1:為什么每次請(qǐng)求都要?jiǎng)?chuàng)建一個(gè)Action對(duì)象???
是出于對(duì)線程安全的考慮,每個(gè)request都不會(huì)相互影響
1-2:ModelDriven攔截器的配置中refreshModelBeforeResult解決了什么問(wèn)題???
先把舊的model對(duì)象從ValueStack中移除,然后再把新的model對(duì)象壓入ValueStack!
官方解釋:
set to true if you want the model to be refreshed on the value stack after action execution and before result execution. The setting is useful if you want to change the model instance during the action execution phase, like when loading it from the data layer. This will result in getModel() being called at least twice.
一般不需要配,順便罵句誰(shuí)出的這么坑爹的問(wèn)題。
1-3:為什么在web.xml中配置的StrutsPrepareAndExecuteFilter要過(guò)濾所有的請(qǐng)求?
其實(shí)這里可以選擇性的過(guò)濾,但是一般大家都是/*,所有的請(qǐng)求都必須經(jīng)過(guò)StrutsPrepareAndExecuteFilter這個(gè)請(qǐng)求轉(zhuǎn)發(fā)器。
它會(huì)去找struts.xml文件,一般放在src下面的第一層目錄,然后找到相應(yīng)的資源去轉(zhuǎn)發(fā)。
1-4:請(qǐng)你給我談?wù)刅alueStack? ? ??
所謂值棧就是在一個(gè)棧里面堆了一大坨的數(shù)值,在action中可以這樣獲得ValueStack vs1 = ActionContext.getContext().getValueStack();
其實(shí)值棧就類似于一個(gè)map的容器,里面存放的是鍵值對(duì),但是有個(gè)區(qū)別,這個(gè)值棧的鍵都是String類型的。我們一般可以這樣來(lái)拿出值棧里面的內(nèi)容
名字屬性獲取 : 也可以用el表達(dá)式${aa}或者ognl表達(dá)式
其中ognl表達(dá)式主要就是去訪問(wèn)值棧,它的查找路線為用于按request > session > application順序訪問(wèn)其屬性(attribute),#user.username相當(dāng)于按順序在以上三個(gè)范圍(scope)內(nèi)讀取user.username屬性,直到找到為止
1-5:Struts2是如何實(shí)現(xiàn)MVC設(shè)計(jì)模式的???
自己去理解,按自己的request走一遍就知道了。不懂MVC還用STRUTS?
?
Spring
2-1:你為什么要用Spring??
XXX,為什么要用?好用才用的啊。spring有很多作用比如他的安全機(jī)制,事務(wù)管理,日志管理等等。。最主要的是把耦合度降到最低。
2-2:請(qǐng)你聊一聊IOC/DI??
把工廠和對(duì)象生成這兩者獨(dú)立分隔開(kāi)來(lái),提高靈活性和可維護(hù)性。具體的太多了。
2-3:什么是聲明式的事務(wù)管理?為什么要使用聲明式的事務(wù)管理?Spring如何實(shí)現(xiàn)聲明式的事務(wù)管理??
Spring 的聲明式事務(wù)管理在底層是建立在 AOP 的基礎(chǔ)之上的。其本質(zhì)是對(duì)方法前后進(jìn)行攔截,然后在目標(biāo)方法開(kāi)始之前創(chuàng)建或者加入一個(gè)事務(wù),在執(zhí)行完目標(biāo)方法之后根據(jù)執(zhí)行情況提交或者回滾事務(wù)。?
使用聲明式的事務(wù)管理可重用性高。這里就列舉一種最常用的配置吧。
?2-4:把spring和hibernate集成,定義事務(wù)管理特性的時(shí)候,為何要將除了添加、刪除、更新操作之外的方法,即主要執(zhí)行 查詢?nèi)蝿?wù)的方法定義為read-only??
應(yīng)用這項(xiàng)屬性時(shí),底層的數(shù)據(jù)庫(kù)可以對(duì)讀取進(jìn)行最優(yōu)化,但要配合PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW或PROPAGATION_NESTED使用,即只能在事物中使用。簡(jiǎn)單的說(shuō)就是增快查詢速度。
Hibernate
3-1:請(qǐng)你談?wù)勀銓?duì)OR映射的理解??
對(duì)象關(guān)系映射,把關(guān)系數(shù)據(jù)庫(kù)的數(shù)據(jù)結(jié)構(gòu)與你的對(duì)象關(guān)聯(lián)起來(lái),以操作對(duì)象操縱關(guān)系數(shù)據(jù)庫(kù)。
3-2:很多人說(shuō)Hibernate不適合大項(xiàng)目,性能有問(wèn)題,你是如何理解的??
好不好是看你怎么用,不一定用了hibernate就不使用sql了,一些復(fù)雜的 比如說(shuō)統(tǒng)計(jì)需要的數(shù)據(jù)一般都是直接用sql去執(zhí)行的。使用hibernate最重要的一點(diǎn)是
看你如何去使用懶加載,在適當(dāng)?shù)臅r(shí)候使用懶加載會(huì)提高你的性能。
3-3:Hibernate為什么一定要定義一個(gè)數(shù)據(jù)庫(kù)標(biāo)識(shí)???
因?yàn)橐獙?duì)應(yīng)數(shù)據(jù)庫(kù)表的主鍵,唯一性原則。
3-4:為什么Hibernate建議你的實(shí)體類實(shí)現(xiàn)hashCode和equals方法??
多對(duì)多雙向關(guān)系,如果hashCode和equals正常寫(xiě)之,將出現(xiàn)load不上的問(wèn)題。
經(jīng)常使用set集合來(lái)保存相關(guān)對(duì)象,而set集合是不允許重復(fù)的。而hibernate正是去"=="比較兩個(gè)對(duì)象是否是同一個(gè),所以它會(huì)去比較hashCode和用equals來(lái)比較。
3-5:談?wù)勀銓?duì)Hibernate實(shí)體類中的數(shù)據(jù)庫(kù)標(biāo)識(shí)與數(shù)據(jù)庫(kù)主鍵之間關(guān)系的認(rèn)識(shí)??
是對(duì)象與關(guān)系數(shù)據(jù)庫(kù)中的表識(shí)別的唯一標(biāo)識(shí)。
3-6:談?wù)勀銓?duì)Hibernate關(guān)聯(lián)映射與數(shù)據(jù)庫(kù)外鍵之間關(guān)系的認(rèn)識(shí)??
關(guān)系映射中一個(gè)外鍵就相當(dāng)于一個(gè)對(duì)象的實(shí)例,這樣就形成了1-1 ,1-N,N-1,N-N這種關(guān)系。
3-7:調(diào)用session.save()方法,hibernate一定會(huì)發(fā)出insert語(yǔ)句嗎?談?wù)勀愕睦斫?
save, 把一個(gè)瞬態(tài)的實(shí)例持久化標(biāo)識(shí)符,及時(shí)的產(chǎn)生,它要返回標(biāo)識(shí)符,在save之前hibernate會(huì)去根據(jù)主鍵查一次,看能否保存。
3-8:調(diào)用session.update()方法,hibernate一定會(huì)發(fā)出update語(yǔ)句嗎?談?wù)勀愕睦斫?
update是把一個(gè)脫管狀態(tài)的對(duì)象或自由態(tài)對(duì)象(一定要和一個(gè)記錄對(duì)應(yīng))更新到數(shù)據(jù)庫(kù)。在update之前hibernate會(huì)去根據(jù)主鍵查一次,看能否可以更新。
3-9:請(qǐng)你聊一下以下名詞、概念或用法:lazy、lazy=”extra”、inverse、fetch、fetch=”join”、fetch=”subselect”、batch-size?
lazy概念:只有真正使用該對(duì)象內(nèi)普通屬性時(shí),才會(huì)創(chuàng)建,對(duì)于hibernate而言,正真使用的時(shí)候才會(huì)發(fā)出sql,load支持lazy(懶加載),get不支持懶加載。
extra:一種比較聰明的懶加載策略,即調(diào)用集合的size/contains等方法的時(shí)候,hibernate
lazy=”extra”時(shí)并不會(huì)去加載整個(gè)集合的數(shù)據(jù),而是發(fā)出一條聰明的SQL語(yǔ)句,以便獲得需要的值,只有在真正需要用到這些集合元素對(duì)象數(shù)據(jù)的時(shí)候,才去發(fā)出查詢語(yǔ)句加載所有對(duì)象的數(shù)據(jù)。
inverse – 標(biāo)記由哪一方來(lái)維護(hù)關(guān)聯(lián)關(guān)系(雙向關(guān)聯(lián)中會(huì)用到,inverse默認(rèn)值為false。如果inverse設(shè)置為true,表示將由對(duì)方維護(hù)兩者之間的關(guān)聯(lián)關(guān)系。
fetch是抓取策略:
fetch = "select"是在查詢的時(shí)候先查詢出一端的實(shí)體,然后在根據(jù)一端的查詢出多端的實(shí)體,會(huì)產(chǎn)生1+n條sql語(yǔ)句;
fetch = "join"是在查詢的時(shí)候使用外連接進(jìn)行查詢,不會(huì)差生1+n的現(xiàn)象
fetch=”subselect”發(fā)送一條select語(yǔ)句抓取在前面查詢到的所有實(shí)體對(duì)象的關(guān)聯(lián)集合
batch-size?
是來(lái)設(shè)置批量更新的HQL/SQL數(shù)量 如果達(dá)到此數(shù)量會(huì)提交給數(shù)據(jù)庫(kù) 但是生成的HQL/SQL語(yǔ)句一個(gè)也不會(huì)少
3-10:配置了lazy=”true”一定會(huì)實(shí)現(xiàn)懶加載嗎??
get()是不能實(shí)現(xiàn)懶加載的。必須使用load()。fetch要使用select?
3-11:請(qǐng)你談?wù)凥ibernate中的“N+1”問(wèn)題?
一對(duì)多是查詢一次會(huì)帶出N次查詢。就是一些主外鍵關(guān)系的對(duì)象。當(dāng)進(jìn)行一個(gè)表的查詢時(shí),當(dāng)這個(gè)表與另外的表是多對(duì)一,或者是一對(duì)多關(guān)聯(lián)時(shí),就會(huì)出現(xiàn)N+1問(wèn)題,當(dāng)查詢一條語(yǔ)句時(shí),比如主鍵name=1,而與這個(gè) name相關(guān)聯(lián)的另一張表對(duì)應(yīng)name的有N個(gè)記錄,這時(shí)就出另外發(fā)出N條語(yǔ)句去查詢,而我又不要那些記錄,這時(shí)就是N+1問(wèn)題。
轉(zhuǎn)載于:https://www.cnblogs.com/zch-lxh1314/p/7055239.html
總結(jié)
以上是生活随笔為你收集整理的SSH中一些典型的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: POJ 2386 Lake Counti
- 下一篇: JavaWeb基础(jsp初识)