java面試題彙總(五)-----xml及流行的框架
1、xml有哪些解析技術?區別是什麼?
答:有DOM,SAX,STAX等
DOM:處理大型檔案時其效能下降的非常厲害。這個問題是由DOM的樹結構所造成的,這種結構佔用的記憶體較多,而且DOM必須在解析檔案之前把整個文件裝入記憶體,適合對XML的隨機訪問SAX:不現於DOM,SAX是事件驅動型的XML解析方式。它順序讀取XML檔案,不需要一次全部裝載整個檔案。當遇到像檔案開頭,文件結束,或者標籤開頭與標籤結束時,它會觸發一個事件,使用者通過在其回撥事件中寫入處理程式碼來處理XML檔案,適合對XML的順序訪問
STAX:Streaming API for XML (StAX)
講解這些區別是不需要特別去比較,就像說傳智播客與其他培訓機構的區別時,我們只需說清楚傳智播客有什麼特點和優點就行了,這就已經間接回答了彼此的區別。
2、你在專案中用到了xml技術的哪些方面?如何實現的?
答:用到了資料存貯,資訊配置兩方面。在做資料交換平臺時,將不能資料來源的資料組裝成XML檔案,然後將XML檔案壓縮打包加密後通過網路傳送給接收者,接收解密與解壓縮後再同XML檔案中還原相關資訊進行處理。在做軟體配置時,利用XML可以很方便的進行,軟體的各種配置引數都存貯在XML檔案中。
4、XML文件定義有幾種形式?它們之間有何本質區別?解析XML文件有哪幾種方式?
a: 兩種形式 dtd schema,b:本質區別:schema本身是xml的,可以被XML解析器解析(這也是從DTD上發展schema的根本目的),c:有DOM,SAX,STAX等
DOM:處理大型檔案時其效能下降的非常厲害。這個問題是由DOM的樹結構所造成的,這種結構佔用的記憶體較多,而且DOM必須在解析檔案之前把整個文件裝入記憶體,適合對XML的隨機訪問
SAX:不現於DOM,SAX是事件驅動型的XML解析方式。它順序讀取XML檔案,不需要一次全部裝載整個檔案。當遇到像檔案開頭,文件結束,或者標籤開頭與標籤結束時,它會觸發一個事件,使用者通過在其回撥事件中寫入處理程式碼來處理XML檔案,適合對XML的順序訪問
STAX:Streaming API forXML (StAX)
六.流行的框架與新技術
- 談談你對Struts的理解。
1. struts
2. struts的基本配置檔案為struts-config.xml,裡面配置了很多Action、ActionForm及中轉規則,這個檔案通過web.xml中的ActionServlet進行載入和初始化。
3. 當用戶請求傳送到伺服器端時,ActionServlet會接收到此請求,然後根據struts.xml中的配置找到相應的Action,同時根據ActionForm的配置,建立ActionForm的例項並進行賦值,當做引數交給Action進行業務處理,返回ActionMapping物件。
4. ActionServlet根據struts.xml中action的配置,forward到指定的頁面,把結果以JSP處理過的HTML返回給客戶的瀏覽器。
5.可以繼續談一談struts1和struts2的區別
2、Struts優缺點
優點:
1. 實現MVC模式,結構清晰,使開發者只關注業務邏輯的實現.
2.有豐富的tag可以用 ,Struts的標記庫(Taglib),如能靈活動用,則能大大提高開發效率
3. 頁面導航
使系統的脈絡更加清晰。通過一個配置檔案,即可把握整個系統各部分之間的聯絡,這對於後期的維護有著莫大的好處。尤其是當另一批開發者接手這個專案時,這種優勢體現得更加明顯。
4. 提供Exception處理機制 .
5. 資料庫連結池管理
6. 支援I18N
缺點
一、轉到展示層時,需要配置forward,如果有十個展示層的jsp,需要配置十次struts,而且還不包括有時候目錄、檔案變更,需要重新修改forward,注意,每次修改配置之後,要求重新部署整個專案,而tomcate這樣的伺服器,還必須重新啟動伺服器
二、Struts的Action必需是thread-safe方式,它僅僅允許一個例項去處理所有的請求。所以action用到的所有的資源都必需統一同步,這個就引起了執行緒安全的問題。
三、測試不方便. Struts的每個Action都同Web層耦合在一起,這樣它的測試依賴於Web容器,單元測試也很難實現。不過有一個Junit的擴充套件工具Struts TestCase可以實現它的單元測試。
四、型別的轉換. Struts的FormBean把所有的資料都作為String型別,它可以使用工具Commons-Beanutils進行型別轉化。但它的轉化都是在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 event,application event和component event相比是一種粗粒度的事件。
3、STRUTS的應用(如STRUTS架構)
Struts是採用Java Servlet/JavaServer Pages技術,開發Web應用程式的開放原始碼的framework。採用Struts能開發出基於MVC(Model-View-Controller)設計模式的應用構架。 Struts有如下的主要功能:一.包含一個controller servlet,能將使用者的請求傳送到相應的Action物件。二.JSP自由tag庫,並且在controller servlet中提供關聯支援,幫助開發員建立互動式表單應用。三.提供了一系列實用物件:XML處理、通過Java reflection APIs自動處理JavaBeans屬性、國際化的提示和訊息
4、談談你對Hibernate的理解。
它是ORM思想的一個實現,對JDBC進行了很好的封裝,它通過配置使JavaBean物件和資料庫表之間進行對映,並提供對增、刪、改、查便利的操作方法,同時支援事務處理,它對資料庫記錄還提供了快取機制,提高效率,它可以使程式設計師不用書寫SQL,也不用關心資料庫SQL之間的差異,它通過方言對資料庫進行了很好的適配。
1. Hiberante的主配置檔案為hibernate.cfg.xml,其中定義了資料來源、連線池、快取、事務、表生成策略等配置
2. 通過*.hbm.xml對映配置檔案,定義了JavaBean物件和資料庫表之間的對映關係,還定了物件和物件之間的對映關係,包括:一對一、多對一、一對多、多對多
3. 對於複雜查詢和修改,Hiberante提供了Query物件進行支援,它可以使用HQL語句處理查詢、修改、刪除和分頁。如果需要處理針對資料庫相關的SQL,可以SQLQuery物件處理。
4. Hibernate可以整合到Spring中,通過Spring進行事務處理,事務的配置通常分兩類,一種是AOP方式,一種是註釋方式的宣告式事務。
5. Hiberante從3版本後,支援JPA規範,可以不使用對映檔案配置,而全部採用JPA註解方式進行物件和資料庫表的對映,Hibernate還擴容了JPA規範。
6. Hibernate對常用的快取技術做了封裝,可以輕鬆的呼叫各種快取框架
5、你對Spring的理解。
Spring實質上講就是一個Bean工廠,主要用來管理Bean的生命週期和框架整合。
Spring分為兩個部分:
1. IOC控制反轉(也叫DI依賴注入,此名由Mardin Fowler給出)。Spring的頂層容器為BeanFactory,常用的ApplicationContext為它的子介面,實現了工廠模式。Spring需要載入它的配置檔案,通常配置檔名為applicationContext.xml或spring-config.xml,其中Bean的定義為<bean id=”beanId” class=”xxx.class” />
2. Spring容器負責根據配置檔案建立Bean物件並進行對其的裝載。Bean有懶載入,屬性配置,自動裝載,parent Bean,abstract Bean,FactoryBean(通常用於框架整合,需要了解BeanFactory和FactoryBean的區別),scope(singleton單例,prototype多例)。
3. Spring 2.5後提供了對註釋的支援,更加方便,在重構時作用巨大。
4. Spring的IOC解除了模組間的耦合,可以使專案多模組並行開發。
5. Spring還提供了AOP的支援,方便在切面級開發,例如事務控制、日誌、效能、安全等。Spring的AOP有兩種配置方式,都是通過動態代理技術實現的,一種是JDK自帶的Proxy類的實現,一種是CGLIB動態代理實現,通過<aop:aspect target-class-proxy=”true” />開關進行設定。
6. Spring的重要做用是整合其它框架。Spring官方提供了許多類庫對其它框架進行了封裝,例如通過的事務模組、JMS框架的呼叫模組、Email支援、偵錯程式Scheduler、JNDI等,同時其它框架也提供了針對Spring的整合包,例如Hibernate、MyBatis、Struts等
。
以下是Spring 框架的基本模組:
- Core module
- Bean module
- Context module
- Expression Language module
- JDBC module
- ORM module
- OXM module
- Java Messaging Service(JMS) module
- Transaction module
- Web module
- Web-Servlet module
- Web-Struts module
- Web-Portlet module
這是基本的Spring模組,提供spring 框架的基礎功能,BeanFactory 是任何以spring為基礎的應用的核心。Spring 框架建立在此模組之上,它使Spring成為一個容器。
9、寫Hibernate的一對多和多對一雙向關聯的orm配置?
hibernate的inverse屬性的作用?
解決方案一,按照Object[]資料取出資料,然後自己組bean
解決方案二,對每個表的bean寫建構函式,比如表一要查出field1,field2兩個欄位,那麼有一個建構函式就是Bean(type1filed1,type2
field2) ,然後在hql裡面就可以直接生成這個bean了。
10、在DAO中如何體現DAO設計模式?
解決方案一,按照Object[]資料取出資料,然後自己組bean
解決方案二,對每個表的bean寫建構函式,比如表一要查出field1,field2兩個欄位,那麼有一個建構函式就是Bean(type1filed1,type2
field2) ,然後在hql裡面就可以直接生成這個bean了。
11、spring+Hibernate中委託方案怎麼配置?
解決方案一,按照Object[]資料取出資料,然後自己組bean
解決方案二,對每個表的bean寫建構函式,比如表一要查出field1,field2兩個欄位,那麼有一個建構函式就是Bean(type1filed1,type2
field2) ,然後在hql裡面就可以直接生成這個bean了。
12. hibernate進行多表查詢每個表中各取幾個欄位,也就是說查詢出來的結果集沒有一個實體類與之對應如何解決;
解決方案一,按照Object[]資料取出資料,然後自己組bean
解決方案二,對每個表的bean寫建構函式,比如表一要查出field1,field2兩個欄位,那麼有一個建構函式就是Bean(type1filed1,type2
field2) ,然後在hql裡面就可以直接生成這個bean了。
13.介紹一下Hibernate的二級快取
按照以下思路來回答:(1)首先說清楚什麼是快取,(2)再說有了hibernate的Session就是一級快取,即有了一級快取,為什麼還要有二級快取,(3)最後再說如何配置Hibernate的二級快取。
(1)快取就是把以前從資料庫中查詢出來和使用過的物件儲存在記憶體中(一個數據結構中),這個資料結構通常是或類似Hashmap,當以後要使用某個物件時,先查詢快取中是否有這個物件,如果有則使用快取中的物件,如果沒有則去查詢資料庫,並將查詢出來的物件儲存在快取中,以便下次使用。下面是快取的虛擬碼:
引出hibernate的第二級快取,用下面的虛擬碼分析了Cache的實現原理
Dao
{
hashmap map = newmap();
User getUser(integerid)
{
User user =map.get(id)
if(user ==null)
{
user =session.get(id);
map.put(id,user);
}
return user;
}
}
Dao
{
Cache cache = null
setCache(Cachecache)
{
this.cache =cache
}
User getUser(int id)
{
if(cache!=null)
{
Useruser = cache.get(id);
if(user==null)
{
user= session.get(id);
cache.put(id,user);
}
returnuser;
}
returnsession.get(id);
}
}
(2)Hibernate的Session就是一種快取,我們通常將之稱為Hibernate的一級快取,當想使用session從資料庫中查詢出一個物件時,Session也是先從自己內部檢視是否存在這個物件,存在則直接返回,不存在才去訪問資料庫,並將查詢的結果儲存在自己內部。由於Session代表一次會話過程,一個Session與一個數據庫連線相關連,所以Session最好不要長時間保持開啟,通常僅用於一個事務當中,在事務結束時就應關閉。並且Session是執行緒不安全的,被多個執行緒共享時容易出現問題。通常只有那種全域性意義上的快取才是真正的快取應用,才有較大的快取價值,因此,Hibernate的Session這一級快取的快取作用並不明顯,應用價值不大。Hibernate的二級快取就是要為Hibernate配置一種全域性快取,讓多個執行緒和多個事務都可以共享這個快取。我們希望的是一個人使用過,其他人也可以使用,session沒有這種效果。
(3)二級快取是獨立於Hibernate的軟體部件,屬於第三方的產品,多個廠商和組織都提供有快取產品,例如,EHCache和OSCache等等。在Hibernate中使用二級快取,首先就要在hibernate.cfg.xml配置檔案中配置使用哪個廠家的快取產品,接著需要配置該快取產品自己的配置檔案,最後要配置Hibernate中的哪些實體物件要納入到二級快取的管理中。明白了二級快取原理和有了這個思路後,很容易配置起Hibernate的二級快取。擴充套件知識:一個SessionFactory可以關聯一個二級快取,也即一個二級快取只能負責快取一個數據庫中的資料,當使用Hibernate的二級快取後,注意不要有其他的應用或SessionFactory來更改當前資料庫中的資料,這樣快取的資料就會與資料庫中的實際資料不一致。
14、Jdo是什麼?
JDO是Java物件持久化的新的規範,為java data object的簡稱,也是一個用於存取某種資料倉庫中的物件的標準化API。JDO提供了透明的物件儲存,因此對開發人員來說,儲存資料物件完全不需要額外的程式碼(如JDBC API的使用)。這些繁瑣的例行工作已經轉移到JDO產品提供商身上,使開發人員解脫出來,從而集中時間和精力在業務邏輯上。另外,JDO很靈活,因為它可以在任何資料底層上執行。JDBC只是面向關係資料庫(RDBMS)JDO更通用,提供到任何資料底層的儲存功能,比如關係資料庫、檔案、XML以及物件資料庫(ODBMS)等等,使得應用可移植性更強。
IOC 或 依賴注入把應用的程式碼量降到最低。它使應用容易測試,單元測試不再需要單例和JNDI查詢機制。最小的代價和最小的侵入性使鬆散耦合得以實現。IOC容器支援載入服務時的餓漢式初始化和懶載入。
依賴注入,是IOC的一個方面,是個通常的概念,它有多種解釋。這概念是說你不用建立物件,而只需要描述它如何被建立。你不在程式碼裡直接組裝你的元件和服務,但是要在配置檔案裡描述哪些元件需要哪些服務,之後一個容器(IOC容器)負責把他們組裝起來。
- 構造器依賴注入:構造器依賴注入通過容器觸發一個類的構造器來實現的,該類有一系列引數,每個引數代表一個對其他類的依賴。
- Setter方法注入:Setter方法注入是容器通過呼叫無參構造器或無參static工廠 方法例項化bean之後,呼叫該bean的setter方法,即實現了基於setter的依賴注入。
你兩種依賴方式都可以使用,構造器注入和Setter方法注入。最好的解決方案是用構造器引數實現強制依賴,setter方法實現可選依賴。
Spring對資料訪問物件(DAO)的支援旨在簡化它和資料訪問技術如JDBC,Hibernate or JDO 結合使用。這使我們可以方便切換持久層。編碼時也不用擔心會捕獲每種技術特有的異常。
面向切面的程式設計,或AOP, 是一種程式設計技術,允許程式模組化橫向切割關注點,或橫切典型的責任劃分,如日誌和事務管理。
AOP核心就是切面,它將多個類的通用行為封裝成可重用的模組,該模組含有一組API提供橫切功能。比如,一個日誌模組可以被稱作日誌的AOP切面。根據需求的不同,一個應用程式可以有若干切面。在Spring AOP中,切面通過帶有@Aspect註解的類實現。
關注點是應用中一個模組的行為,一個關注點可能會被定義成一個我們想實現的一個功能。 橫切關注點是一個關注點,此關注點是整個應用都會使用的功能,並影響整個應用,比如日誌,安全和資料傳輸,幾乎應用的每個模組都需要的功能。因此這些都屬於橫切關注點。
連線點代表一個應用程式的某個位置,在這個位置我們可以插入一個AOP切面,它實際上是個應用程式執行Spring AOP的位置。
26. 通知
通知是個在方法執行前或執行後要做的動作,實際上是程式執行時要通過SpringAOP框架觸發的程式碼段。
Spring切面可以應用五種型別的通知:
- before:前置通知,在一個方法執行前被呼叫。
- after: 在方法執行之後呼叫的通知,無論方法執行是否成功。
- after-returning: 僅當方法成功完成後執行的通知。
- after-throwing: 在方法丟擲異常退出時執行的通知。
- around: 在方法執行之前和之後呼叫的通知。
通過Jackson框架就可以把Java裡面的物件直接轉化成Js可以識別的Json物件
具體步驟如下
1.
加入Jackson.jar
2.
在配置檔案中配置json的對映
3.
在接受Ajax方法裡面可以直接返回Object,List等,但方法前面要加上@ResponseBody註解
30當一個方法向AJAX返回特殊物件,譬如Object,List等,需要做什麼處理
要加上@ResponseBody註解
有兩種寫法,一種是實現介面,另外一種是繼承介面卡類,然後在SpringMvc的配置檔案中配置攔截器即可:
<!--
配置SpringMvc的攔截器 -->
<mvc:interceptors>
<!--
配置一個攔截器的Bean就可以了 預設是對所有請求都攔截 -->
<bean id="myInterceptor" class="com.et.action.MyHandlerInterceptor"></bean>
<!--
只針對部分請求攔截 -->
<mvc:interceptor>
<mvc:mapping path="/modelMap.do" />
<bean class="com.et.action.MyHandlerInterceptorAdapter" />
</mvc:interceptor>
</mvc:interceptors>
32講下SpringMvc的執行流程
系統啟動的時候根據配置檔案建立spring的容器, 首先是傳送http請求到核心控制器disPatherServlet,spring容器通過對映器去尋找業務控制器,
使用介面卡找到相應的業務類,在進業務類時進行資料封裝,在封裝前可能會涉及到型別轉換,執行完業務類後使用ModelAndView進行檢視轉發,資料放在model中,用map傳遞資料進行頁面顯示。
33解釋Spring支援的幾種bean的作用域。
Spring框架支援以下五種bean的作用域:
- singleton : bean在每個Spring ioc 容器中只有一個例項。
- prototype:一個bean的定義可以有多個例項。
- request:每次http請求都會建立一個bean,該作用域僅在基於web的Spring ApplicationContext情形下有效。
- session:在一個HTTP Session中,一個bean定義對應一個例項。該作用域僅在基於web的Spring ApplicationContext情形下有效。
- global-session:在一個全域性的HTTP Session中,一個bean定義對應一個例項。該作用域僅在基於web的Spring ApplicationContext情形下有效。
預設的Spring bean 的作用域是Singleton.
34,Spring框架中的單例bean是執行緒安全的嗎?
不,Spring框架中的單例bean不是執行緒安全的。
35. 解釋Spring框架中bean的生命週期。
- Spring容器 從XML 檔案中讀取bean的定義,並例項化bean。
- Spring根據bean的定義填充所有的屬性。
- 如果bean實現了BeanNameAware 介面,Spring 傳遞bean 的ID 到 setBeanName方法。
- 如果Bean 實現了 BeanFactoryAware 介面, Spring傳遞beanfactory 給setBeanFactory 方法。
- 如果有任何與bean相關聯的BeanPostProcessors,Spring會在postProcesserBeforeInitialization()方法內呼叫它們。
- 如果bean實現IntializingBean了,呼叫它的afterPropertySet方法,如果bean聲明瞭初始化方法,呼叫此初始化方法。
- 如果有BeanPostProcessors 和bean 關聯,這些bean的postProcessAfterInitialization() 方法將被呼叫。
- 如果bean實現了 DisposableBean,它將呼叫destroy()方法。
36.哪些是重要的bean生命週期方法? 你能過載它們嗎?
有兩個重要的bean 生命週期方法,第一個是setup , 它是在容器載入bean的時候被呼叫。第二個方法是 teardown 它是在容器解除安裝類的時候被呼叫。
The bean 標籤有兩個重要的屬性(init-method和destroy-method)。用它們你可以自己定製初始化和登出方法。它們也有相應的註解(@PostConstruct和@PreDestroy)。
38. 什麼是基於Java的Spring註解配置? 給一些註解的例子.
基於Java的配置,允許你在少量的Java註解的幫助下,進行你的大部分Spring配置而非通過XML檔案。
以@Configuration 註解為例,它用來標記類可以當做一個bean的定義,被Spring IOC容器使用。另一個例子是@Bean註解,它表示此方法將要返回一個物件,作為一個bean註冊進Spring應用上下文。
39. 什麼是基於註解的容器配置?
相對於XML檔案,註解型的配置依賴於通過位元組碼元資料裝配元件,而非尖括號的宣告。
開發者通過在相應的類,方法或屬性上使用註解的方式,直接元件類中進行配置,而不是使用xml表述bean的裝配關係。
40. 怎樣開啟註解裝配?
註解裝配在預設情況下是不開啟的,為了使用註解裝配,我們必須在Spring配置檔案中配置 <context:annotation-config/>元素。
41. 使用Spring通過什麼方式訪問Hibernate?
在Spring中有兩種方式訪問Hibernate:
- 控制反轉 Hibernate Template和 Callback。
- 繼承 HibernateDAOSupport提供一個AOP 攔截器。
Spring支援以下ORM:
- Hibernate
- iBatis
- JPA (Java Persistence API)
- TopLink
- JDO (Java Data Objects)
- OJB
43.如何通過HibernateDaoSupport將Spring和Hibernate結合起來?
用Spring的 SessionFactory 呼叫 LocalSessionFactory。整合過程分三步:
- 配置the Hibernate SessionFactory。
- 繼承HibernateDaoSupport實現一個DAO。
- 在AOP支援的事務中裝配。
Spring支援兩種型別的事務管理:
- 程式設計式事務管理:這意味你通過程式設計的方式管理事務,給你帶來極大的靈活性,但是難維護。
- 宣告式事務管理:這意味著你可以將業務程式碼和事務管理分離,你只需用註解和XML配置來管理事務。
- 它為不同的事務API 如 JTA,JDBC,Hibernate,JPA 和JDO,提供一個不變的程式設計模式。
- 它為程式設計式事務管理提供了一套簡單的API而不是一些複雜的事務API如
- 它支援宣告式事務管理。
- 它和Spring各種資料訪問抽象層很好得整合。
49. 什麼是Spring MVC框架的控制器?
控制器提供一個訪問應用程式的行為,此行為通常通過服務介面實現。控制器解析使用者輸入並將其轉換為一個由檢視呈現給使用者的模型。Spring用一個非常抽象的方式實現了一個控制層,允許使用者建立多種用途的控制器。
50. 講下SpringMvc的核心入口類是什麼,Struts1,Struts2的分別是什麼
SpringMvc
的是DispatchServlet,Struts1的是ActionServlet,Struts2的是StrutsPrepareAndExecuteFilter
51. SpringMvc的控制器是不是單例模式,如果是,有什麼問題,怎麼解決
是單例模式,所以在多執行緒訪問的時候有執行緒安全問題,不要用同步,會影響效能的,解決方案是在控制器裡面不能寫欄位
52. SpingMvc中的控制器的註解一般用那個,有沒有別的註解可以替代
一般用@Conntroller註解,表示是表現層,不能用別的註解代替.
53. 如果在攔截請求中,我想攔截get方式提交的方法,怎麼配置
可以在@RequestMapping註解裡面加上method=RequestMethod.GET
54. 如果在攔截請求中,我想攔截提交引數中包含"type=test"字串,怎麼配置
可以在@RequestMapping註解裡面加上params="type=test"
返回值可以有很多型別,有String, ModelAndView,當一般用String比較好
在返回值前面加"forward:"就可以讓結果轉發,譬如"forward:user.do?name=method4" 在返回值前面加"redirect:"就可以讓返回值重定向,譬如"redirect:http://www.baidu.com"
通過ModelMap物件,可以在這個物件裡面用put方法,把物件加到裡面,前臺就可以通過el表示式拿到
58. SpringMvc中有個類把檢視和資料都合併的一起的,叫什麼
叫ModelAndView
59. 怎麼樣把ModelMap裡面的資料放入Session裡面
可以在類上面加上@SessionAttributes註解,裡面包含的字串就是要放入session裡面的key
61. 當一個方法向AJAX返回特殊物件,譬如Object,List等,需要做什麼處理
要加上@ResponseBody註解
63. 講下SpringMvc的執行流程
系統啟動的時候根據配置檔案建立spring的容器, 首先是傳送http請求到核心控制器disPatherServlet,spring容器通過對映器去尋找業務控制器,
使用介面卡找到相應的業務類,在進業務類時進行資料封裝,在封裝前可能會涉及到型別轉換,執行完業務類後使用ModelAndView進行檢視轉發,資料放在model中,用map傳遞資料進行頁面顯示。
64,Hibernate是如何延遲載入?
* Hibernate2延遲載入實現:a)實體物件 b)集合(Collection) * Hibernate3 提供了屬性的延遲載入功能
當Hibernate在查詢資料的時候,資料並沒有存在與記憶體中,當程式真正對資料的操作時,物件才存在與記憶體中,就實現了延遲載入,他節省了伺服器的記憶體開銷,從而提高了伺服器的效能。 Hibernate中怎樣實現類之間的關係?(如:一對多、多對多的關係) 類與類之間的關係主要體現在表與表之間的關係進行操作,它們都市對物件進行操作,我們程式中把所有的表與類都對映在一起,它們通過配置檔案中的many-to-one、one-to-many、many-to-many、
說下Hibernate的快取機制
* 內部快取存在Hibernate中又叫一級快取,屬於應用事物級快取 * 二級快取:
a)應用及快取
b)分散式快取
條件:資料不會被第三方修改、資料大小在可接受範圍、資料更新頻率低、同一資料被系統頻繁使用、非 關鍵資料
c) 第三方快取的實現 Hibernate的查詢方式 Sql、Criteria,object comptosition Hql:
* 屬性查詢 * 引數查詢、命名引數查詢 * 關聯查詢 * 分頁查詢 * 統計函式
66,如何優化Hibernate?
* 使用雙向一對多關聯,不使用單向一對多* 靈活使用單向一對多關聯* 不用一對一,用多對一取代* 配置物件快取,不使用集合快取* 一對多集合使用Bag,多對多集合使用Set* 繼承類使用顯式多型* 表字段要少,表關聯不要怕多,有二級快取撐腰
67,在資料庫中條件查詢速度很慢的時候,如何優化?
1.建索引2.減少表之間的關聯3.優化sql,儘量讓sql很快定位資料,不要讓sql做全表查詢,應該走索引,把資料量大的表排在前面4.簡化查詢欄位,沒用的欄位不要,已經對返回結果的控制,儘量返回少量資料
69,Hibernate的主鍵生成機制
-
- assigned主鍵由外部程式負責生成,無需Hibernate參與。2) hilo通過hi/lo 演算法實現的主鍵生成機制,需要額外的資料庫表儲存主鍵生成歷史狀態。3) seqhilo與hilo 類似,通過hi/lo 演算法實現的主鍵生成機制,只是主鍵歷史狀態儲存在Sequence中,適用於支援Sequence的資料庫,如Oracle。4) increment主鍵按數值順序遞增。此方式的實現機制為在當前應用例項中維持一個變數,以儲存著當前的最大值,之後每次需要生成主鍵的時候將此值加1作為主鍵。這種方式可能產生的問題是:如果當前有多個例項訪問同一個資料庫,那麼由於各個例項各自維護主鍵狀態,不同例項可能生成同樣的主鍵,從而造成主鍵重複異常。因此,如果同一資料庫有多個例項訪問,此方式必須避免使用。5) identity採用資料庫提供的主鍵生成機制。如DB2、SQL Server、MySQL中的主鍵生成機制。6) sequence採用資料庫提供的sequence 機制生成主鍵。如Oralce 中的Sequence。7) native由Hibernate根據底層資料庫自行判斷採用identity、hilo、sequence其中一種作為主鍵生成方式。8) uuid.hex由Hibernate基於128 位唯一值產生演算法生成16 進位制數值(編碼後以長度32 的字串表示)作為主鍵。9) uuid.string與uuid.hex 類似,只是生成的主鍵未進行編碼(長度16)。在某些資料庫中可能出現問題(如PostgreSQL)。10) foreign使用外部表的欄位作為主鍵。一般而言,利用uuid.hex方式生成主鍵將提供最好的效能和資料庫平臺適應性。
69,Mybatis比IBatis比較大的幾個改進是什麼?
a.
有介面繫結,包括註解繫結sql和xml繫結Sql ,b.動態sql由原來的節點配置變成OGNL表示式,c. 在一對一,一對多的時候引進了association,在一對多的時候引入了collection節點,不過都是在resultMap裡面配置
70,什麼是MyBatis的介面繫結,有什麼好處
介面對映就是在IBatis中任意定義介面,然後把接口裡面的方法和SQL語句繫結,我們直接呼叫介面方法就可以,這樣比起原來了SqlSession提供的方法我們可以有更加靈活的選擇和設定.
71,介面繫結有幾種實現方式,分別是怎麼實現的?
介面繫結有兩種實現方式,一種是通過註解繫結,就是在介面的方法上面加上@Select @Update等註解裡面包含Sql語句來繫結,另外一種就是通過xml裡面寫SQL來繫結,在這種情況下,要指定xml對映檔案裡面的namespace必須為介面的全路徑名.
72,什麼情況下用註解繫結,什麼情況下用xml繫結
當Sql語句比較簡單時候,用註解繫結,當SQL語句比較複雜時候,用xml繫結,一般用xml繫結的比較多
73,MyBatis實現一對一有幾種方式?具體怎麼操作的
有聯合查詢和巢狀查詢,聯合查詢是幾個表聯合查詢,只查詢一次,通過在resultMap裡面配置association節點配置一對一的類就可以完成;巢狀查詢是先查一個表,根據這個表裡面的結果的外來鍵id,去再另外一個表裡面查詢資料,也是通過association配置,但另外一個表的查詢通過select屬性配置
74,MyBatis實現一對多有幾種方式,怎麼操作的
有聯合查詢和巢狀查詢,聯合查詢是幾個表聯合查詢,只查詢一次,通過在resultMap裡面配置collection節點配置一對多的類就可以完成;巢狀查詢是先查一個表,根據這個表裡面的結果的外來鍵id,去再另外一個表裡面查詢資料,也是通過配置collection,但另外一個表的查詢通過select節點配置
75,MyBatis裡面的動態Sql是怎麼設定的?用什麼語法?
MyBatis
裡面的動態Sql一般是通過if節點來實現,通過OGNL語法來實現,但是如果要寫的完整,必須配合where,trim節點,where節點是判斷包含節點有內容就插入where,否則不插入,trim節點是用來判斷如果動態語句是以and 或or開始,那麼會自動把這個and或者or取掉
78,講下MyBatis的快取
MyBatis
的快取分為一級快取和二級快取,一級快取放在session裡面,預設就有,二級快取放在它的名稱空間裡,預設是開啟的,使用二級快取屬性類需要實現Serializable序列化介面(可用來儲存物件的狀態),可在它的對映檔案中配置<cache/>