1. 程式人生 > >SCME技術方向面試題(2017下)

SCME技術方向面試題(2017下)

三、Spring框架面試題

1、什麼是Spring框架?Spring框架有哪些主要模組?

Spring框架是一個為Java應用程式的開發提供了綜合、廣泛的基礎性支援的Java平臺。Spring幫助開發者解決了開發中基礎性的問題,使得開發人員可以專注於應用程式的開發。Spring框架本身亦是按照設計模式精心打造,這使得我們可以在開發環境中安心的整合Spring框架,不必擔心Spring是如何在後臺進行工作的。

Spring框架至今已集成了20多個模組。這些模組主要包括核心容器、資料訪問/整合,、Web、AOP(面向切面程式設計)、工具、訊息和測試模組。

 

2、使用Spring框架能帶來哪些好處?

A、Dependency Injection(DI) 方法使得構造器和JavaBean properties檔案中的依賴關係一目瞭然。

B、與EJB容器相比較,IoC容器更加趨向於輕量級。這樣一來IoC容器在有限的記憶體和CPU資源的情況下進行應用程式的開發和釋出就變得十分有利。

C、Spring並沒有閉門造車,Spring利用了已有的技術比如ORM框架、logging框架、J2EE、Quartz和JDK Timer,以及其他檢視技術。

D、Spring框架是按照模組的形式來組織的。由包和類的編號就可以看出其所屬的模組,開發者僅僅需要選用他們需要的模組即可。

E、要測試一項用Spring開發的應用程式十分簡單,因為測試相關的環境程式碼都已經囊括在框架中了。更加簡單的是,利用JavaBean形式的POJO類,可以很方便的利用依賴注入來寫入測試資料。

F、Spring的Web框架亦是一個精心設計的Web MVC框架,為開發者們在web框架的選擇上提供了一個除了主流框架比如Struts、過度設計的、不流行web框架的以外的有力選項。

G、Spring提供了一個便捷的事務管理介面,適用於小型的本地事物處理(比如在單DB的環境下)和複雜的共同事物處理(比如利用JTA的複雜DB環境)。

 

3、什麼是控制反轉(IOC)?什麼是依賴注入?

控制反轉是應用於軟體工程領域中的,在執行時被裝配器物件來繫結耦合物件的一種程式設計技巧,物件之間耦合關係在編譯時通常是未知的。在傳統的程式設計方式中,業務邏輯的流程是由應用程式中的早已被設定好關聯關係的物件來決定的。在使用控制反轉的情況下,業務邏輯的流程是由物件關係圖來決定的,該物件關係圖由裝配器負責例項化,這種實現方式還可以將物件之間的關聯關係的定義抽象化。而繫結的過程是通過“依賴注入”實現的。

控制反轉是一種以給予應用程式中目標元件更多控制為目的設計正規化,並在我們的實際工作中起到了有效的作用。

依賴注入是在編譯階段尚未知所需的功能是來自哪個的類的情況下,將其他物件所依賴的功能物件例項化的模式。這就需要一種機制用來啟用相應的元件以提供特定的功能,所以依賴注入是控制反轉的基礎。否則如果在元件不受框架控制的情況下,框架又怎麼知道要建立哪個元件?

在Java中依然注入有以下三種實現方式:構造器注入、Setter方法注入、介面注入

 

4、請解釋下Spring框架中的IoC?

Spring中的 org.springframework.beans 包和 org.springframework.context包構成了Spring框架IoC容器的基礎。

BeanFactory 介面提供了一個先進的配置機制,使得任何型別的物件的配置成為可能。ApplicationContex介面對BeanFactory(是一個子介面)進行了擴充套件,在BeanFactory的基礎上添加了其他功能,比如與Spring的AOP更容易整合,也提供了處理message resource的機制(用於國際化)、事件傳播以及應用層的特別配置,比如針對Web應用的WebApplicationContext。

org.springframework.beans.factory.BeanFactory 是Spring IoC容器的具體實現,用來包裝和管理前面提到的各種bean。BeanFactory介面是Spring IoC 容器的核心介面。

 

5、BeanFactory和ApplicationContext有什麼區別?

BeanFactory 可以理解為含有bean集合的工廠類。BeanFactory 包含了種bean的定義,以便在接收到客戶端請求時將對應的bean例項化。

BeanFactory還能在例項化物件的時生成協作類之間的關係。此舉將bean自身與bean客戶端的配置中解放出來。BeanFactory還包含了bean生命週期的控制,呼叫客戶端的初始化方法(initialization methods)和銷燬方法(destruction methods)。

 

從表面上看,application context如同bean factory一樣具有bean定義、bean關聯關係的設定,根據請求分發bean的功能。但application context在此基礎上還提供了其他的功能,包括提供了支援國際化的文字訊息、統一的資原始檔讀取方式、已在監聽器中註冊的bean的事件

 

6、ApplicationContext有幾種實現方式?

以下是三種較常見的 ApplicationContext 實現方式:

A、ClassPathXmlApplicationContext:從classpath的XML配置檔案中讀取上下文,並生成上下文定義。應用程式上下文從程式環境變數中取得。

B、FileSystemXmlApplicationContext :由檔案系統中的XML配置檔案讀取上下文。

C、XmlWebApplicationContext:由Web應用的XML檔案讀取上下文。

 

7、Spring有幾種配置方式?

將Spring配置到應用開發中有以下三種方式:基於XML的配置、基於註解的配置、基於Java的配置

 

8、如何用基於Java配置的方式配置Spring?

Spring對Java配置的支援是由@Configuration註解和@Bean註解來實現的。由@Bean註解的方法將會例項化、配置和初始化一個新物件,這個物件將由Spring的IoC容器來管理。@Bean宣告所起到的作用與<bean/> 元素類似。被@Configuration所註解的類則表示這個類的主要目的是作為bean定義的資源。被@Configuration宣告的類可以通過在同一個類的內部呼叫@bean方法來設定嵌入bean的依賴關係。

 

