(一)Struts、Spring、Hibernate、Mybatis框技術
1.Struts2.0有幾種標簽庫
【參考答案】
UI標簽、控制標簽、數據標簽、雜項標簽
2.struts2必備包有哪些?
【參考答案】
commons-fileupload-1.2.1.jar
freemarker-2.3.13.jar
ognl-2.6.11.jar
struts2-core-2.1.6.jar
xwork-2.1.2.jar
3.Hiberbate優化方法有那些?
【參考答案】
1)盡量使用many-to-one,避免使用one-to-many
2)靈活使用單向one-to-many
3)不用一對一,使用多對一代替一對一
4)配置對象緩存,不使用集合緩存
5)一對多使用Bag多對一使用Set
6)繼承使用顯示多態HQL:from object polymorphism="exlicit"避免查處所有對象
7)消除大表,使用二級緩存
4.應用服務器與Web Server的區別
【參考答案】
Web服務器(Web Server)
Web服務器可以解析(handles)HTTP協議。當Web服務器接收到一個HTTP請求,會返回一個HTTP響應,例如送回一個HTML頁面。為了處理一個請求,Web服務器可以響應一個靜態頁面或圖片,進行頁面跳轉,或者把動態響應的產生委托給一些其它的程序例如CGI腳本,JSP腳本,servlets,ASP腳本,服務器端JavaScript,或者一些其它的服務器端技術。無論它們(譯者注:腳本)的目的如何,這些服務器端的程序通常產生一個HTML的響應來讓瀏覽器可以瀏覽。
應用程序服務器
通過各種協議,可以包括HTTP,把商業邏輯暴露給客戶端應用程序。Web服務器主要是處理向瀏覽器發送HTML以供瀏覽,而應用程序服務器提供訪問商業邏輯的途徑以供客戶端應用程序使用。應用程序使用此商業邏輯就象你調用對象的一個方法(或過程語言中的一個函數)一樣。
應用程序服務器的客戶端(包含有圖形用戶界面(GUI)的)可能會運行在一臺PC、一個Web服務器或者甚至是其它的應用程序服務器上。在應用程序服務器與其客戶端之間來回穿梭的信息不僅僅局限于簡單的顯示標記。相反,這種信息就是程序邏輯。正是由于這種邏輯取得了數據和方法調用的形式而不是靜態HTML,所以客戶端才可以隨心所欲的使用這種被暴露的商業邏輯。
在大多數情形下,應用程序服務器是通過組件的應用程序接口把商業邏輯暴露(給客戶端應用程序)的,例如基于J2EE應用程序服務器的EJB組件模型。此外,應用程序服務器可以管理自己的資源,例如,安全,事務處理,資源池,和消息。就象Web服務器一樣,應用程序服務器配置了多種可擴展和容錯技術。
5.如何設置Hibernate二級緩存
【參考答案】
1、首先要打開二級緩存,在hibernate.cfg.xml中添加如下配置:
true
2、Hibernate的二級緩存使用第三方的緩存工具來實現,所以我們需要指定Hibernate使用哪個緩存工具。如下配置指定Hibernate使用EhCache緩存工具。
org.hibernate.cache.EhCacheProvider
3、Hibernate在默認情況下并不會對所有實體對象進行緩存,所以,我們需要指定緩存哪些對象,在實體對象的映射文件中(相應的標簽內部),添加如下配置:
usage="read-only"是“只讀”緩存策略。
6.ApplicationContext和BeanFactory有什么區別?
【參考答案】
BeanFactory實際上是實例化,配置和管理眾多bean的容器。這些bean通常會彼此合作,因而它們之間會產生依賴,而這種依賴只是體現在Bean與Bean之間的依賴這些依賴關系可以通過配置來反映,而ApplicationContextbeans包是BeanFactory的子類,提供了以編程的方式管理和操控bean的基本功能,而context包增加了ApplicationContext,它以一種更加面向框架的方式增強了BeanFactory的功能,簡單說他增強了面向Web容器的功能。ApplictionContext完全采用聲明式方式來使用容器,甚至不用去手工創建它,Web應用的啟動進程中用它啟動ApplicationContext。當然用編程的方式創建一個ApplicationContext對象可以有以下幾種方式或實現:
1、ClassPathXmlApplicationContext:從類路徑中的XML文件載入上下文定義信息,把上下文定義文件當作類路徑資源。
2、FileSystemXmlApplicationContext:從文件系統中的XML文件載入上下文定義信息。
3、XmlWebApplicationContext:從Web系統中的XMl文件載入上下文信息。
7.Spring MVC與Struts2 MVC的不同之處?【杭州網闕科技】
【參考答案】
1、請求處理機制:spring mvc是基于方法的設計,而sturts是基于類,每次發一次請求都會實例一個action,每個action都會被注入屬性,而spring基于方法,粒度更細。
2、參數傳遞:struts是在接受參數的時候,可以用屬性來接受參數,這就說明參數是讓多個方法共享的。
3、設計思想上:struts更加符合oop的編程思想,spring就比較謹慎,在servlet上擴展。
4、intercepter的實現機制:struts有以自己的interceptor機制,spring mvc用的是獨立的AOP方式。這樣導致struts的配置文件量還是比spring mvc大,雖然struts的配置能繼承,所以我覺得論使用上來講,spring mvc使用更加簡潔,開發效率Spring MVC確實比struts2高。
8.Spring使用了哪些設計模式,這樣用有什么好處?
【參考答案】
最典型的像:工廠模式,Spring的IOC容器就是一個大的Bean實例的工廠,負責Bean的周期管理。單例模式,這個和Spring的IOC一起的,既然是IOC是一個大工廠,那個Bean對象為減少內存開銷就需要提供單例特征。適配器模式,在Spring的AOP編程中隨處可見Adapter模式的應用。代理模式,為其它對象提供一種代理訪問的機制。觀察者模式,當對象發生變化時,其它對象需要得到相應更新,Spring中應用也較為普遍。
【分析】
就說上面幾個了,這種問題無法一追溯,把所有Spring用到的設計模式一一回答出來,重要的是你只需要讓面試官覺得你對Spring有較深的理解和應用即可。
9.Hibernate有哪幾種查詢數據的方法?
【參考答案】
hibernate查詢有三種方式:HQL查詢、結構化SQL查詢、QBC查詢
10.3個框架在項目在項目當中的用,BaseDao是用來做什么的。
【參考答案】
DAO組件主要提供數據庫訪問操作,針對不同數據源表持久化操作進行了封裝,這樣可以提供其它層的訪問接口,使得組件之間解耦。而BaseDAO是這些所有這些不同的持久化的DAO的公共API進行了封裝,進一步抽象提取,使其它各組件DAO從BaseDAO中派生,增強系統的重用性、維護性、擴展性。
11.ThreadLocal在項目中的實際意義?
【參考答案】
ThreadLocal和其它同步機制相比從另一個角度來解決多線程的并發訪問,它為每一個線程維護一個和該線程綁定的變量的副本,從而隔離了多個線程的數據,每一個線程都擁有自己的變量副本,從而也就沒有必要對該變量進行同步了。還提供了線程安全的共享對象,在編寫多線程代碼時,可以把不安全的整個變量封裝進ThreadLocal
ThreadLocal可以大量減少參數的傳遞,可以使代碼簡潔,但一個線程會綁定多個自己定義的局部對象,ThreadLocal是抽象在線程上的對象創建工廠,目前的Tomcat5使用了線程池,一個線程處理一個request,這樣ThreadLocal對象可以抽象的綁定在request生命周期,不會存在線程危機,而且線程池也平衡了這些ThreadLocal
12.Spring對多種ORM框架提供了很好的支持,結合事務管理描述spring從哪些方面提供了對Hibernate的支持。
【參考答案】
1、SessionFactory管理。使用Spring整合Hibernate時我們不需要hibernate.cfg.xml文件。首先,在applicationContext.xml中配置數據源(dataSource)bean和session工廠(sessionFactory)bean。
2、持入層管理。Spring提供了HibernateTemplate,用于持久層訪問,無需打開Session及關閉Session。它只要獲得SessionFactory的引用,將可以只讀地打開Session,并在持久化訪問結束后關閉Session,對持久層邏輯,通用的操作(如對數據庫中數據的增,刪,改,查)有HibernateTemplate完成。
3、對DAO的支持:通過繼承HibernateDaoSupport實現DAO基本操作。
4、對事務支持:Spring的聲明式事務和編程式事務,很好的將持久化的操作納入事務管理。
13.Hibernate的session.save()與session.saveOrUpdate()的區別?
【參考答案】
1.save()方法,調用save方法時,首先會在session緩存中查找保存對象如果實體對象已經處于Persient狀態,直接返回;否則并將保存至數據庫,對象變為持久狀態。
2.saveOrUpdate()方法:和save方法一樣首先在session緩存中查找,判斷對象是否為為保存狀態,如果對象處于Persient,不執行操作,處于Transient執行save操作,處于Detached調用saveOrUpdate將對象與session重新關聯(簡單的說就是該方法會先看該對象是否已經存在,如果已經存在就更新,否則新增保存),如果此時saveOrUpdate的對象與另一個與Session關聯的對象持有相同的持久化標識則拋出相同的標識符異常。
14.Hibernate中sedssion.get()與session.load()的區別?
【參考答案】
Session.load/get方法均可以根據指定的實體類和id從數據庫讀取記錄,并返回與之對應的實體對象。其區別在于:
1)如果未能發現符合條件的記錄,get方法返回null,而load方法會拋出一個ObjectNotFoundException。
2)load支持延遲加載,get不支持
3)load方法可返回實體的代理類實例,而get方法永遠直接返回實體類。
4)load方法可以充分利用內部緩存和二級緩存中的現有數據,get方法則僅僅在內部緩存中進行數據查找,如沒有發現對應數據,將越過二級緩存,直接調用SQL完成數據讀取。
15.annotation的使用方法和用途主要分為幾類?
【參考答案】
1、內建Annotation——Java5.0版在java語法中經常用到的內建Annotation:
2、開發者自定義Annotation:由開發者自定義Annotation類型;
3、使用第三方開發的Annotation類型
16.Struts2是怎么實現MVC的?
【參考答案】
MVC就是model view controller,三種組件,Struts2實現Controller主要由一系列的前端過濾器(Filter)實現Controller。Model層主要由Struts2的Action組件實現。View層主要是由Struts2的標簽庫、Freemarker等組件實現視圖層
17.介紹下hibernate【上海數字政通】
【參考答案】
Hibernate是一個開放源代碼Java語言下的對象關系映射解決方案。它為面向對象的領域模型到傳統的關系型數據庫的映射,提供了一個使用方便的框架。Hibernate也是目前Java開發中最為流行的數據庫持久層框架。將軟件開發人員從大量相同的數據持久層相關編程工作中解放出來,Hibernate不僅負責從Java類到數據庫表的映射(還包括從Java數據類型到SQL數據類型的映射),還提供了面向對象的數據查詢檢索機制,從而極大地縮短的手動處理SQL和JDBC上的開發時間。
18.在Struts2中,配置文件中通配符是怎么表示和使用的?使用通配符后有什么好處。【上海咯勤】
示例1:調用相同Action中的不同方法
/login.jsp
/error.jsp
/welcome.jsp
其中表達式{1}的值name屬性值中第一個*的值。
如果用戶請求的URL為loginAction.action,則調用Jcuckoo.LoginRegistAction中的login方法;
如果用戶請求的URL為registerAction.action,則調用Jcuckoo.LoginRegistAction中的register方法
示例2:帶轉視圖
/input.jsp
/{1}.jsp
當處理結果是input時,會轉到/input.jsp頁面
當處理結果是success時,
如果crud_create.action,則會執行Jcuckoo.CrudAction中的create方法,并且跳轉到/create.jsp;
如果crud_delete.action,則會執行Jcuckoo.CrudAction中的delete方法,并且跳轉到/delete.jsp;
優點:
使用通配符能規范命名格式,簡潔配置文件,加速開發效率,也是Struts倡導的一種開發模式。
19.Hibernate中的HQL和criteria的區別?
【參考答案】
1.QBC(Query by Criteria)查詢對查詢條件進行了面向對象封裝,符合編程人員的思維方式;
2.HQL(Hibernate Query Language)查詢提供了更加豐富的和靈活的查詢特性,在涵蓋Criteria查詢的所有功能的前提下,提供了類似標準SQL語句的查詢方式,同時也提供了更加面向對象的封裝。
20.介紹hibernate延持加載屬性
【參考答案】
Hibernate通過lazy來指定加載策略,一般值為true或false,。設為flase表示立即加載,true表過延遲加載。
21.列舉你接觸過的框架,說明特點和原理
【參考答案】
Struts2的特點:自己總結一下。
Hibernate特點:
1.基于JDBC的主流持久化框架,是一個優秀的ORM實現,對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復性代碼。
2. hibernate使用Java反射機制,而不是字節碼增強程序來實現透明性。
3. hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關系數據庫,從一對一到多對多的各種復雜關系。
Spring特點:
Spring框架的主要優勢之一低侵入式的架構思想,實現了IOC容器。另外一個AOP的編程也在很多應用場合下地位較重。提供了對各種不同類型框架的支持,如:Web容器、持入層、事務層、其它J2EE組件等。
22.解釋一下IOC,以及spring的舉例
【參考答案】
IOC稱為控制反轉,也叫依賴注入,ioc是Spring的核心組件,它通過配置文件,將需要創建的對象以池的方式管理,將實例注入到需要的對象中區,是對象依賴于注入而不依賴于實現,解決了各個組件的耦合度,使得項目在后期的維護和擴展上非常方便。如在ssh框架整合中,我們將datasource對象注入給sessionFactory,再將sessionFactory注入給dao組件,再將dao組件注入給struts的Action組件,在將action對象注入給struts的攔截器。
23.解釋一下mvc以及熟悉的mvc框架
【參考答案】
MVC是Model-View-Controller的簡寫。Model代表的是應用的業務邏輯(通過JavaBean,EJB組件實現),View是應用的表示層(由JSP、HTML、各種Taglib等組成),Controller是提供應用程序的中心控制處理。通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現,這些組件可以進行交互和重用,另外有利于維護。
Struts1、Struts2、Spring MVC、WebWork等這些都是屬于基于MVC模式實現的框架
24.Spring工作原理
【參考答案】
內部最核心的就是IOC了,動態注入,讓一個對象的創建不用new了,可以自動的生產,這其實就是利用java里的反射,反射其實就是在運行時動態的去創建、調用對象,Spring就是在運行時,跟xml ?Spring的配置文件來動態的創建對象,和調用對象里的方法的還有一個核心就是AOP這個就是面向切面編程,可以為某一類對象進行監督和控制(也就是在調用這類對象的具體方法的前后去調用你指定的模塊)從而達到對一個模塊擴充的功能。這些都是通過配置類達到的
Spring目的:
就是讓對象與對象(模塊與模塊)之間的關系沒有通過代碼來關聯,都是通過配置類說明管理的(Spring根據這些配置內部通過反射去動態的組裝對象)要記住:Spring是一個容器,凡是在容器里的對象才會有Spring所提供的這些服務和功能
25.Hibernate中離線查詢與在線查詢的區別
【參考答案】
Criteria和DetachedCriteria的主要區別在于創建的形式不一樣,Criteria是在線的,所以它是由Hibernate Session進行創建的;而DetachedCriteria是離線的,創建時無需Session,DetachedCriteria提供了2個靜態方法forClass(Class)或forEntityName(Name)進行DetachedCriteria實例的創建。
26.Struts2實現攔截器的原理?
【參考答案】
攔截器是AOP中的概念,它本身是一段代碼,可以通過定義“織入點”,來指定攔截器的代碼在“織入點”的前后執行,從而起到攔截的作用。而Struts2的Interceptor,其攔截的對象是Action代碼,可以定義在Action代碼之前或者之后執行攔截器的代碼。
1.整個結構就如同一個堆棧,除了Action以外,堆棧中的其他元素是Interceptor
2. Action位于堆棧的底部。由于堆棧"先進后出"的特性,而這些都是圍繞著Action的,當我們請求Action時,必須首先把位于Action上端的Interceptor拿出來執行。
27.Struts2的實現原理。【高達軟件】
【參考答案】
1、客戶端初始化一個指向Servlet容器(例如Tomcat)的請求
2、這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin);
3、接著FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請求是否需要調用某個Action;
4、如果ActionMapper決定需要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy;
5、ActionProxy通過Configuration Manager詢問框架的配置文件,找到需要調用的Action類;
6、ActionProxy創建一個ActionInvocation的實例。
7、ActionInvocation實例使用命名模式來調用,在調用Action的過程前后,涉及到相關攔截器(Intercepter)的調用。
8、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2框架中繼承的標簽。在這個過程中需要涉及到ActionMapper
28.簡述spring的事務傳播行為和隔離級別
【參考答案】
spring的事務傳播行為:
Spring在TransactionDefinition接口中規定了7種類型的事務傳播行為,它們規定了事務方法和事務方法發生嵌套調用時事務如何進行傳播:
PROPAGATION_REQUIRED:如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。
PROPAGATION_SUPPORTS:支持當前事務,如果當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY:使用當前的事務,如果當前沒有事務,就拋出異常。
PROPAGATION_REQUIRES_NEW:新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則拋出異常。
PROPAGATION_NESTED:如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。
Spring的隔離級別
1、Serializable:最嚴格的級別,事務串行執行,資源消耗最大;
2、REPEATABLE READ:保證了一個事務不會修改已經由另一個事務讀取但未提交(回滾)的數據。避免了“臟讀取”和“不可重復讀取”的情況,但是帶來了更多的性能損失。
3、READ COMMITTED:大多數主流數據庫的默認事務等級,保證了一個事務不會讀到另一個并行事務已修改但未提交的數據,避免了“臟讀取”。該級別適用于大多數系統。
4、Read Uncommitted:保證了讀取過程中不會讀取到非法數據。
29.Ibatis框架和Hibernate框架各有什么特點?
【參考答案】
比較方面
Ibatis框架
Hibernate框架
從設計思路來看
從關系型開始到對象型的思路來解決數據庫的操作問題
從對象的角度的思路來解決數據庫的操作問題
從方便性上來看
半自動
全自動
從sql語句書寫來看
要寫sql語句
一般不用寫,但是有時候我們還是要用書寫hql語句的
從映射角度來看
映射sql語句的輸入輸出參數
對數據庫表結構來進行映射
30.為什么要用ORM?和JDBC有何不一樣?
【參考答案】
orm是一種思想,就是把object對象轉變成數據庫中的記錄,或者把數據庫中的記錄轉變成object對象,我們可以用jdbc來實現這種思想,orm的思想本質就是建立是JDBC上,對JDBC的一種封裝,這種封裝可以省去了直接使用jdbc的繁瑣細節,提高了開發效率,現在用的較多的ORM工具很多,一般我們公司采用的ORM框架主要有hibernate和MyBatis。當然也聽說一些其他orm工具,如toplink,ojb等。
31.談談你對SpringAOP思想的理解。
【參考答案】
AOP(Aspect-OrientedProgramming,面向方面編程),可以說是OOP(Object-Oriented Programing,面向對象編程)的補充和完善。OOP引入封裝、繼承和多態性等概念來建立一種對象層次結構,用以模擬公共行為的一個集合。當我們需要為分散的對象引入公共行為的時候,OOP則顯得無能為力。也就是說,OOP允許你定義從上到下的關系,但并不適合定義從左到右的關系。例如日志功能,日志代碼往往水平地散布在所有對象層次中,而與它所散布到的對象的核心功能毫無關系。對于其他類型的代碼,如安全性、異常處理和透明的持續性也是如此。這種散布在各處的無關的代碼被稱為橫切(cross-cutting)代碼,在OOP設計中,它導致了大量代碼的重復,而不利于各個模塊的重用。而AOP技術則恰恰相反,它利用一種稱為“橫切”的技術,剖解開封裝的對象內部,并將那些影響了多個類的公共行為封裝到一個可重用模塊,并將其名為“Aspect”,即方面。所謂“方面”,簡單地說,就是將那些與業務無關,卻為業務模塊所共同調用的邏輯或責任封裝起來,便于減少系統的重復代碼,降低模塊間的耦合度,并有利于未來的可操作性和可維護性。AOP代表的是一個橫向的關系,如果說“對象”是一個空心的圓柱體,其中封裝的是對象的屬性和行為;那么面向方面編程的方法,就仿佛一把利刃,將這些空心圓柱體剖開,以獲得其內部的消息。而剖開的切面,也就是所謂的“方面”了。然后它又以巧奪天功的妙手將這些剖開的切面復原,不留痕跡。
使用“橫切”技術,AOP把軟件系統分為兩個部分:核心關注點和橫切關注點。業務處理的主要流程是核心關注點,與之關系不大的部分是橫切關注點。橫切關注點的一個特點是,他們經常發生在核心關注點的多處,而各處都基本相似。比如權限認證、日志、事務處理。Aop的作用在于分離系統中的各種關注點,將核心關注點和橫切關注點分離開來。
實現AOP的技術,主要分為兩大類:一是采用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行為的執行;二是采用靜態織入的方式,引入特定的語法創建“方面”,從而使得編譯器可以在編譯期間織入有關“方面”的代碼。
32.談談你對Spring的理解。
【參考答案】
1.Spring實現了工廠模式的工廠類(在這里有必要解釋清楚什么是工廠模式),這個類名為BeanFactory(實際上是一個接口),在程序中通常BeanFactory的子類ApplicationContext。Spring相當于一個大的工廠類,在其配置文件中通過元素配置用于創建實例對象的類名和實例對象的屬性。
2. Spring提供了對IOC良好支持,IOC是一種編程思想,是一種架構藝術,利用這種思想可以很好地實現模塊之間的解耦。IOC也稱為DI(Depency Injection)。
3. Spring提供了對AOP技術的良好封裝,AOP稱為面向切面編程,就是系統中有很多各不相干的類的方法,在這些眾多方法中要加入某種系統功能的代碼,例如,加入日志,加入權限判斷,加入異常處理,這種應用稱為AOP。實現AOP功能采用的是代理技術,客戶端程序不再調用目標,而調用代理類,代理類與目標類對外具有相同的方法聲明,有兩種方式可以實現相同的方法聲明,一是實現相同的接口,二是作為目標的子類在,JDK中采用Proxy類產生動態代理的方式為某個接口生成實現類,如果要為某個類生成子類,則可以用CGLI B。在生成的代理類的方法中加入系統功能和調用目標類的相應方法,系統功能的代理以Advice對象進行提供,顯然要創建出代理對象,至少需要目標類和Advice類。
33.說說struts1與struts2的區別。【首都信息面試題】
【參考答案】
從以下幾個方面來一一總結Struts1與Struts2的區別:
①Servlet依賴性
由于Action在被調用時,HttpServletRequest和HttpServletResponse被傳遞到execute()方法中,Struts1中的Action對Servlet的API是有依賴性的.但如果在Struts2中,Action就不會對容器有依賴了,因為Action是由簡單的POJO組成的.在Struts2中,servlet上下文以簡單的Map的形式表現出來,這使得Action可以得到獨立的測試.如果需要,Struts2也可以訪問原始的請求與響應。不過,其他的框架元素減少或排除直接訪問HttpServetRequest或HttpServletResponse的必要。
②Action類
使用抽象類而不是接口設計是Struts1設計上的問題,這已經在Struts2中得到了解決.Struts1中的Action類需要繼承框架中依賴的抽象基礎類.但在Struts2中,Action類可能會也可能不會實現接口來啟用可選的或者自定義的服務.在Struts2中,Action是不會依賴于容器的,因為它是由簡單的POJO組成的.Struts2提供了一個基礎的ActionSupport類來實現一些常用的接口。盡管這樣,Action接口仍然不是必須要繼承的,任何含有execute方法的POJO對象都可以當作Action對象來用。
③驗證
Struts1與Struts2都支持通過validate方法的手動驗證.Struts1使用ActionForm中的validate方法或者通過擴展Commons Validator來進行校驗.然而,Struts2支持通過Validate方法與Xwork校驗框架的手動驗證.Xwork框架支持驗證鏈到子屬性----使用為屬性類文件和校驗上下文定義的驗證.
④線程模型
在Struts1中,Action資源一定是線程安全或者同步的.所以Action是singletons并且線程安全的,一定只有一個Action類的實例處理該Action的所有請求,singleton策略限制了Struts1的Action所能完成的,并且需要更加謹慎的開發.但是在Struts2中,Action對象對每一個請求都生成實例,所以在Struts2中不存在線程安全的問題。
⑤易測性
測試Struts1的程序會有些復雜.測試Struts1 Action的主要它依賴容器。但是在Struts2中,Action可以經由創建Action的實例,設置屬性和調用方法來得到測試。Struts2中的測試是很簡單的,不依賴于容器。
⑥獲取輸入
Struts1使用ActionForm來捕獲輸入,而且所有的ActionForm需要繼承一個框架依賴的基類.由于JavaBean不能當作ActionForm來用,開發人員不得不創建冗繁的類來獲取輸入.不過Struts2使用Action屬性(例如輸入屬性不依賴于底層框架)這避免了需要創建第二個輸入對象,從此冗繁減少了.此外在Struts2中,Action的屬性可以通過標簽在web頁面中得到訪問,POJO表單對象和POJO Action.甚至富對象類型,包括業務或域對象,都可以被當作輸入/輸出對象來使用。
⑦表達式語言
Struts1與JSTL整合,所以它使用JSTL表達式語言.Struts1的表達式語言含有遍歷圖表的基礎對象,但是在集合和索引屬性的支持上表現不好.Struts2同樣支持JSTL,但是它也支持一種更強大且靈活的表達式語言----“對象圖標記語言”(OGNL)
⑧將綁定值到視圖中
在視圖層,Struts1使用標準的JSP來綁定對象(在模型層被處理的)到頁面上下文來進行訪問.然而Struts2使用一種叫做值棧的技術,這使得標簽可以訪問值而不需將視圖與正在呈遞的對象類型連接起來.值棧允許重用一些屬性名相同但類型不同的視圖類型.
⑨類型轉換
通常Struts1的ActionForm屬性都是String型的。Struts1使用Commons-Beanutils進行類型轉換,這些針對每一個類的類型轉換無法為每一個實例配置。然而Struts2使用OGNL來進行類型轉換.框架包含了針對基礎類型,常見對象類型與原始類型的轉換器。
⑩Action的生存周期
Struts1支持對每一個模塊的請求處理器的分離(生命周期),但是同一模塊下的所有Action必須共享相同的生命周期。Struts2支持通過攔截器棧為每一個Action創建不同的生命周期.自定義棧可以視需要對不同的Action使用.
34.簡述Hibernate和JDBC的優缺點?如何書寫一個one to many配置文件
【參考答案】
1、封裝了jdbc,簡化了很多重復性代碼。
2、簡化了DAO層編碼工作,使開發更對象化了。
3、移植性好,支持各種數據庫,如果換個數據庫只要在配置文件中變換配置就可以了,不用改變hibernate代碼。
4、支持透明持久化,因為hibernate操作的是純粹的(pojo)java類,沒有實現任何接口,沒有侵入性。
說明:
One to many配置見下題
35.寫Hibernate的一對多和多對一雙向關聯的orm配置?
【參考答案】
配置一對多
多對一
36.hibernate的inverse屬性的作用?
【參考答案】
在Hibernate中,術語inverse是反轉的意思,在關聯關系中,inverse="false"為主控方,由主控方負責維護對象的關聯關系,如果設為主控方對象,主控對象更新,則負責更新另一方對象更新。
37.Spring的依賴注入是什么意思?給一個Bean的message屬性,字符串類型,注入值為"Hello"的XML配置文件該怎么寫?
【參考答案】
依賴注入(Dependency Injection)和控制反轉(Inversion of Control)是同一個概念。具體含義是:當某一個Java類,需要另一個Java類的協助時,在傳統的程序設計過程中,通常由當前類(調用者)來創建被調用者的實例,然后使用被調用者的方法。但在Spring里,創建被調用者的工作不再由調用者來完成,而是由其它類(往往是工廠類)或容器(Spring IOC容器)完成,當前調用者從其它類或容器中來獲取被調用者的實例,這種方式稱為控制反轉;創建被調用者實例的工作通常由Spring容器來完成,然后注入調用者,因此也稱為依賴注入,這是Spring的一種編程思想的體現。
依賴注入在設計模式也體現得非常多,比如說工廠模式和構建模式,這種就是一個依賴注入的實現
38.JDO是什么?
【參考答案】
JDO是Java對象持久化的新的規范,為java data object的簡稱,也是一個用于存取某種數據倉庫中的對象的標準化API。JDO提供了透明的對象存儲,因此對開發人員來說,存儲數據對象完全不需要額外的代碼(如JDBC API的使用)。這些繁瑣的例行工作已經轉移到JDO產品提供商身上,使開發人員解脫出來,從而集中時間和精力在業務邏輯上。另外,JDO很靈活,因為它可以在任何數據底層上運行。JDBC只是面向關系數據庫(RDBMS)JDO更通用,提供到任何數據底層的存儲功能,比如關系數據庫、文件、XML以及對象數據庫(ODBMS)等等,使得應用可移植性更強。
39.Spring與EJB的區別?
【參考答案】
①提供商無關性
EJB 3.0是一個被設計為對提供商沒有依賴性的開放的標準。EJB 3.0規范由企業JAVA社區的主流開源組織和廠商共同編寫和支持的。EJB 3.0框架使開發者的應用程序實現可以獨立于應用服務器。而Spring一直是一個非標準的技術,盡管你在任何應用服務器都上可以使用Spring框架,但基于Spring的應用仍然被限制于Spring本身和在你的應用中使用到的Spring提供的各種特別服務。
②服務整合
Spring框架是建立在應用服務器和服務庫之上,它的服務整合代碼(如數據訪問模板和Helper類)是基于框架的,并暴露給應用開發者。相反,EJB 3.0框架是緊密整合到應用服務器中的,它的服務整合代碼是封裝在一個標準的接口下的。
③服務聚合的靈活性
由于Spring中的服務整合代碼是作為編程接口暴露給應用開發者的,因此開發人員可以根據需要來聚合多個服務。這個特性使你可以集成一個你自己的“輕量”級應用服務器。通常,EJB 3.0應用服務器不提供給開發者這種按照你的需要來選擇服務的靈活性。大多數情況,你會得到一系列已經預先打包好的特性,其中有些你可能是不需要的。
④聲明式服務
EJB 3.0和Spring都將運行時服務(如事務管理、安全、日志、消息、和信息服務)連接給應用程序。由于這些服務同應用程序的業務邏輯并不是直接相關的,因此,它們不被應用程序本身來管理。相反,這些服務被服務容器(如EJB 3.0和Spring)以不可見的方式在運行時提供給應用程序。開發人員(或系統管理員)通過配置來告訴容器什么時候,以怎樣的方式來應用這些服務。
⑤注射依賴
Spring和EJB 3.0都提供了大量的DI模式支持。但是,它們之間也有著根本的不同。Spring支持了通常意義上的但是復雜的基于XML配置文件的注射依賴API;EJB 3.0支持的注射大多數通用服務對象(如,EJB和容器對象)和JNDI對象,它通過簡單的JAVA注解來完成。
40.SSH框架的優缺點。【北京科瑞明面試題】
【參考答案】
先說說Struts:
1.struts第一個優點應該是實現了MVC。
對Servlet依賴減少,低侵入式的設計
2.Action線程安全的設計
3.功能強大的OGNL表達式使用。
4.支持多種復合視圖,表現層的使用也多樣化,像JSP\freeMarker\Velocity。
5.攔截器的應用,實現了AOP的思想,方便重用與擴展
6.自動類型轉換功能。
7.相對低粗度的數據驗證功能
Struts缺點:
Struts2中Action中取得從jsp中傳過來的參數時,如果頁面過于復雜,會造成對象臃腫。
Spring優點:
1、非常優秀的輕量級,低侵入式的框架。
2、IOC的容器周期式的管理,降低組件的偶合。
3、對其它容器有非常好的支持,像對持久層的Hibernate、Ibaits、TOP Link
等。
Spring缺點:
1.Web層的MVC框架單過于單薄,對頁面框架的支持,跟其它框架還有很大的差距。
2.不是一站式解決方案。
3.使用了反射來管理其容器中的bean,在程序中增大了內存和運行計算的時間。
4.部分組件功能還有待完善
Hibernate的優點:
1、非常好的ORM的框架,在MVC的切分和JDBC的封裝上做的很好。
缺點:
1、對復雜查詢,多變的查詢,完成起來有難度。
2、自動化程序高,改寫靈活性不夠。
2、緩存不是太高效,所以有些企業單獨會選擇緩存框架或者棄用Hibernate的原因之一。
41.Spring有哪幾種注入方式?
【參考答案】
3種方法。構造屬入、屬性注入、接口注入
42.Hibernate原理
【參考答案】
1.讀取并解析配置文件
2.讀取并解析映射信息,創建SessionFactory
3.打開Sesssion
4.創建事務Transation
5.持久化操作
6.提交事務
7.關閉Session
8.關閉SesstionFactory
43.Spring MVC工作機制及為什么要用?【杭州網闕科技】
【參考答案】
1、客戶端所有的請求都提交給DispatcherServlet,它會委托應用系統的其他模塊負責負責對請求進行真正的處理工作。
2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.
3.DispatcherServlet請請求提交到目標Controller
4.Controller進行業務邏輯處理后,會返回一個ModelAndView
5.Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象
6.視圖對象負責渲染返回給客戶端。
44.spring中常用的幾種advice
【參考答案】
BeforeAdvice(前織入)、AfterAdvice(后織入)、ArroundAdvice(前后織入)ThrowAdvice(異常織入)
45.Spring中bean的配置scope表示什么含義?可以有哪幾種取值。
【參考答案】
scope表示Bean的生命周期或者叫Bean的作用域。scope的值有兩個:
1、singleton,為單例屬性,即Spring IoC容器只會創建該bean的唯一一個實例,這也是默認的。
2、prototype為原型屬性,即每一次請求都會產生一個新的bean實例。
46.Hibernate對象有幾種狀態?如何轉換
【參考答案】
共3種狀態,分別是:Transient狀態(瞬時)、Persient狀態(持久)、Detached(脫管狀態)狀態。
47.spring中OpenSessionInViewFilter作用什么的,解決了什么問題
【參考答案】
解決Hibernate的Session的關閉與開啟問題。
SSH整合問題:Hibernate允許對關聯對象、屬性進行延遲加載,但是必須保證延遲加載的操作限于同一個Hibernate Session范圍之內進行。如果Service層返回一個啟用了延遲加載功能的領域對象給Web層,當Web層訪問到那些需要延遲加載的數據時,由于加載領域對象的Hibernate Session已經關閉,這些導致延遲加載數據的訪問異常。而Spring為我們提供的OpenSessionInViewFilter過濾器為我們很好的解決了這個問題。OpenSessionInViewFilter的主要功能是用來把一個Hibernate Session和一次完整的請求過程對應的線程相綁定,允許在事務提交之后延遲加載顯示所需要的對象。實現"Open Session in View"的模式。
【補充說明】
配置如下:
Spring OpenSessionInViewFilter
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
sessionFactoryBean
sessionFactory
Spring OpenSessionInViewFilter
/*
一般在項目中SSH整合時,我們會加入上面的配置,解決延遲加載時的異常。
48.hibernate有哪五個核心接口。
【參考答案】
Configuration接口,SessionFactory接口,Session接口,Transaction接口,Query和Criteria接口
49.Hibernate中有幾種關系映射【嘉瑞互動】
【參考答案】
主要有單向一對一、單向一對多、單向多對一、單向多對多、雙向一對一、雙向一對多、雙向多對多。
50.介紹一下Hibernate的一級緩存與二級緩存。
緩存就是把以前從數據庫中查詢出來和使用過的對象保存在內存中(一個數據結構中),這個數據結構通常是或類似Hashmap,當以后要使用某個對象時,先查詢緩存中是否有這個對象,如果有則使用緩存中的對象,如果沒有則去查詢數據庫,并將查詢出來的對象保存在緩存中,以便下次使用。Hibernate的Session就是一種緩存,我們通常將之稱為Hibernate的一級緩存,當想使用session從數據庫中查詢出一個對象時,Session也是先從自己內部查看是否存在這個對象,存在則直接返回,不存在才去訪問數據庫,并將查詢的結果保存在自己內部。由于Session代表一次會話過程,一個Session與一個數據庫連接相關連,所以Session最好不要長時間保持打開,通常僅用于一個事務當中,在事務結束時就應關閉。并且Session是線程不安全的,被多個線程共享時容易出現問題。通常只有那種全局意義上的緩存才是真正的緩存應用,才有較大的緩存價值,因此,Hibernate的Session這一級緩存的緩存作用并不明顯,應用價值不大。
Hibernate的二級緩存就是要為Hibernate配置一種全局緩存,讓多個線程和多個事務都可以共享這個緩存。一般我們叫它sessionFactory緩存,也叫進程級的緩存,使用第3方插件實現的,也值緩存實體,生命周期和sessionFactory一致,可以進行管理。
二級緩存具體實現:
首先配置第3放插件,我們用的是EHCache,在hibernate.cfg.xml文件中加入
true
在映射中也要顯示的調用,
二級緩存之查詢緩存:對普通屬性進行緩存。如果關聯的表發生了修改,那么查詢緩存的生命周期也結束了。
在程序中必須手動啟用查詢緩存:query.setCacheable(true);
51.如何在WEB里面配置SPRING【首都信息面試題】
【參考答案】
主要配置Spring ?Web監聽器
52.Hibernate中的Cascade屬性有什么作用?
cascade屬性的作用是描述關聯對象進行操作時的級聯特性。可以有以下幾種取值:
all :所有情況下均進行關聯操作。
save-update:(級聯保存)表明保存或更新當前對象時會級聯保存或更新他所關聯的對象。
none:所有情況下均不進行關聯操作。這是默認值。
delete:(級聯刪除)級聯刪除所關聯的對象。
all-delete-orphan:自動刪除不再和父對象關聯的子對象。并且,在出現上面兩種情況時執行上面兩種的功能,可以說是一個全自動的屬性值。
53.Struts1優缺點
【參考答案】
優點:
1)實現MVC模式,結構清晰,使開發者只關注業務邏輯的實現.
2)有豐富的tag可以用,Struts的標記庫(Taglib),如能靈活動用,則能大大提高開發效率
3)頁面導航
4)使系統的脈絡更加清晰。通過一個配置文件,即可把握整個系統各部分之間的聯系,這對于后期的維護有著莫大的好處。尤其是當另一批開發者接手這個項目時,這種優勢體現得更加明顯。
5)提供Exception處理機制。
6)數據庫鏈接池管理。
7)支持I18N (國際化)
缺點
1)轉到展示層時,需要配置forward,如果有十個展示層的jsp,需要配置十次struts,而且還不包括有時候目錄、文件變更,需要重新修改forward,注意,每
2)Struts的Action必需是thread-safe方式,它僅僅允許一個實例去處理所有的請求。所以action用到的所有的資源都必需統一同步,這個就引起了線程安全的問題。
3)測試不方便. Struts的每個Action都同Web層耦合在一起,這樣它的測試依賴于Web容器,單元測試也很難實現
4)類型的轉換. Struts的FormBean把所有的數據都作為String類型,它可以使用工具Commons-Beanutils進行類型轉化。但它的轉化都是在Class級別,而且轉化的類型是不可配置的。
5)對Servlet的依賴性過強. Struts處理Action時必需要依賴ServletRequest和ServletResponse,所有它擺脫不了Servlet容器。
6)前端表達式語言方面集成了JSTL,所以它主要使用JSTL的表達式語言來獲取數據。可是JSTL的表達式語言在Collection和索引屬性方面處理顯得很弱。
7)對Action執行的控制困難. Struts創建一個Action,如果想控制它的執行順序將會非常困難。
8)對Action執行前和后的處理. Struts處理Action的時候是基于class的hierarchies,很難在action處理前和后進行操作。
9)對事件支持不夠.在struts中,實際是一個表單Form對應一個Action類(或DispatchAction),換一句話說:在Struts中實際是一個表單只能對應一個事件。
54.整合spring與struts1的方法,那種最好,為什么?
【參考答案】
答:1.第一種方法:
Struts的Action繼承Spring的ActionSupport類,并在Action中獲取Spring的ApplicationContext。這是最簡單的一種整合方式,但有三個缺點:第一,Struts與Spring緊密耦合,不能改換到其他IoC容器;第二,難以使用Spring AOP特性;第三,對于需要使用DispatchAction的Struts應用無能為力。
2.第二種方法:
在Struts的配置文件中,以Spring的DelegatingRequestProcessor類代替Struts的RequestProcessor類,并在Spring的配置文件中定義與Struts配置文件中對應的bean,從而將Struts的Action與Spring分開,并把Struts的動作置于Spring的控制之下。這種整合方式的優點是將不再依賴Spring這個特定的IoC容器,但必須依賴Struts的RequestProcessor類。
3.第三種方法:
通過Spring的DelegatingActionProxy類代理Struts的動作,即在Struts配置文件中,定義的type屬性全部改為DelegatingActionProxy,而不是具體的類名,并在Spring配置文件中定義與Struts動作映射對應的bean,從而將Struts的Action與Spring分開,并把Struts的動作置于Spring的控制之下。無疑,這是最靈活的一種整合方式。
【分析】
注意一般說幾種整合方式所指的就是Struts1
55.Struts1.2的工作原理
【參考答案】
1.ActionServlet核心控制器會攔截所有*.do的請求
2.從struts-config.xml中找到用戶請求的Action
3.通過struts-config.xml中的配置再去找這個Action對應的ActionForm,并實例化
4.把用戶填寫的數據自動填充到ActionForm中(調用ActionForm中的setXX()方法填充)
5.同時把ActionForm放入到指定的范圍中(request,session)
6.然后把請求轉發給Action
7.Action獲取ActionForm中的值然后調用業務邏輯層實現功能
8.在通過ActionMapping查找Actionforward實現轉發;
56.談談Struts1中的ActionServlet。
【參考答案】
中心控制器,負責所以請求處理,并根據配置文件,將請求轉到指定Action執行,并根據Action的ActionForward返回,轉到指定視圖。
57.Struts1.X中ActionServlet、ActionForm、Action、ActionMapping各起什么作用?
【參考答案】
a.Actionservlet為控制器,接受用戶請求并派發給相應的Action組件處理;
b.ActionForm主要用于封裝請求中的數據和簡單驗證
c.Action組件具體對用戶的請求進行處理
d.ActionMapping封裝當前用戶請求Action相關的配置信息
58.Struts 1的Action類與Struts 2的Action類區別?
【參考答案】
Struts 1要求Action類要擴展自一個抽象基類。Struts 1的一個共有的問題是面向抽象類編程而不是面向接口編程。
Struts 2的Action類實現了一個Action接口,連同其他接口一起實現可選擇和自定義的服務。
Struts 1 Action類是單例類,因只有一個示例控制所有的請求。
Struts 2 Action對象每一個請求都實例化對象,所以沒有程安全的問題。
59.談談你對Struts1的理解。
【參考答案】
1.struts是一個按MVC模式設計的Web層框架,其實它就是一個大大的servlet,這個Servlet名為ActionServlet,或是ActionServlet的子類。我們可以在web.xml文件中將符合某種特征的所有請求交給這個Servlet處理,這個Servlet再參照一個配置文件(通常為/WEB-INF/struts-config.xml)將各個請求分別分配給不同的action去處理。
2.ActionServlet把請求交給action去處理之前,會將請求參數封裝成一個formbean對象(就是一個java類,這個類中的每個屬性對應一個請求參數)
3.要說明的是,ActionServlet把formbean對象傳遞給action的execute方法之前,可能會調用formbean的validate方法進行校驗,只有校驗通過后才將這個formbean對象傳遞給action的execute方法,否則,它將返回一個錯誤頁面,這個錯誤頁面由input屬性指定,(看配置文件)作者為什么將這里命名為input屬性,而不是error屬性,我們后面結合實際的運行效果進行分析。
4.action執行完后要返回顯示的結果視圖,這個結果視圖是用一個ActionForward對象來表示的,actionforward對象通過struts-config.xml配置文件中的配置關聯到某個jsp頁面,因為程序中使用的是在struts-config.xml配置文件為jsp頁面設置的邏輯名,這樣可以實現action程序代碼與返回的jsp頁面名稱的解耦。
60.Struts1中的action是安全線程么?為什么
【參考答案】
Servlet是在多線程環境下的。即可能有多個請求發給一個servelt實例,每個請求是一個線程。
struts下的action也類似,同樣在多線程環境下。
為多線程環境編寫代碼。我們的controller servlet指揮創建你的Action類的一個實例,用此實例來服務所有的請求。因此,你必須編寫線程安全的Action類。遵循與寫線程安全的servlet同樣的方針。
61.在Struts1中actionform屬于哪一層
【參考答案】
屬于視圖層組件,負責封裝頁面表單數據。
62.struts控制器組件的主要包括?
【參考答案】
ActionServlet組件:充當struts框架的中央控制器。
RequestProcessor組件,充當每個子應用模塊的請求處理器
Action組件,負責處理一項具體的業務。
63.常見的緩存技術舉例【大唐動力面試題】
【參考答案】
操作系統磁盤緩存->減少磁盤機械操作
數據庫緩存->減少文件系統I/O
應用程序緩存->減少對數據庫的查詢
Web服務器緩存->減少應用服務器請求
客戶端瀏覽器緩存->減少對網站的訪問
64.以Spring為基礎的J2EE項目中,一般如何分層?每個層的作用是什么?事務控制放在哪一層?
一般分為持久層(DAO層)、業務層(Service層)、控制層、視圖層;
事務一般放在業務層,以一個業務作為一個事務分割的最小單位。
下載完整面試題文件:
https://www.duyunwl.cn/2019/03/08/java面試題大全/