流行的框架與新技術
談談你對Struts的理解
答:
struts是一個按MVC模式設計的Web層框架其實它就是一個大大的servlet這個Servlet名為ActionServlet或是ActionServlet的子類我們可以在webxml文件中將符合某種特征的所有請求交給這個Servlet處理這個Servlet再參照一個配置文件(通常為/WEBINF/strutsconfigxml)將各個請求分別分配給不同的action去處理
一個擴展知識點struts的配置文件可以有多個可以按模塊配置各自的配置文件這樣可以防止配置文件的過度膨脹
ActionServlet把請求交給action去處理之前會將請求參數封裝成一個formbean對象(就是一個java類這個類中的每個屬性對應一個請求參數)封裝成一個什麼樣的formbean對象呢?看配置文件
要說明的是 ActionServlet把formbean對象傳遞給action的execute方法之前可能會調用formbean的validate方法進行校驗只有校驗通過後才將這個formbean對象傳遞給action的execute方法否則它將返回一個錯誤頁面這個錯誤頁面由input屬性指定(看配置文件)作者為什麼將這裡命名為input屬性而不是error屬性我們後面結合實際的運行效果進行分析
action執行完後要返回顯示的結果視圖這個結果視圖是用一個ActionForward對象來表示的actionforward對象通過strutsconfigxml配置文件中的配置關聯到某個jsp頁面因為程序中使用的是在strutsconfigxml配置文件為jsp頁面設置的邏輯名這樣可以實現action程序代碼與返回的jsp頁面名稱的解耦
你對struts可能還有自己的應用方面的經驗那也要一並說出來
談談你對Hibernate的理解
答:
面向對象設計的軟件內部運行過程可以理解成就是在不斷創建各種新對象建立對象之間的關系調用對象的方法來改變各個對象的狀態和對象消亡的過程不管程序運行的過程和操作怎麼樣本質上都是要得到一個結果程序上一個時刻和下一個時刻的運行結果的差異就表現在內存中的對象狀態發生了變化
為了在關機和內存空間不夠的狀況下保持程序的運行狀態需要將內存中的對象狀態保存到持久化設備和從持久化設備中恢復出對象的狀態通常都是保存到關系數據庫來保存大量對象信息從Java程序的運行功能上來講保存對象狀態的功能相比系統運行的其他功能來說應該是一個很不起眼的附屬功能java采用jdbc來實現這個功能這個不起眼的功能卻要編寫大量的代碼而做的事情僅僅是保存對象和恢復對象並且那些大量的jdbc代碼並沒有什麼技術含量基本上是采用一套例行公事的標准代碼模板來編寫是一種苦活和重復性的工作
通過數據庫保存java程序運行時產生的對象和恢復對象其實就是實現了java對象與關系數據庫記錄的映射關系稱為ORM(即Object Relation Mapping)人們可以通過封裝JDBC代碼來實現了這種功能封裝出來的產品稱之為ORM框架Hibernate就是其中的一種流行ORM框架使用Hibernate框架不用寫JDBC代碼僅僅是調用一個save方法就可以將對象保存到關系數據庫中僅僅是調用一個get方法就可以從數據庫中加載出一個對象
使用Hibernate的基本流程是配置Configuration對象產生SessionFactory創建session對象啟動事務完成CRUD操作提交事務關閉session
使用Hibernate時先要配置hibernatecfgxml文件其中配置數據庫連接信息和方言等還要為每個實體配置相應的hbmxml文件hibernatecfgxml文件中需要登記每個hbmxml文件
在應用Hibernate時重點要了解Session的緩存原理級聯延遲加載和hql查詢
AOP的作用
你對Spring的理解
Spring實現了工廠模式的工廠類(在這裡有必要解釋清楚什麼是工廠模式)這個類名為BeanFactory(實際上是一個接口)在程序中通常BeanFactory的子類ApplicationContextSpring相當於一個大的工廠類在其配置文件中通過元素配置用於創建實例對象的類名和實例對象的屬性
Spring提供了對IOC良好支持IOC是一種編程思想是一種架構藝術利用這種思想可以很好地實現模塊之間的解耦IOC也稱為DI(Depency Injection)什麼叫依賴注入呢?
譬如Class Programmer
{
Computer computer = null;
public void code()
{
//Computer computer = new IBMComputer();
//Computer computer = beanfacotrygetComputer();
computerwrite();
}
public void setComputer(Computer computer)
{
thiscomputer = computer;
}
}
另外兩種方式都由依賴第一個直接依賴於目標類第二個把依賴轉移到工廠上第三個徹底與目標和工廠解耦了在spring的配置文件中配置片段如下
Spring提供了對AOP技術的良好封裝 AOP稱為面向切面編程就是系統中有很多各不相干的類的方法在這些眾多方法中要加入某種系統功能的代碼例如加入日志加入權限判斷加入異常處理這種應用稱為AOP實現AOP功能采用的是代理技術客戶端程序不再調用目標而調用代理類代理類與目標類對外具有相同的方法聲明有兩種方式可以實現相同的方法聲明一是實現相同的接口二是作為目標的子類在JDK中采用Proxy類產生動態代理的方式為某個接口生成實現類如果要為某個類生成子類則可以用CGLI B在生成的代理類的方法中加入系統功能和調用目標類的相應方法系統功能的代理以Advice對象進行提供顯然要創建出代理對象至少需要目標類和Advice類spring提供了這種支持只需要在spring配置文件中配置這兩個元素即可實現代理和aop功能例如
談談Struts中的Action servlet
Struts優缺點
優點
實現MVC模式結構清晰使開發者只關注業務邏輯的實現
.有豐富的tag可以用 Struts的標記庫(Taglib)如能靈活動用則能大大提高開發效率
頁面導航
使系統的脈絡更加清晰通過一個配置文件即可把握整個系統各部分之間的聯系這對於後期的維護有著莫大的好處尤其是當另一批開發者接手這個項目時這種優勢體現得更加明顯
提供Exception處理機制
數據庫鏈接池管理
支持IN
缺點
一 轉到展示層時需要配置forward如果有十個展示層的jsp需要配置十次struts而且還不包括有時候目錄文件變更需要重新修改forward注意每次修改配置之後要求重新部署整個項目而tomcate這樣的服務器還必須重新啟動服務器
二 二 Struts 的Action必需是thread-safe方式它僅僅允許一個實例去處理所有的請求所以action用到的所有的資源都必需統一同步這個就引起了線程安全的問題
三 測試不方便 Struts的每個Action都同Web層耦合在一起這樣它的測試依賴於Web容器單元測試也很難實現不過有一個Junit的擴展工具Struts TestCase可以實現它的單元測試
四 類型的轉換 Struts的FormBean把所有的數據都作為String類型它可以使用工具CommonsBeanutils進行類型轉化但它的轉化都是在Class級別而且轉化的類型是不可配置的類型轉化時的錯誤信息返回給用戶也是非常困難的
五 對Servlet的依賴性過強 Struts處理Action時必需要依賴ServletRequest 和ServletResponse所有它擺脫不了Servlet容器
六 前端表達式語言方面Struts集成了JSTL所以它主要使用JSTL的表達式語言來獲取數據可是JSTL的表達式語言在Collection和索引屬性方面處理顯得很弱
七 對Action執行的控制困難 Struts創建一個Action如果想控制它的執行順序將會非常困難甚至你要重新去寫Servlet來實現你的這個功能需求
八 對Action 執行前和後的處理 Struts處理Action的時候是基於class的hierarchies很難在action處理前和後進行操作
九 對事件支持不夠 在struts中實際是一個表單Form對應一個Action類(或DispatchAction)換一句話說在Struts中實際是一個表單只能 對應一個事件struts這種事件方式稱為application eventapplication event和component event相比是一種粗粒度的事件
STRUTS的應用(如STRUTS架構)
Struts是采用Java Servlet/JavaServer Pages技術開發Web應用程序的開放源碼的framework 采用Struts能開發出基於MVC(ModelViewController)設計模式的應用構架 Struts有如下的主要功能 一包含一個controller servlet能將用戶的請求發送到相應的Action對象 二JSP自由tag庫並且在controller servlet中提供關聯支持幫助開發員創建交互式表單應用 三提供了一系列實用對象XML處理通過Java reflection APIs自動處理JavaBeans屬性國際化的提示和消息
說說struts與struts的區別
都是MVC的WEB框架
struts的老牌框架應用很廣泛有很好的群眾基礎使用它開發風險很小成本更低!struts雖然基於這個框架但是應用群眾並多相對不成熟未知的風險和變化很多開發人員相對不好招使用它開發項目的風險系數更大用人成本更高!
struts畢竟是站在前輩的基礎設計出來它會改善和完善struts中的一些缺陷struts中一些懸而未決問題在struts得到了解決
struts的前端控制器是一個Servlet名稱為ActionServletstruts的前端控制器是一個filter在struts中叫FilterDispatcher在struts中叫StrutsPrepareAndExecuteFilter
struts的action需要繼承Action類struts的action可以不繼承任何類struts對同一個路徑的所有請求共享一個Action實例struts對同一個路徑的每個請求分別使用一個獨立Action實例對象所有對於struts的Action不用考慮線程安全問題
在struts中使用formbean封裝請求參數在struts中直接使用action的屬性來封裝請求參數
struts中的多個業務方法放在一個Action中時(即繼承DispatchAction時)要麼都校驗要麼都不校驗對於struts可以指定只對某個方法進行校驗當一個Action繼承了ActionSupport且在這個類中只編寫了validateXxx()方法那麼則只對Xxx()方法進行校驗
(一個請求來了的執行流程進行分析struts是自動支持分模塊開發並可以不同模塊設置不同的url前綴這是通過package的namespace來實現的struts是支持多種類型的視圖struts的視圖地址可以是動態的即視圖的名稱是支持變量方式的舉例論壇發帖失敗後回來還要傳遞boardid視圖內容顯示方面它的標簽用ognl要el強大很多在國際化方面支持分模塊管理兩個模塊用到同樣的key對應不同的消息)
與Struts不同Struts對用戶的每一次請求都會創建一個Action所以Struts中的Action是線程安全的
給我印象最深刻的是struts配置文件中的redirect視圖的url不能接受參數而struts配置文件中的redirect視圖可以接受參數
hibernate中的update()和saveOrUpdate()的區別session的load()和get()的區別
簡述 Hibernate 和 JDBC 的優缺點? 如何書寫一個 one to many 配置文件
iBatis與Hibernate有什麼不同?
相同點屏蔽jdbc api的底層訪問細節使用我們不用與jdbc api打交道就可以訪問數據
jdbc api編程流程固定還將sql語句與java代碼混雜在了一起經常需要拼湊sql語句細節很繁瑣
ibatis的好處屏蔽jdbc api的底層訪問細節將sql語句與java代碼進行分離;提供了將結果集自動封裝稱為實體對象和對象的集合的功能queryForList返回對象集合用queryForObject返回單個對象提供了自動將實體對象的屬性傳遞給sql語句的參數
Hibernate是一個全自動的orm映射工具它可以自動生成sql語句ibatis需要我們自己在xml配置文件中寫sql語句hibernate要比ibatis功能負責和強大很多因為hibernate自動生成sql語句我們無法控制該語句我們就無法去寫特定的高效率的sql對於一些不太復雜的sql查詢hibernate可以很好幫我們完成但是對於特別復雜的查詢hibernate就很難適應了這時候用ibatis就是不錯的選擇因為ibatis還是由我們自己寫sql語句
寫Hibernate的一對多和多對一雙向關聯的orm配置?
hibernate的inverse屬性的作用?
解決方案一按照Object[]數據取出數據然後自己組bean
解決方案二對每個表的bean寫構造函數比如表一要查出fieldfield兩個字段那麼有一個構造函數就是Bean(type filedtype
field) 然後在hql裡面就可以直接生成這個bean了
在DAO中如何體現DAO設計模式?
解決方案一按照Object[]數據取出數據然後自己組bean
解決方案二對每個表的bean寫構造函數比如表一要查出fieldfield兩個字段那麼有一個構造函數就是Bean(type filedtype
field) 然後在hql裡面就可以直接生成這個bean了
spring+Hibernate中委托方案怎麼配置?
解決方案一按照Object[]數據取出數據然後自己組bean
解決方案二對每個表的bean寫構造函數比如表一要查出fieldfield兩個字段那麼有一個構造函數就是Bean(type filedtype
field) 然後在hql裡面就可以直接生成這個bean了
spring+Hibernate中委托方案怎麼配置?
解決方案一按照Object[]數據取出數據然後自己組bean
解決方案二對每個表的bean寫構造函數比如表一要查出fieldfield兩個字段那麼有一個構造函數就是Bean(type filedtype
field) 然後在hql裡面就可以直接生成這個bean了
hibernate進行多表查詢每個表中各取幾個字段也就是說查詢出來的結果集沒有一個實體類與之對應如何解決
解決方案一按照Object[]數據取出數據然後自己組bean
解決方案二對每個表的bean寫構造函數比如表一要查出fieldfield兩個字段那麼有一個構造函數就是Bean(type filedtype
field) 然後在hql裡面就可以直接生成這個bean了
介紹一下Hibernate的二級緩存
按照以下思路來回答()首先說清楚什麼是緩存()再說有了hibernate的Session就是一級緩存即有了一級緩存為什麼還要有二級緩存()最後再說如何配置Hibernate的二級緩存
()緩存就是把以前從數據庫中查詢出來和使用過的對象保存在內存中(一個數據結構中)這個數據結構通常是或類似Hashmap當以後要使用某個對象時先查詢緩存中是否有這個對象如果有則使用緩存中的對象如果沒有則去查詢數據庫並將查詢出來的對象保存在緩存中以便下次使用下面是緩存的偽代碼
引出hibernate的第二級緩存用下面的偽代碼分析了Cache的實現原理
Dao
{
hashmap map = new map();
User getUser(integer id)
{
User user = mapget(id)
if(user == null)
{
user = sessionget(id);
mapput(iduser);
}
return user;
}
}
Dao
{
Cache cache = null
setCache(Cache cache)
{
thiscache = cache
}
User getUser(int id)
{
if(cache!=null)
{
User user = cacheget(id);
if(user ==null)
{
user = sessionget(id);
cacheput(iduser);
}
return user;
}
return sessionget(id);
}
}
()Hibernate的Session就是一種緩存我們通常將之稱為Hibernate的一級緩存當想使用session從數據庫中查詢出一個對象時Session也是先從自己內部查看是否存在這個對象存在則直接返回不存在才去訪問數據庫並將查詢的結果保存在自己內部由於Session代表一次會話過程一個Session與一個數據庫連接相關連所以Session最好不要長時間保持打開通常僅用於一個事務當中在事務結束時就應關閉並且Session是線程不安全的被多個線程共享時容易出現問題通常只有那種全局意義上的緩存才是真正的緩存應用才有較大的緩存價值因此Hibernate的Session這一級緩存的緩存作用並不明顯應用價值不大Hibernate的二級緩存就是要為Hibernate配置一種全局緩存讓多個線程和多個事務都可以共享這個緩存我們希望的是一個人使用過其他人也可以使用session沒有這種效果
()二級緩存是獨立於Hibernate的軟件部件屬於第三方的產品多個廠商和組織都提供有緩存產品例如EHCache和OSCache等等在Hibernate中使用二級緩存首先就要在hibernatecfgxml配置文件中配置使用哪個廠家的緩存產品接著需要配置該緩存產品自己的配置文件最後要配置Hibernate中的哪些實體對象要納入到二級緩存的管理中明白了二級緩存原理和有了這個思路後很容易配置起Hibernate的二級緩存擴展知識一個SessionFactory可以關聯一個二級緩存也即一個二級緩存只能負責緩存一個數據庫中的數據當使用Hibernate 的二級緩存後注意不要有其他的應用或SessionFactory來更改當前數據庫中的數據這樣緩存的數據就會與數據庫中的實際數據不一致
Spring 的依賴注入是什麼意思? 給一個 Bean 的 message 屬性 字符串類型 注入值為 ;Hello; 的 XML 配置文件該怎麼寫?
Jdo是什麼?
JDO是Java對象持久化的新的規范為java data object的簡稱也是一個用於存取某種數據倉庫中的對象的標准化APIJDO提供了透明的對象存儲因此對開發人員來說存儲數據對象完全不需要額外的代碼(如JDBC API的使用)這些繁瑣的例行工作已經轉移到JDO產品提供商身上使開發人員解脫出來從而集中時間和精力在業務邏輯上另外JDO很靈活因為它可以在任何數據底層上運行JDBC只是面向關系數據庫(RDBMS)JDO更通用提供到任何數據底層的存儲功能比如關系數據庫文件XML以及對象數據庫(ODBMS)等等使得應用可移植性更強
什麼是spring的IOC AOP
STRUTS的工作流程!
spring 與EJB的區別!!
From:http://tw.wingwit.com/Article/program/Java/ky/201405/30832.html