9、請解釋Spring Bean的生命週期?

Spring Bean的生命週期簡單易懂。在一個bean例項被初始化時,需要執行一系列的初始化操作以達到可用的狀態。同樣的,當一個bean不在被呼叫時需要進行相關的析構操作,並從bean容器中移除。Spring bean factory 負責管理在spring容器中被建立的bean的生命週期。Bean的生命週期由兩組回撥(call back)方法組成。

Spring框架提供了以下四種方式來管理bean的生命週期事件:

InitializingBean和DisposableBean回撥介面

針對特殊行為的其他Aware介面

Bean配置檔案中的Custom init()方法和destroy()方法

@PostConstruct和@PreDestroy註解方式

 

10、Spring Bean的作用域之間有什麼區別?

A、singleton:這種bean範圍是預設的,這種範圍確保不管接受到多少個請求,每個容器中只有一個bean的例項,單例的模式由bean factory自身來維護。

B、prototype:原形範圍與單例範圍相反,為每一個bean請求提供一個例項。

C、request:在請求bean範圍內會每一個來自客戶端的網路請求建立一個例項,在請求完成以後,bean會失效並被垃圾回收器回收。

D、Session:與請求範圍類似,確保每個session中有一個bean的例項,在session過期後,bean會隨之失效。

E、global-session:global-session和Portlet應用相關。當你的應用部署在Portlet容器中工作時,它包含很多portlet。如果你想要宣告讓所有的portlet共用全域性的儲存變數的話,那麼這全域性變數需要儲存在global-session中。

 

11、Spring框架中的單例Beans是執行緒安全的麼?

Spring框架並沒有對單例bean進行任何多執行緒的封裝處理。關於單例bean的執行緒安全和併發問題需要開發者自行去搞定。但實際上,大部分的Spring bean並沒有可變的狀態(比如Serview類和DAO類),所以在某種程度上說Spring的單例bean是執行緒安全的。如果你的bean有多種狀態的話(比如 View Model 物件),就需要自行保證執行緒安全。最淺顯的解決辦法就是將多型bean的作用域由“singleton”變更為“prototype”。

 

12、請舉例說明如何在Spring中注入一個Java Collection?

Spring提供了以下四種集合類的配置元素:

<list> :   該標籤用來裝配可重複的list值。

<set> :    該標籤用來裝配沒有重複的set值。

<map>:   該標籤可用來注入鍵和值可以為任何型別的鍵值對。

<props> : 該標籤支援注入鍵和值都是字串型別的鍵值對。

 

13、請解釋Spring Bean的自動裝配?

A、使用XML配置檔案實現自動裝配:

<bean id="employeeDAO" class="com.scme.EmployeeDAOImpl" autowire="byName" />

B、使用@Autowired註解來自動裝配指定的bean。

在使用@Autowired註解之前需要在按照如下的配置方式在Spring配置檔案進行配置才可以使用。

<context:annotation-config />

也可以通過在配置檔案中配置AutowiredAnnotationBeanPostProcessor 達到相同的效果。

<bean class ="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

配置好以後就可以使用@Autowired來標註了。

@Autowired

public EmployeeDAOImpl ( EmployeeManager manager ) {

    this.manager = manager;

}

 

14、請解釋自動裝配模式的區別?

A、no:這是Spring框架的預設設定,在該設定下自動裝配是關閉的,開發者需要自行在bean定義中用標籤明確的設定依賴關係。

B、byName:該選項可以根據bean名稱設定依賴關係。當向一個bean中自動裝配一個屬性時,容器將根據bean的名稱自動在在配置檔案中查詢一個匹配的bean。如果找到的話,就裝配這個屬性,如果沒找到的話就報錯。

C、byType:該選項可以根據bean型別設定依賴關係。當向一個bean中自動裝配一個屬性時,容器將根據bean的型別自動在在配置檔案中查詢一個匹配的bean。如果找到的話,就裝配這個屬性,如果沒找到的話就報錯。

D、constructor:造器的自動裝配和byType模式類似,但是僅僅適用於與有構造器相同引數的bean,如果在容器中沒有找到與構造器引數型別一致的bean,那麼將會丟擲異常。

E、autodetect:該模式自動探測使用構造器自動裝配或者byType自動裝配。首先,首先會嘗試找合適的帶引數的構造器,如果找到的話就是用構造器自動裝配,如果在bean內部沒有找到相應的構造器或者是無參構造器,容器就會自動選擇byTpe的自動裝配方式。

 

15、Spring 框架中都用到了哪些設計模式?

代理模式—在AOP和remoting中被用的比較多。

單例模式—在spring配置檔案中定義的bean預設為單例模式。

模板方法—用來解決程式碼重複的問題。比如. RestTemplate, JmsTemplate, JpaTemplate。

前端控制器—Spring提供了DispatcherServlet來對請求進行分發。

檢視幫助(View Helper )—Spring提供了一系列的JSP標籤,高效巨集來輔助將分散的程式碼整合在視圖裡。

依賴注入—貫穿於BeanFactory / ApplicationContext介面的核心理念。

工廠模式—BeanFactory用來建立物件的例項。

 

16、@Required 註解

@Required表明bean的屬性必須在配置時設定,可以在bean的定義中明確指定也可通過自動裝配設定。如果bean的屬性未設定,則丟擲BeanInitializationException異常。

 

17、@Autowired 註解

@Autowired 註解提供更加精細的控制,包括自動裝配在何處完成以及如何完成。它可以像@Required一樣自動裝配setter方法、構造器、屬性或者具有任意名稱和/或多個引數的PN方法。

 

18、@Qualifier 註解

當有多個相同型別的bean而只有其中的一個需要自動裝配時,將@Qualifier 註解和@Autowire 註解結合使用消除這種混淆,指明需要裝配的bean。

 

