struts2
1-1:為什么每次請求都要創建一個Action對象???
是出于對線程安全的考慮,每個request都不會相互影響
1-2:ModelDriven攔截器的配置中refreshModelBeforeResult解決了什么問題???
先把舊的model對象從ValueStack中移除,然后再把新的model對象壓入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.
一般不需要配,順便罵句誰出的這么坑爹的問題。
1-3:為什么在web.xml中配置的StrutsPrepareAndExecuteFilter要過濾所有的請求?
其實這里可以選擇性的過濾,但是一般大家都是/*,所有的請求都必須經過StrutsPrepareAndExecuteFilter這個請求轉發器。
它會去找struts.xml文件,一般放在src下面的第一層目錄,然后找到相應的資源去轉發。
1-4:請你給我談談ValueStack? ? ??
所謂值棧就是在一個棧里面堆了一大坨的數值,在action中可以這樣獲得ValueStack vs1 = ActionContext.getContext().getValueStack();
其實值棧就類似于一個map的容器,里面存放的是鍵值對,但是有個區別,這個值棧的鍵都是String類型的。我們一般可以這樣來拿出值棧里面的內容
名字屬性獲取 : 也可以用el表達式${aa}或者ognl表達式
其中ognl表達式主要就是去訪問值棧,它的查找路線為用于按request > session > application順序訪問其屬性(attribute),#user.username相當于按順序在以上三個范圍(scope)內讀取user.username屬性,直到找到為止
1-5:Struts2是如何實現MVC設計模式的???
自己去理解,按自己的request走一遍就知道了。不懂MVC還用STRUTS?
?
Spring
2-1:你為什么要用Spring??
XXX,為什么要用?好用才用的啊。spring有很多作用比如他的安全機制,事務管理,日志管理等等。。最主要的是把耦合度降到最低。
2-2:請你聊一聊IOC/DI??
把工廠和對象生成這兩者獨立分隔開來,提高靈活性和可維護性。具體的太多了。
2-3:什么是聲明式的事務管理?為什么要使用聲明式的事務管理?Spring如何實現聲明式的事務管理??
Spring 的聲明式事務管理在底層是建立在 AOP 的基礎之上的。其本質是對方法前后進行攔截,然后在目標方法開始之前創建或者加入一個事務,在執行完目標方法之后根據執行情況提交或者回滾事務。?
使用聲明式的事務管理可重用性高。這里就列舉一種最常用的配置吧。

- <</span>bean?id="dataSource"??
- ????????class="org.springframework.jdbc.datasource.DriverManagerDataSource">??
- ????????<</span>property?name="driverClassName"?value="${jdbc.driverClassName}"?/>??
- ????????<</span>property?name="url"?value="${jdbc.url}"?/>??
- ????????<</span>property?name="username"?value="${jdbc.username}"?/>??
- ????????<</span>property?name="password"?value="${jdbc.password}"?/>??
- ????</</span>bean>??
- ????<</span>bean?id="transactionManager"??
- ????????class="org.springframework.orm.hibernate3.HibernateTransactionManager">??
- ????????<</span>property?name="sessionFactory">??
- ????????????<</span>ref?local="sessionFactory"?/>??
- ????????</</span>property>??
- ????</</span>bean>??
- ??????
- ??????
- ????<</span>bean?id="nativeJdbcExtractor"?lazy-init="true"??
- ????????class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor"?/>??
- ????<</span>bean?id="lobHandler"?lazy-init="true"??
- ????????class="org.springframework.jdbc.support.lob.OracleLobHandler">??
- ????????<</span>property?name="nativeJdbcExtractor">??
- ????????????<</span>ref?bean="nativeJdbcExtractor"?/>??
- ????????</</span>property>??
- ????</</span>bean>??
- ??????
- ??????
- ????<</span>bean?id="sessionFactory"??
- ????????class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">??
- ????????<</span>property?name="dataSource"?ref="dataSource"?/>??
- ????????<</span>property?name="lobHandler"?ref="lobHandler"?/>??
- ????????<</span>property?name="mappingDirectoryLocations">??
- ????????????<</span>list>??
- ????????????????<</span>value>classpath*:XXX</</span>value>??
- ????????????</</span>list>??
- ????????</</span>property>??
- ????????<</span>property?name="hibernateProperties">??
- ????????????<</span>props>??
- ?????????????????
- ????????????????<</span>prop?key="hibernate.dialect">${hibernate.dialect}</</span>prop>??
- ????????????????<</span>prop?key="hibernate.show_sql">${hibernate.show_sql}</</span>prop>??
- ????????????????<</span>prop?key="hibernate.cache.provider_class">${hibernate.cache.provider_class}</</span>prop>??
- ????????????????<</span>prop?key="hibernate.default_schema">${hibernate.default_schema}</</span>prop>??
- ????????????</</span>props>??
- ????????</</span>property>??
- ????</</span>bean>??
- ????<</span>bean?id="txProxyTemplate"?abstract="true"??
- ????????class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">??
- ????????<</span>property?name="transactionManager">??
- ????????????<</span>ref?local="transactionManager"></</span>ref>??
- ????????</</span>property>??
- ????????<</span>property?name="transactionAttributes">??
- ????????????<</span>props>??
- ????????????????<</span>prop?key="save*">PROPAGATION_REQUIRED,-exception</</span>prop>??
- ????????????????<</span>prop?key="update*">PROPAGATION_REQUIRED,-exception</</span>prop>??
- ????????????????<</span>prop?key="delete*">PROPAGATION_REQUIRED,-exception</</span>prop>??
- ????????????????<</span>prop?key="*">PROPAGATION_REQUIRED,readOnly</</span>prop>??
- ????????????</</span>props>??
- ????????</</span>property>??
- ????</</span>bean>??
?2-4:把spring和hibernate集成,定義事務管理特性的時候,為何要將除了添加、刪除、更新操作之外的方法,即主要執行 查詢任務的方法定義為read-only??
應用這項屬性時,底層的數據庫可以對讀取進行最優化,但要配合PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW或PROPAGATION_NESTED使用,即只能在事物中使用。簡單的說就是增快查詢速度。
Hibernate
3-1:請你談談你對OR映射的理解??
對象關系映射,把關系數據庫的數據結構與你的對象關聯起來,以操作對象操縱關系數據庫。
3-2:很多人說Hibernate不適合大項目,性能有問題,你是如何理解的??
好不好是看你怎么用,不一定用了hibernate就不使用sql了,一些復雜的 比如說統計需要的數據一般都是直接用sql去執行的。使用hibernate最重要的一點是
看你如何去使用懶加載,在適當的時候使用懶加載會提高你的性能。
3-3:Hibernate為什么一定要定義一個數據庫標識???
因為要對應數據庫表的主鍵,唯一性原則。
3-4:為什么Hibernate建議你的實體類實現hashCode和equals方法??
多對多雙向關系,如果hashCode和equals正常寫之,將出現load不上的問題。
經常使用set集合來保存相關對象,而set集合是不允許重復的。而hibernate正是去"=="比較兩個對象是否是同一個,所以它會去比較hashCode和用equals來比較。
3-5:談談你對Hibernate實體類中的數據庫標識與數據庫主鍵之間關系的認識??
是對象與關系數據庫中的表識別的唯一標識。
3-6:談談你對Hibernate關聯映射與數據庫外鍵之間關系的認識??
關系映射中一個外鍵就相當于一個對象的實例,這樣就形成了1-1 ,1-N,N-1,N-N這種關系。
3-7:調用session.save()方法,hibernate一定會發出insert語句嗎?談談你的理解?
save, 把一個瞬態的實例持久化標識符,及時的產生,它要返回標識符,在save之前hibernate會去根據主鍵查一次,看能否保存。
3-8:調用session.update()方法,hibernate一定會發出update語句嗎?談談你的理解?
update是把一個脫管狀態的對象或自由態對象(一定要和一個記錄對應)更新到數據庫。在update之前hibernate會去根據主鍵查一次,看能否可以更新。
3-9:請你聊一下以下名詞、概念或用法:lazy、lazy=”extra”、inverse、fetch、fetch=”join”、fetch=”subselect”、batch-size?
lazy概念:只有真正使用該對象內普通屬性時,才會創建,對于hibernate而言,正真使用的時候才會發出sql,load支持lazy(懶加載),get不支持懶加載。
extra:一種比較聰明的懶加載策略,即調用集合的size/contains等方法的時候,hibernate
lazy=”extra”時并不會去加載整個集合的數據,而是發出一條聰明的SQL語句,以便獲得需要的值,只有在真正需要用到這些集合元素對象數據的時候,才去發出查詢語句加載所有對象的數據。
inverse – 標記由哪一方來維護關聯關系(雙向關聯中會用到,inverse默認值為false。如果inverse設置為true,表示將由對方維護兩者之間的關聯關系。
fetch是抓取策略:
fetch = "select"是在查詢的時候先查詢出一端的實體,然后在根據一端的查詢出多端的實體,會產生1+n條sql語句;
fetch = "join"是在查詢的時候使用外連接進行查詢,不會差生1+n的現象
fetch=”subselect”發送一條select語句抓取在前面查詢到的所有實體對象的關聯集合
batch-size?
是來設置批量更新的HQL/SQL數量 如果達到此數量會提交給數據庫 但是生成的HQL/SQL語句一個也不會少
3-10:配置了lazy=”true”一定會實現懶加載嗎??
get()是不能實現懶加載的。必須使用load()。fetch要使用select?
3-11:請你談談Hibernate中的“N+1”問題?
一對多是查詢一次會帶出N次查詢。就是一些主外鍵關系的對象。當進行一個表的查詢時,當這個表與另外的表是多對一,或者是一對多關聯時,就會出現N+1問題,當查詢一條語句時,比如主鍵name=1,而與這個 name相關聯的另一張表對應name的有N個記錄,這時就出另外發出N條語句去查詢,而我又不要那些記錄,這時就是N+1問題。