19、Spring支援的事務管理型別

程式設計式事務管理:這意味著你可以通過程式設計的方式管理事務,這種方式帶來了很大的靈活性,但很難維護。

宣告式事務管理:這種方式意味著你可以將事務管理和業務程式碼分離。你只需要通過註解或者XML配置管理事務。

 

20、Spring框架的事務管理有哪些優點?

為不同的事務API(如JTA, JDBC, Hibernate, JPA, 和JDO)提供了統一的程式設計模型。

為程式設計式事務管理提供了一個簡單的API而非一系列複雜的事務API(如JTA).

支援宣告式事務管理。

可以和Spring 的多種資料訪問技術很好的融合。

 

21、解釋AOP

面向切面程式設計,或AOP允許程式設計師模組化橫向業務邏輯,或定義核心部分的功能,例如日誌管理和事務管理。

 

22、切面(Aspect)

AOP的核心就是切面,它將多個類的通用行為封裝為可重用的模組。該模組含有一組API提供 cross-cutting功能。例如,日誌模組稱為日誌的AOP切面。根據需求的不同,一個應用程式可以有若干切面。在Spring AOP中,切面通過帶有@Aspect註解的類實現。

 

23、連線點(Join point)

連線點代表應用程式中插入AOP切面的地點。它實際上是Spring AOP框架在應用程式中執行動作的地點。

 

24、通知(Advice)

通知表示在方法執行前後需要執行的動作。實際上它是Spring AOP框架在程式執行過程中觸發的一些程式碼。

Spring切面可以執行一下五種型別的通知:

before(前置通知):在一個方法之前執行的通知。

after(最終通知):當某連線點退出的時候執行的通知(不論是正常返回還是異常退出)。

after-returning(後置通知):在某連線點正常完成後執行的通知。

after-throwing(異常通知):在方法丟擲異常退出時執行的通知。

around(環繞通知):在方法呼叫前後觸發的通知。

 

25、切入點(Pointcut)

切入點是一個或一組連線點,通知將在這些位置執行。可以通過表示式或匹配的方式指明切入點。

 

26、有幾種不同型別的自動代理?

BeanNameAutoProxyCreator:bean名稱自動代理建立器

DefaultAdvisorAutoProxyCreator:預設通知者自動代理建立器

Metadata autoproxying:元資料自動代理

 

27、什麼是Spring的MVC框架?

Spring提供了一個功能齊全的MVC框架用於構建Web應用程式。Spring框架可以很容易的和其他的MVC框架融合(如Struts),該框架使用控制反轉(IOC)將控制器邏輯和業務物件分離開來。它也允許以宣告的方式繫結請求引數到業務物件上。

 

28、DispatcherServlet

Spring的MVC框架圍繞DispatcherServlet來設計的,它用來處理所有的HTTP請求和響應

 

29、WebApplicationContext

WebApplicationContext繼承了ApplicationContext,並添加了一些web應用程式需要的功能。和普通的ApplicationContext 不同,WebApplicationContext可以用來處理主題樣式,它也知道如何找到相應的servlet。

 

30、什麼是Spring MVC框架的控制器?

控制器提供對應用程式行為的訪問,通常通過服務介面實現。控制器解析使用者的輸入,並將其轉換為一個由檢視呈現給使用者的模型。Spring 通過一種極其抽象的方式實現控制器,它允許使用者建立多種型別的控制器。

 

31、@Controller annotation

@Controller註解表示該類扮演控制器的角色。Spring不需要繼承任何控制器基類或應用Servlet API。

 

32、@RequestMapping annotation

@RequestMapping註解用於將URL對映到任何一個類或者一個特定的處理方法上。

 

33、簡單的談一下SpringMVC的工作流程?

1、使用者傳送請求至前端控制器DispatcherServlet

2、DispatcherServlet收到請求呼叫HandlerMapping處理器對映器。

3、處理器對映器找到具體的處理器,生成處理器物件及處理器攔截器(如果有則生成)一併返回給DispatcherServlet。

4、DispatcherServlet呼叫HandlerAdapter處理器介面卡

5、HandlerAdapter經過適配呼叫具體的處理器(Controller,也叫後端控制器)。

6、Controller執行完成返回ModelAndView

7、HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet

8、DispatcherServlet將ModelAndView傳給ViewReslover檢視解析器

9、ViewReslover解析後返回具體View

10、DispatcherServlet根據View進行渲染檢視(即將模型資料填充至檢視中)。

11、DispatcherServlet響應使用者

 

34、如何解決POST請求中文亂碼問題,GET的又如何處理呢?

在web.xml中配置org.springframework.web.filter.CharacterEncodingFilter過濾器可以解決POST請求中文亂碼問題;對已GET請求產生的中文亂碼可以對請求引數重新編碼的方式處理,例如:String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8");

 

35、SpringMVC與Struts2的主要區別?

①springmvc的入口是一個servlet即前端控制器,而struts2入口是一個filter過慮器。

②springmvc是基於方法開發,傳遞引數是通過方法形參,可以設計為單例或多例(建議單例),struts2是基於類開發,傳遞引數是通過類的屬性,只能設計為多例。

③Struts採用值棧儲存請求和響應的資料,通過OGNL存取資料, springmvc通過引數解析器是將request物件內容進行解析成方法形參,將響應資料和頁面封裝成ModelAndView物件,最後又將模型資料通過request物件傳輸到頁面。 Jsp檢視解析器預設使用jstl。

 

四、MyBatis框架面試題

1、JDBC程式設計有哪些不足之處,MyBatis是如何解決這些問題的?

① 資料庫連結建立、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用資料庫連結池可解決此問題。

解決:在SqlMapConfig.xml中配置資料鏈接池,使用連線池管理資料庫連結。

② Sql語句寫在程式碼中造成程式碼不易維護,實際應用sql變化的可能較大,sql變動需要改變java程式碼。

解決:將Sql語句配置在XXXXmapper.xml檔案中與java程式碼分離。

③ 向sql語句傳引數麻煩,因為sql語句的where條件不一定,可能多也可能少,佔位符需要和引數一一對應。

解決: Mybatis自動將java物件對映至sql語句。

④ 對結果集解析麻煩,sql變化導致解析程式碼變化,且解析前需要遍歷,如果能將資料庫記錄封裝成pojo物件解析比較方便。

解決:Mybatis自動將sql執行結果對映至java物件。

 

2、MyBatis程式設計步驟是什麼樣的?

① 建立SqlSessionFactory

② 通過SqlSessionFactory建立SqlSession

③ 通過sqlsession執行資料庫操作

④ 呼叫session.commit()提交事務

⑤ 呼叫session.close()關閉會話

 

3、使用MyBatis的mapper介面呼叫時有哪些要求?

①  Mapper介面方法名和mapper.xml中定義的每個sql的id相同

②  Mapper介面方法的輸入引數型別和mapper.xml中定義的每個sql 的parameterType的型別相同

③  Mapper介面方法的輸出引數型別和mapper.xml中定義的每個sql的resultType的型別相同

④  Mapper.xml檔案中的namespace即是mapper介面的類路徑。

 

4、SqlMapConfig.xml中配置有哪些內容?

properties(屬性)、settings(配置)、typeAliases(類型別名)、typeHandlers(型別處理器)、objectFactory(物件工廠)、

plugins(外掛)、environments(環境集合屬性物件)、environment(環境子屬性物件)、transactionManager(事務管理)、

dataSource(資料來源)、mappers(對映器)

 

5、簡單的說一下MyBatis的一級快取和二級快取?

Mybatis首先去快取中查詢結果集,如果沒有則查詢資料庫,如果有則從快取取出返回結果集就不走資料庫。Mybatis內部儲存快取使用一個HashMap,key為hashCode+sqlId+Sql語句。value為從查詢出來對映生成的java物件

Mybatis的二級快取即查詢快取,它的作用域是一個mapper的namespace,即在同一個namespace中查詢sql可以從快取中獲取資料。二級快取是可以跨SqlSession的。

 

6、Mybatis比IBatis比較大的幾個改進是什麼?

a.有介面繫結,包括註解繫結sql和xml繫結Sql ,

     b.動態sql由原來的節點配置變成OGNL表示式,

     c. 在一對一,一對多的時候引進了association,在一對多的時候引入了collection節點,不過都是在resultMap裡面配置

 

7、什麼是MyBatis的介面繫結,有什麼好處?

介面對映就是在IBatis中任意定義介面,然後把接口裡面的方法和SQL語句繫結,我們直接呼叫介面方法就可以,這樣比起原來了SqlSession提供的方法我們可以有更加靈活的選擇和設定

 

8、介面繫結有幾種實現方式,分別是怎麼實現的?

介面繫結有兩種實現方式,一種是通過註解繫結,就是在介面的方法上面加上@[email protected]等註解裡面包含Sql語句來繫結,另外一種就是通過xml裡面寫SQL來繫結,在這種情況下,要指定xml對映檔案裡面的namespace必須為介面的全路徑名

 

9、什麼情況下用註解繫結,什麼情況下用xml繫結?

當Sql語句比較簡單時候,用註解繫結,當SQL語句比較複雜時候,用xml繫結,一般用xml繫結的比較多

 

10、MyBatis實現一對一有幾種方式?具體怎麼操作的?

有聯合查詢和巢狀查詢,聯合查詢是幾個表聯合查詢,只查詢一次,通過在resultMap裡面配置association節點配置一對一的類就可以完成;

巢狀查詢是先查一個表,根據這個表裡面的結果的外來鍵id,去再另外一個表裡面查詢資料,也是通過association配置,但另外一個表的查詢通過select屬性配置

 

11、MyBatis裡面的動態Sql是怎麼設定的?用什麼語法?

MyBatis裡面的動態Sql一般是通過if節點來實現,通過OGNL語法來實現,但是如果要寫的完整,必須配合where,trim節點,where節點是判斷包含節點有內容就插入where,否則不插入,trim節點是用來判斷如果動態語句是以and 或or開始,那麼會自動把這個and或者or取掉

 

12、IBatis和MyBatis在核心處理類分別叫什麼?

IBatis裡面的核心處理類交SqlMapClient, MyBatis裡面的核心處理類叫做SqlSession

 

13、#{}和${}的區別是什麼?

${}是Properties檔案中的變數佔位符,它可以用於標籤屬性值和sql內部,屬於靜態文字替換。#{}是sql的引數佔位符,Mybatis會將sql中的#{}替換為?號,在sql執行前會使用PreparedStatement的引數設定方法,按序給sql的?號佔位符設定引數值。

 

14、Mybatis是如何進行分頁的?分頁外掛的原理是什麼?

Mybatis使用RowBounds物件進行分頁,它是針對ResultSet結果集執行的記憶體分頁,而非物理分頁,可以在sql內直接書寫帶有物理分頁的引數來完成物理分頁功能,也可以使用分頁外掛來完成物理分頁。

分頁外掛的基本原理是使用Mybatis提供的外掛介面,實現自定義外掛,在外掛的攔截方法內攔截待執行的sql,然後重寫sql,根據dialect方言,新增對應的物理分頁語句和物理分頁引數。

 

15、Mybatis是否支援延遲載入?如果支援,它的實現原理是什麼?

Mybatis僅支援association關聯物件和collection關聯集合物件的延遲載入,association指的就是一對一,collection指的就是一對多查詢。在Mybatis配置檔案中,可以配置是否啟用延遲載入lazyLoadingEnabled=true|false。

它的原理是,使用CGLIB建立目標物件的代理物件,當呼叫目標方法時,進入攔截器方法,比如呼叫a.getB().getName(),攔截器invoke()方法發現a.getB()是null值,那麼就會單獨傳送事先儲存好的查詢關聯B物件的sql,把B查詢上來,然後呼叫a.setB(b),於是a的物件b屬性就有值了,接著完成a.getB().getName()方法的呼叫。這就是延遲載入的基本原理。

 

16、Mybatis都有哪些Executor執行器?它們之間的區別是什麼?

SimpleExecutor:每執行一次update或select,就開啟一個Statement物件,用完立刻關閉Statement物件。

ReuseExecutor:執行update或select,以sql作為key查詢Statement物件,存在就使用,不存在就建立,用完後,不關閉Statement物件,而是放置於Map<String, Statement>內,供下一次使用。簡言之,就是重複使用Statement物件。

BatchExecutor:執行update(沒有select,JDBC批處理不支援select),將所有sql都新增到批處理中(addBatch()),等待統一執行(executeBatch()),它快取了多個Statement物件,每個Statement物件都是addBatch()完畢後,等待逐一執行executeBatch()批處理。與JDBC批處理相同。

作用範圍:Executor的這些特點,都嚴格限制在SqlSession生命週期範圍內。

 

17、Mybatis中如何指定使用哪一種Executor執行器?

在Mybatis配置檔案中,可以指定預設的ExecutorType執行器型別,也可以手動給DefaultSqlSessionFactory的建立SqlSession的方法傳遞ExecutorType型別引數。

 

五、Struts2面試題(擴充套件)

1、Struts2的核心是什麼,體現了什麼思想?

Struts2的核心是攔截器,基本上核心功能都是由攔截器完成,攔截器的實現體現了AOP(面向切面程式設計)思想

 

2、模型驅動與屬性驅動是什麼 模型驅動使用時注意什麼問題?

模型驅動與屬性驅動都是用來封裝資料的。

1.模型驅動:在實現類中實現ModelDriven<T>介面使用泛型把屬性類封裝起來,重寫getModel()方法,然後在實現類裡建立一個屬性類的例項,通過這個例項拿到封裝進來的值,拿返回值的時候使用工具進行值拷貝。

2.屬性驅動:在實現類裡定義屬性,生成get與set方法,通過屬性來拿值。

注意:模型驅動使用時注意的是在使用前先把屬性類例項化,否則會出現空指標錯誤,拿返回物件的值需要用拷貝記憶體因為地址發生改變。

 

3、Struts2是怎樣進行值封裝的?

struts2的值封裝實際上是採用了ognl表示式.struts2的攔截器經過模型驅動時會先判斷action是否實現了ModelDriven,如果是則拿到模型的例項放在了棧的頂部,到屬性驅動的時候會從棧裡面把棧頂的例項給取出來,從頁面傳進來的值放在一個map集合當中,

通過map集合進行迭代會通過ognl技術把值封裝到例項中。

 

4、Strust2如何訪問Servlet API?

1:通過ActionContext可以獲得request,application,session三個作用域(struts2實際上是通過介面卡來把servlet的api轉換為一個map,

並把這些map放在ActionContext裡面)。

2:通過ActionContext的子類ServletActionContext去獲取原滋原味的API。

3:可以通過實現ServletRequestAware介面,重寫裡面的setServletRequest方法可以獲得request,實際上是通過set的依賴注入。

 

5、什麼是攔截器 說說Struts2用攔截器來幹什麼 說出6個攔截器來?

在訪問類的某個方法或者屬性之前執行,攔截的是Action的請求,進行攔截然後在方法的執行前或者之後加入某些操作。

國際化,表單重複提交,型別轉換,自動裝配,資料封裝,異常處理,模型驅動,請求引數,處理型別轉換錯誤,日誌攔截器

 

6、struts2的請求處理流程?

1.客戶端傳送請求。

2.經過一系列的過濾器(如:ActionContextCleanUp、SiteMesh等)到達核心控制器(FilterDispatcher)。

3.核心控制器通過ActionMapper決定呼叫哪個Action,如果不是呼叫Action就直接跳轉到jsp頁面。

4.如果ActionMapper決定呼叫了某個Action,核心控制器就把請求的處理交給一個代理類(ActionProxy)。

5.代理類通過配置管理器(Configuration Manager)找到配置檔案(struts.xml)找到需要呼叫的Action類。

6.代理類還要建立一個Action的排程器(ActionInvocation)。

7.由排程器去呼叫Action,當然這裡還涉及到一些相關的攔截器的呼叫。

8.Action執行完後,這個排程器還會建立一個Result返回結果集,返回結果前還可以做一些操作(結果集前的監聽器)。

 

7、Struts2有哪些優點?

實現MVC模式,結構清晰,使開發者只關注業務邏輯的實現。有豐富的tag可以用,大大提高了開發效率。

 

8、攔截器和過濾器的區別?

1、攔截器是基於java反射機制的,而過濾器是基於函式回撥的。

2、過濾器依賴於servlet容器,而攔截器不依賴於servlet容器。

3、攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用。

4、攔截器可以訪問Action上下文、值棧裡的物件,而過濾器不能。

5、在Action的生命週期中,攔截器可以多次呼叫,而過濾器只能在容器初始化時被呼叫一次。

 

六、Hibernate面試題(擴充套件)

1、hibernate的三種狀態之間如何轉換?

當物件由瞬時狀態(Transient)一save()時,就變成了持久化狀態; 

當我們在Session裡儲存物件的時候,實際是在Session的Map裡存了一份,  也就是它的快取裡放了一份,然後,又到資料庫裡存了一份,在快取裡這一份叫持久物件(Persistent)。  Session 一 Close()了,它的快取也都關閉了,整個Session也就失效了,這個時候,這個物件變成了遊離狀態(Detached),但資料庫中還是存在的。 

當遊離狀態(Detached)update()時,又變為了持久狀態(Persistent)。 

當持久狀態(Persistent)delete()時,又變為了瞬時狀態(Transient), 此時,資料庫中沒有與之對應的記錄。

 

2、update和saveOrUpdate的區別?

update()和saveOrUpdate()是用來對跨Session的PO進行狀態管理的。 

update()方法操作的物件必須是持久化了的物件。也就是說,如果此物件在資料庫中不存在的話,就不能使用update()方法。 

saveOrUpdate()方法操作的物件既可以使持久化了的,也可以使沒有持久化的物件。如果是持久化了的物件呼叫saveOrUpdate()則會  更新資料庫中的物件;如果是未持久化的物件使用此方法,則save到資料庫中。

 

3、Hibernate工作原理?

1.讀取並解析配置檔案

2.讀取並解析對映資訊,建立SessionFactory

3.開啟Sesssion

4.建立事務Transation

5.持久化操作

6.提交事務

7.關閉Session

8.關閉SesstionFactory

 

4、為什麼要使用hibernate?

.對JDBC訪問資料庫的程式碼做了封裝,大大簡化了資料訪問層繁瑣的重複性程式碼。

.Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作

.hibernate使用Java反射機制,而不是位元組碼增強程式來實現透明性。

.hibernate的效能非常好,因為它是個輕量級框架。對映的靈活性很出色。它支援各種關係資料庫,從一對一到多對多的各種複雜關係。

 

5、Hibernate快取機制?

A:hibernate一級快取

(1)hibernate支援兩個級別的快取,預設只支援一級快取;

(2)每個Session內部自帶一個一級快取;

(3)某個Session被關閉時,其對應的一級快取自動清除;

B:hibernate二級快取

(1) 二級快取獨立於session,預設不開啟;

 

6、get和load區別?

1)get如果沒有找到會返回null, load如果沒有找到會丟擲異常。

2)get會先查一級快取, 再查二級快取,然後查資料庫;load會先查一級快取,如果沒有找到,就建立代理物件, 等需要的時候去查詢二級快取和資料庫。

 

7、Hibernate的查詢方式有哪些?

本地SQL查詢、Criteria、Hql、OID檢索

 

七、JS&JQuery面試題(擴充套件)

1、 jquery中的選擇器嗎,請講一下有哪些選擇器?

jQuery中的選擇器大致分為:基本選擇器,層次選擇器,過濾選擇器,表單選擇器

 

2、 jquery中的選擇器 和 css中的選擇器有區別嗎?

jQuery選擇器支援CSS裡的選擇器,jQuery選擇器可用來新增樣式和新增相應的行為CSS 中的選擇器是隻能新增相應的樣式

 

3、你覺得jquery中的選擇器有什麼優勢?

簡單的寫法  $('ID') 來代替 document.getElementById()函式,支援CSS1 到CSS3 選擇器完善的處理機制(就算寫錯了id也不會報錯)

4  你在使用選擇器的時候有有沒有什麼覺得要注意的地方?

1 選擇器中含有".","#","[" 等特殊字元的時候需要進行轉譯

     2 屬性選擇器的引號問題

     3 選擇器中含有空格的注意事項

 

5  jquery物件和dom物件是怎樣轉換的?

jquery轉DOM物件:jQuery 物件是一個數組物件,可以通過[index]的豐富得到相應的DOM物件還可以通過get[index]去得到相應的DOM物件。DOM物件轉jQuery物件:$(DOM物件)

 

6  你是如何使用jquery中的ajax的?

      如果是一些常規的ajax程式的話,使用load(),$.get(),$.post(),就可以搞定了,一般我會使用的是$.post() 方法。如果需要設定beforeSend(提交前回調函式),error(失敗後處理),success(成功後處理)及complete(請求完成後處理)回撥函式等,這個時候我會使用$.ajax()

 

7  你覺得jquery中的ajax好用嗎,為什麼?

好用的。 因為jQuery提供了一些日常開發中需要的快捷操作,例 load,ajax,get,post等等,所以使用jQuery開發ajax將變得極其簡單,我們就可以集中精力在業務和使用者的體驗上,不需要去理會那些繁瑣的XMLHttpRequest物件了。

 

8  jquery中$.get()提交和$.post()提交有區別嗎?

1 $.get() 方法使用GET方法來進行非同步請求的。$.post() 方法使用POST方法來進行非同步請求的。

       2 get請求會將引數跟在URL後進行傳遞,而POST請求則是作為HTTP訊息的實體內容傳送給Web伺服器的,這種傳遞是對使用者不可見的。

       3 get方式傳輸的資料大小不能超過2KB 而POST要大的多

4 GET 方式請求的資料會被瀏覽器快取起來,因此有安全問題。

 

9     jquery中的load方法一般怎麼用的?

load方法一般在 載入遠端HTML 程式碼並插入到DOM中的時候用,通常用來從Web伺服器上獲取靜態的資料檔案。如果要傳遞引數的話,可以使用$.get() 或 $.post()。

 

10  在jquery中你是如何去操作樣式的?

答: addClass() 來追加樣式 ,removeClass() 來刪除樣式,toggle() 來切換樣式

 

11  你使用過jquery中的動畫嗎,是怎樣用的?

使用過。hide() 和 show() 同時修改多個樣式屬性。像高度,寬度,不透明度。 fadeIn() 和fadeOut() fadeTo() 只改變不透明度。slideUp() 和 slideDown() slideToggle() 只改變高度。animate() 屬於自定義動畫的方法.

 

13  你一般用什麼去提交資料,為什麼?

一般我會使用的是$.post() 方法。如果需要設定beforeSend(提交前回調函式),error(失敗後處理),success(成功後處理及complete(請求完成後處理)回撥函式等,這個時候我會使用$.ajax()

 

14  你在jquery中使用過哪些插入節點的方法,它們的區別是什麼?

append(),appendTo(),prepend(),prependTo(),after(),insertAfter(),before(),insertBefore() 大致可以分為 內部追加和外部追加append() 表式向每個元素內部追加內容。appendTo()表示 講所有的元素追加到指定的元素中。例$(A)appendTo(B) 是將A追加到B中下面的方法解釋類似。

 

15  你使用過包裹節點的方法嗎,包裹節點有方法有什麼好處?

       wrapAll(),wrap(), wrapInner() 需要在文件中插入額外的結構化標記的時候可以使用這些包裹的方法應為它不會帛畫原始文件的語義

 

16  jquery中如何來獲取或和設定屬性?

jQuery中可以用attr()方法來獲取和設定元素屬性removeAttr() 方法來刪除元素屬性

 

17  如何來設定和獲取HTML 和文字的值?

html()方法 類似於innerHTML屬性 可以用來讀取或者設定某個元素中的HTML內容

注意:html() 可以用於xhtml文件 不能用於xml文件text() 類似於innerText屬性 可以用來讀取或設定某個元素中文字內容。val() 可以用來設定和獲取元素的值

 

18  你jquery中有哪些方法可以遍歷節點?

children() 取得匹配元素的子元素集合,只考慮子元素不考慮後代元素 next() 取得匹配元素後面緊鄰的同輩元素。prev() 取得匹配元素前面緊鄰的同輩元素。siblings() 取得匹配元素前後的所有同輩元素。closest() 取得最近的匹配元素。find() 取得匹配元素中的元素集合 包括子代和後代

 

19子元素選擇器 和後代選擇器元素有什麼區別?

子代元素是找子節點下的所有元素,後代元素是找子節點或子節點的子節點中的元素20 在jquery中可以替換節點嗎?

可以在jQuery中有兩者替換節點的方式 replaceWith() 和 replaceAll()

 

21你覺得beforeSend方法有什麼用?

傳送請求前可以修改XMLHttpRequest物件的函式,在beforeSend中如果返回false 可以取消本次的Ajax請求。XMLHttpRequest物件是唯一的引數所以在這個方法裡可以做驗證

 

22 siblings() 方法 和 $('prev~div')選擇器是一樣的嘛?

$('prev~div') 只能選擇'#prev'元素後面的同輩<div>元素而siblings()方法與前後的文職無關,只要是同輩節點就都能匹配。

 

23 有哪些查詢節點的選擇器?

 :first 查詢第一個,:last 查詢最後一個,:odd查詢奇數但是索引從0開始:even 查詢偶數,:eq(index)查詢相等的 ,:gt(index)查詢大於index的 ,:lt查詢小於index:header 選取所有的標題等

 

24 nextAll() 能 替代$('prev~siblindgs')選擇器嗎?

能。 使用nextAll() 和使用$('prev~siblindgs') 是一樣的

 

25 jQuery中有幾種方法可以來設定和獲取樣式

addClass() 方法,attr() 方法

 

26 $(document).ready()方法和window.onload有什麼區別?

兩個方法有相似的功能,但是在實行時機方面是有區別的。 window.onload方法是在網頁中所有的元素(包括元素的所有關聯檔案)完全載入到瀏覽器後才執行的。 $(document).ready() 方法可以在DOM載入就緒時就對其進行操縱,並呼叫執行繫結的函式。

 

27 jQuery是如何處理快取的?

要處理快取就是禁用快取.

1 通過$.post() 方法來獲取資料,那麼預設就是禁用快取的。

2 通過$.get()方法 來獲取資料,可以通過設定時間戳來避免快取。可以在URL後面加上+(+new Date)例 $.get('ajax.xml?'+(+new Date),function () { //內容 });

3 通過$.ajax 方法來獲取資料,只要設定cache:false即可。

 

28 $.getScript()方法 和 $.getJson() 方法有什麼區別?

1 $.getScript() 方法可以直接載入.js檔案,並且不需要對javascript檔案進行處理,javascript檔案會自動執行。

2 $.getJson() 是用於載入JSON 檔案的 ,用法和$.getScript()

 

29 $("#msg").text(); 和 $("#msg").text("<b>new content</b>");有什麼區別?

1 $("#msg").text() 是 返回id為msg的元素節點的文字內容       

      2 $("#msg").text("<b>new content</b>"); 是 將“<b>new content</b>” 作為普通文字串寫入id為msg的元素節點內容中, 頁面顯示粗體的<b>new content</b>

 

30 radio單選組的第二個元素為當前選中值,該怎麼去取?

$('input[name=items]').get(1).checked = true;

 

31 選擇器中 id,class有什麼區別?

在網頁中 每個id名稱只能用一次,class可以允許重複使用

 

32 你使用過哪些資料格式,它們各有什麼特點?

       HTML格式 ,JSON格式,javascript格式,XML格式

1 HTML片段提供外部資料一般來說是最簡單的。

2 如果資料需要重用,而且其他應用程式也可能一次受到影響,那麼在效能和檔案大小方面具有優勢的JSON通常是不錯的選擇。

3 而當遠端應用程式未知時,XML則能夠為良好的互操作性提供最可靠的保證。

 

33 jQuery 能做什麼?

1 獲取頁面的元素

2 修改頁面的外觀

3 改變頁面大的內容

4 響應使用者的頁面操作

5 為頁面新增動態效果

6 無需重新整理頁面,即可以從伺服器獲取資訊

7 簡化常見的javascript任務

 

34 在ajax中data主要有幾種方式?

三種,html拼接的,json陣列,form表單經serialize()序列化的。

 

35 :jQuery中的hover()和toggle()有什麼區別?

hover()和toggle()都是jQuery中兩個合成事件。

hover()方法用於模擬游標懸停事件。 toggle()方法是連續點選事件。

 

36 你知道jQuery中的事件冒泡嗎,它是怎麼執行的,何如來停止冒泡事件?

知道,事件冒泡是從裡面的往外面開始觸發。在jQuery中提供了stopPropagation()方法可以停止冒泡。

 

37 例如 單擊超連結後會自動跳轉,單擊"提交"按鈕後表單會提交等,有時候我想阻止這些預設的行為,該怎麼辦?

可以用 event.preventDefault()或在事件處理函式中返回false,即 return false;

 

38.在jquery中你有沒有編寫過外掛,外掛有什麼好處?你編寫過那些外掛?它應該注意那些?

外掛的好處:對已有的一系列方法或函式的封裝,以便在其他地方重新利用,方便後期維護和提高開發效率外掛的分類:封裝物件方法外掛 、封裝全域性函式外掛、選擇器外掛

注意的地方:

 1.外掛的檔名推薦命名為jquery.[外掛名].js,以免和其他的javaScript庫外掛混淆

 2.所有的物件方法都應當附加到jQuery.fn物件上,而所有的全域性函式都應當附加到jQuery物件本身上

 3.外掛應該返回一個jQuery物件,以保證外掛的可鏈式操作

 4.避免在外掛內部使用$作為jQuery物件的別名,而應使用完整的jQuery來表示,這樣可以避免衝突或使用閉包來避免

 5.所有的方法或函式外掛,都應當一分好結尾,否則壓縮的時候可能出現問題。在外掛頭部加上分號,這樣可以避免他人的不規範程式碼給外掛帶來影響

 6.在外掛中通過$.extent({})封裝全域性函式,選擇器外掛,擴充套件已有的object物件通過$.fn.extend({})封裝物件方法外掛

 

39. jQuery 庫中的 $() 是什麼?

$() 函式是 jQuery() 函式的別稱。$() 函式用於將任何物件包裹成 jQuery 物件,接著就被允許呼叫定義在 jQuery 物件上的多個不同方法。甚至可以將一個選擇器字串傳入 $() 函式,它會返回一個包含所有匹配的 DOM 元素陣列的 jQuery 物件。

 

40. 網頁上有 5 個 <div> 元素,如何使用 jQuery來選擇它們?

另一個重要的 jQuery 問題是基於選擇器的。jQuery 支援不同型別的選擇器,例如 ID 選擇器、class 選擇器、標籤選擇器。鑑於這個問題沒提到 ID 和 class,你可以用標籤選擇器來選擇所有的 div 元素。jQuery 程式碼:$("div"),這樣會返回一個包含所有 5 個 div 標籤的 jQuery 物件。更詳細的解答參見上面連結的文章。

 

41. jQuery 裡的 ID 選擇器和 class 選擇器有何不同?

ID 選擇器使用 ID 來選擇元素,比如 #element1,而 class 選擇器使用 CSS class 來選擇元素。當你只需要選擇一個元素時,使用 ID 選擇器,而如果你想要選擇一組具有相同 CSS class 的元素,就要用 class 選擇器。

 

42. 如何在點選一個按鈕時使用 jQuery 隱藏一個圖片?

jQuery物件.hide()。

 

43.  $(document).ready() 是個什麼函式?為什麼要用它?

   ready() 函式用於在文件進入ready狀態時執行程式碼。當DOM 完全載入(例如HTML被完全解析DOM樹構建完成時),jQuery允許你執行程式碼。使用$(document).ready()的最大好處在於它適用於所有瀏覽器,jQuery幫你解決了跨瀏覽器的難題。

 

44. JavaScript window.onload 事件和 jQuery ready 函式有何不同?

  JavaScript window.onload 事件和 jQuery ready 函式之間的主要區別是,前者除了要等待 DOM 被建立還要等到包括大型圖片、音訊、視訊在內的所有外部資源都完全載入。如果載入圖片和媒體內容花費了大量時間,使用者就會感受到定義在 window.onload 事件上的程式碼在執行時有明顯的延遲。

  另一方面,jQuery ready() 函式只需對 DOM 樹的等待,而無需對影象或外部資源載入的等待,從而執行起來更快。使用 jQuery $(document).ready() 的另一個優勢是你可以在網頁裡多次使用它,瀏覽器會按它們在 HTML 頁面裡出現的順序執行它們,相反對於 onload 技術而言,只能在單一函式裡使用。鑑於這個好處,用 jQuery ready() 函式比用 JavaScript window.onload 事件要更好些。

45. 如何找到所有 HTML select 標籤的選中項?

使用了屬性選擇器/表單選擇器和表單過濾選擇器來實現,先通過屬性選擇器或者表單選擇器獲取所有的select標籤,再通過表單過濾選擇器篩選出選中項

 

46. jQuery 裡的 each() 是什麼函式?你是如何使用它的?

each() 函式允許你遍歷一個元素集合。你可以傳一個函式給 each() 方法,被呼叫的 jQuery 物件會在其每個元素上執行傳入的函式

 

47. 你是如何將一個 HTML 元素新增到 DOM 樹中的?

可以用 jQuery 方法 appendTo() 將一個 HTML 元素新增到 DOM 樹中。這是 jQuery 提供的眾多操控 DOM 的方法中的一個。你可以通過 appendTo() 方法在指定的 DOM 元素末尾新增一個現存的元素或者一個新的 HTML 元素。

 

48. $(this) 和 this 關鍵字在 jQuery 中有何不同?

$(this) 返回一個 jQuery 物件,你可以對它呼叫多個 jQuery 方法,比如用 text() 獲取文字,用val() 獲取值等等。而 this 代表當前元素,它是 JavaScript 關鍵詞中的一個,表示上下文中的當前 DOM 元素。你不能對它呼叫 jQuery 方法,直到它被 $() 函式包裹,例如 $(this)。

 

49. 你如何使用jQuery來提取一個HTML 標記的屬性 例如. 連結的href?

可以使用attr() 方法來獲取任意一個HTML元素的一個屬性的值.jQuery物件.attr(“屬性名”);

 

50. 你如何使用jQuery設定一個屬性值?

a