【JAVA面試】java面試題整理(2)
java面試題整理(2)
JAVA常考點總結2
目錄
1、JVM記憶體劃分
瞭解jvm記憶體區域的劃分,有助於我們在記憶體洩露和記憶體溢位的時候快速排查錯誤。
jvm將記憶體劃分為如下的幾個區域:
(1)程式計數器(Program Counter Register)
當前執行緒所執行的位元組碼的行號指示器,或者說位元組碼指令指示器。
特點:
【1】執行緒獨立。這個特點要從多執行緒的實現機制來談,多執行緒是通過輪流獲得CPU時間片的方式來實現的,那麼,為了執行緒切換後能恢復到上一次指令執行的位置,就需要為每一個執行緒配備程式計數器。因此,程式計數器是執行緒隔離的。
【2】若當前執行緒執行的是java方法,程式計數器的內容就是正在執行的位元組碼指令的地址。
【3】若當前執行緒執行的是一個naive方法,即本地方法,那麼程式計數器的內容為空。
【4】此塊區域是唯一的一塊沒有記憶體溢位的區域
(2)虛擬機器棧(VM Stack)
每個方法只執行的同時,都會在虛擬機器棧中建立一個棧幀(Stack Frame)。
棧幀中存放的有:區域性變量表、運算元棧、方法出口等
區域性變量表中存放著基本資料型別和物件的引用
虛擬機器棧的特點:
【1】虛擬機器棧可以處在物理上不連續記憶體空間上
【2】執行緒隔離,每一個執行緒都擁有屬於自己的虛擬機器棧。
【3】大多數虛擬機器棧都可以進行動態擴充套件,用來防止執行緒請求的棧深度過深,如果在進行擴充套件時,無法申請到足夠的記憶體,就會引發OutOfMemoryError錯誤。
(3)本地方法棧(Native Method Stack)
與虛擬機器棧類似,只不過虛擬機器棧為虛擬機器執行java方法服務,而本地方法棧為虛擬機器執行本地方法服務。
由於可使用的本地方法多樣,因此,我們並沒有對本地方法棧中使用到的語言,使用方式或者資料結構做出規定,不同的虛擬機器可以自由地實現本地方法棧。
(4)堆(Heap)
幾乎所有的物件例項與陣列都在堆上分配記憶體空間。
堆的特點:
【1】虛擬機器啟動時,則建立堆。
【2】執行緒共享
【3】堆可以處在物理上不連續的記憶體空間上,這一點與虛擬機器棧很像。
【4】堆的實現可以是固定大小的,也可以是可擴充套件的。
(5)方法區(Method Area)
它用於儲存已經被虛擬機器載入的類資訊、常量、靜態變數、編譯後的程式碼等資料。
特點:
【1】執行緒共享
【2】也可以進行垃圾收集,記憶體回收的主要目標是針對常量池的回收與型別的解除安裝。但型別解除安裝的條件十分苛刻,因此回收的效果不是太好。
【3】當方法區所需要的記憶體大於虛擬機器所分配的記憶體時,將會引發OutOfMemoryError錯誤。
方法區中提到比較多的還有一個執行時常量池,存放編譯期間或者執行期間動態建立的各種字面量和符號引用。字串常量池也是執行時常量池的一部分。
2、樂觀鎖與悲觀鎖
(1)樂觀鎖
總是認為不會產生併發問題,每次去取資料的時候總認為不會有其他執行緒對資料進行修改,因此不會上鎖,但是在更新時會判斷其他執行緒在這之前有沒有對資料進行修改,一般會使用版本號機制或CAS操作實現。
version方式:一般是在資料表中加上一個資料版本號version欄位,表示資料被修改的次數,當資料被修改時,version值會加一。當執行緒A要更新資料值時,在讀取資料的同時也會讀取version值,在提交更新時,若剛才讀取到的version值為當前資料庫中的version值相等時才更新,否則重試更新操作,直到更新成功。
核心SQL程式碼:
update table set x=x+1, version=version+1 where id=#{id} and version=#{version};
CAS操作方式:即compare and swap 或者 compare and set,涉及到三個運算元,資料所在的記憶體值,預期值,新值。當需要更新時,判斷當前記憶體值與之前取到的值是否相等,若相等,則用新值更新,若失敗則重試,一般情況下是一個自旋操作,即不斷的重試。
(2)悲觀鎖
總是假設最壞的情況,每次取資料時都認為其他執行緒會修改,所以都會加鎖(讀鎖、寫鎖、行鎖等),當其他執行緒想要訪問資料時,都需要阻塞掛起。可以依靠資料庫實現,如行鎖、讀鎖和寫鎖等,都是在操作之前加鎖,在Java中,synchronized的思想也是悲觀鎖。
讀取頻繁使用樂觀鎖,寫入頻繁使用悲觀鎖。
3、Spring的理解
(1)Spring中AOP的應用場景、Aop原理、好處?
答:AOP--Aspect Oriented Programming面向切面程式設計;用來封裝橫切關注點,具體可以在下面的場景中使用:
Authentication 許可權、Caching 快取、Context passing 內容傳遞、Error handling 錯誤處理Lazy loading懶載入、Debugging除錯、logging, tracing, profiling and monitoring 記錄跟蹤優化 校準、Performance optimization 效能優化、Persistence 持久化、Resource pooling 資源池、Synchronization 同步、Transactions 事務
原理:AOP是面向切面程式設計,是通過動態代理的方式為程式新增統一功能,集中解決一些公共問題。
優點: 1.各個步驟之間的良好隔離性耦合性大大降低
2.原始碼無關性,再擴充套件功能的同時不對原始碼進行修改操作
(2)Spring中IOC的作用與原理?物件建立的過程。
答:IOC--Inversion of Control控制反轉。當某個角色需要另外一個角色協助的時候,在傳統的程式設計過程中,通常由呼叫者來建立被呼叫者的例項物件。但在spring中建立被呼叫者的工作不再由呼叫者來完成,因此稱為控制反轉。建立被呼叫者的工作由spring來完成,然後注入呼叫者 直接使用。
(3)介紹spring框架
它是一個一站式(full-stack全棧式)框架,提供了從表現層-springMVC到業務層-spring再到持久層-springdata的一套完整的解決方案。我們在專案中可以只使用spring一個框架,它就可以提供表現層的mvc框架,持久層的Dao框架。它的兩大核心IoC和AOP更是為我們程式解耦和程式碼簡潔易維護提供了支援。
(4)Spring常見建立物件的註解?
答:@[email protected]@ [email protected] Repository
(5)Spring中用到的設計模式
答:簡單工廠、工廠方法、單例模式、介面卡、包裝器、代理、觀察者、策略、模板方法
詳細介紹:請參考本微博的:開發常用設計模式
(6)Spring的優點?
答:1.降低了元件之間的耦合性 ,實現了軟體各層之間的解耦
2.可以使用容易提供的眾多服務,如事務管理,訊息服務等
3.容器提供單例模式支援
4.容器提供了AOP技術,利用它很容易實現如許可權攔截,執行期監控等功能
5.容器提供了眾多的輔助類,能加快應用的開發
6.spring對於主流的應用框架提供了整合支援,如hibernate,JPA,Struts等
7.spring屬於低侵入式設計,程式碼的汙染極低
8.獨立於各種應用伺服器
9.spring的DI機制降低了業務物件替換的複雜性
10.Spring的高度開放性,並不強制應用完全依賴於Spring,開發者可以自由選擇spring 的部分或全部
(7)Spring Bean的作用域之間有什麼區別?
Spring容器中的bean可以分為5個範圍。所有範圍的名稱都是自說明的,但是為了避免混淆,還是讓我們來解釋一下:
singleton:這種bean範圍是預設的,這種範圍確保不管接受到多少個請求,每個容器中只有一個bean的例項,單例的模式由bean factory自身來維護。
prototype:原形範圍與單例範圍相反,為每一個bean請求提供一個例項。
request:在請求bean範圍內會每一個來自客戶端的網路請求建立一個例項,在請求完成以後,bean會失效並被垃圾回收器回收。
Session:與請求範圍類似,確保每個session中有一個bean的例項,在session過期後,bean會隨之失效。
global-session:global-session和Portlet應用相關。當你的應用部署在Portlet容器中工作時,它包含很多portlet。如果你想要宣告讓所有的portlet共用全域性的儲存變數的話,那麼這全域性變數需要儲存在global-session中。
全域性作用域與Servlet中的session作用域效果相同。
(8)Spring管理事務有幾種方式?
答:有兩種方式:
1、程式設計式事務,在程式碼中硬編碼。(不推薦使用)
2、宣告式事務,在配置檔案中配置(推薦使用)
宣告式事務又分為兩種:
a、基於XML的宣告式事務
b、基於註解的宣告式事務
(9)spring中自動裝配的方式有哪些?
答:1、 No:即不啟用自動裝配。
2、 byName:通過屬性的名字的方式查詢JavaBean依賴的物件併為其注入。比如說類Computer有個屬性printer,指定其autowire屬性為byName後,Spring IoC容器會在配置檔案中查詢id/name屬性為printer的bean,然後使用Seter方法為其注入。
3、 byType:通過屬性的型別查詢JavaBean依賴的物件併為其注入。比如類Computer有個屬性printer,型別為Printer,那麼,指定其autowire屬性為byType後,Spring IoC容器會查詢Class屬性為Printer的bean,使用Seter方法為其注入。
4、 constructor:通byType一樣,也是通過型別查詢依賴物件。與byType的區別在於它不是使用Seter方法注入,而是使用構造子注入。
5、 autodetect:在byType和constructor之間自動的選擇注入方式。
6、 default:由上級標籤<beans>的default-autowire屬性確定。
(10)spring中的核心類有那些,各有什麼作用?
答:BeanFactory:產生一個新的例項,可以實現單例模式
BeanWrapper:提供統一的get及set方法
ApplicationContext:提供框架的實現,包括BeanFactory的所有功能
(11)Bean的呼叫方式有哪些?
答:有三種方式可以得到Bean並進行呼叫:
使用BeanWrapper
HelloWorld hw=new HelloWorld();
BeanWrapper bw=new BeanWrapperImpl(hw);
bw.setPropertyvalue(”msg”,”HelloWorld”);
system.out.println(bw.getPropertyCalue(”msg”));
使用BeanFactory
InputStream is=new FileInputStream(”config.xml”);
XmlBeanFactory factory=new XmlBeanFactory(is);
HelloWorld hw=(HelloWorld) factory.getBean(”HelloWorld”);
system.out.println(hw.getMsg());
使用ApplicationConttext
ApplicationContext actx=new FleSystemXmlApplicationContext(”config.xml”);
HelloWorld hw=(HelloWorld) actx.getBean(”HelloWorld”);
System.out.println(hw.getMsg());
(12)什麼是IOC,什麼又是DI,他們有什麼區別?
答:依賴注入DI是一個程式設計模式和架構模型, 一些時候也稱作控制反轉,儘管在技術上來講,依賴注入是一個IOC的特殊實現,依賴注入是指一個物件應用另外一個物件來提供一個特殊的能力,例如:把一個 資料庫連線已引數的形式傳到一個物件的結構方法裡面而不是在那個物件內部自行建立一個連線。控制反轉和依賴注入的基本思想就是把類的依賴從類內部轉化到外 部以減少依賴
應用控制反轉,物件在被建立的時候,由一個調控系統內所有物件的外界實體,將其所依賴的物件的引用,傳遞給它。也可以說,依賴被注入到物件中。所 以,控制反轉是,關於一個物件如何獲取他所依賴的物件的引用,這個責任的反轉。
(13)spring有兩種代理方式:
答: 若目標物件實現了若干介面,spring使用JDK的java.lang.reflect.Proxy類代理。
優點:因為有介面,所以使系統更加鬆耦合
缺點:為每一個目標類建立介面
若目標物件沒有實現任何介面,spring使用CGLIB庫生成目標物件的子類。
優點:因為代理類與目標類是繼承關係,所以不需要有介面的存在。
缺點:因為沒有使用介面,所以系統的耦合性沒有使用JDK的動態代理好。
4、SpringMVC的理解
(1)springMVC的流程?
答:1.使用者傳送請求至前端控制器DispatcherServlet
2.DispatcherServlet收到請求呼叫HandlerMapping處理器對映器。
3.處理器對映器根據請求url找到具體的處理器,生成處理器物件及處理器攔截器(如果有則生成)一併返回給DispatcherServlet。
4.DispatcherServlet通過HandlerAdapter處理器介面卡呼叫處理器
5.執行處理器(Controller,也叫後端控制器)。
6.Controller執行完成返回ModelAndView
7.HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet
8.DispatcherServlet將ModelAndView傳給ViewReslover檢視解析器
9.ViewReslover解析後返回具體View
10.DispatcherServlet對View進行渲染檢視(即將模型資料填充至檢視中)。
11.DispatcherServlet響應使用者
(2)Springmvc的優點
答:1.它是基於元件技術的.全部的應用物件,無論控制器和檢視,還是業務物件之類的都是 java元件.並且和Spring提供的其他基礎結構緊密整合.
2.不依賴於Servlet API(目標雖是如此,但是在實現的時候確實是依賴於Servlet的)
3. 可以任意使用各種檢視技術,而不僅僅侷限於JSP
4 . 支援各種請求資源的對映策略
5 .它應是易於擴充套件的
5、SpringMVC常問面試題
f-sm-1. 講下SpringMvc和Struts1,Struts2的比較的優勢
效能上Struts1>SpringMvc>Struts2 開發速度上SpringMvc和Struts2差不多,比Struts1要高
f-sm-2. 講下SpringMvc的核心入口類是什麼,Struts1,Struts2的分別是什麼
SpringMvc的是DispatchServlet,Struts1的是ActionServlet,Struts2的是StrutsPrepareAndExecuteFilter
f-sm-3. SpringMvc的控制器是不是單例模式,如果是,有什麼問題,怎麼解決
是單例模式,所以在多執行緒訪問的時候有執行緒安全問題,不要用同步,會影響效能的,解決方案是在控制器裡面不能寫欄位
f-sm-4. SpingMvc中的控制器的註解一般用那個,有沒有別的註解可以替代
一般用@Controller註解,表示是表現層,不能用用別的註解代替.
f-sm-5. @RequestMapping註解用在類上面有什麼作用
用於類上,表示類中的所有響應請求的方法都是以該地址作為父路徑。
f-sm-6. 怎麼樣把某個請求對映到特定的方法上面
直接在方法上面加上註解@RequestMapping,並且在這個註解裡面寫上要攔截的路徑
f-sm-7. 如果在攔截請求中,我想攔截get方式提交的方法,怎麼配置
可以在@RequestMapping註解裡面加上method=RequestMethod.GET
f-sm-8. 如果在攔截請求中,我想攔截提交引數中包含"type=test"字串,怎麼配置
可以在@RequestMapping註解裡面加上params="type=test"
f-sm-9. 我想在攔截的方法裡面得到從前臺傳入的引數,怎麼得到
直接在形參裡面宣告這個引數就可以,但必須名字和傳過來的引數一樣
f-sm-10. 如果前臺有很多個引數傳入,並且這些引數都是一個物件的,那麼怎麼樣快速得到這個物件
直接在方法中宣告這個物件,SpringMvc就自動會把屬性賦值到這個物件裡面
f-sm-11. 怎麼樣在方法裡面得到Request,或者Session
直接在方法的形參中宣告request,SpringMvc就自動把request物件傳入
f-sm-12. SpringMvc中函式的返回值是什麼.
返回值可以有很多型別,有String, ModelAndView,當一般用String比較好
f-sm-13. SpringMvc怎麼處理返回值的
SpringMvc根據配置檔案中InternalResourceViewResolver的字首和字尾,用字首+返回值+字尾組成完整的返回值
f-sm-14. SpringMVC怎麼樣設定重定向和轉發的
在返回值前面加"forward:"就可以讓結果轉發,譬如"forward:user.do?name=method4" 在返回值前面加"redirect:"就可以讓返回值重定向,譬如"redirect:http://www.baidu.com"
f-sm-15. SpringMvc用什麼物件從後臺向前臺傳遞資料的
通過ModelMap物件,可以在這個物件裡面用put方法,把物件加到裡面,前臺就可以通過el表示式拿到
f-sm-16. SpringMvc中有個類把檢視和資料都合併的一起的,叫什麼
叫ModelAndView
f-sm-17. 怎麼樣把ModelMap裡面的資料放入Session裡面
可以在類上面加上@SessionAttributes註解,裡面包含的字串就是要放入session裡面的key
f-sm-18. SpringMvc怎麼和AJAX相互呼叫的
通過Jackson框架就可以把Java裡面的物件直接轉化成Js可以識別的Json物件
具體步驟如下
1.加入Jackson.jar
2.在配置檔案中配置json的對映
3.在接受Ajax方法裡面可以直接返回Object,List等,但方法前面要加上@ResponseBody註解
f-sm-19. 當一個方法向AJAX返回特殊物件,譬如Object,List等,需要做什麼處理
要加上@ResponseBody註解
f-sm-20. SpringMvc裡面攔截器是怎麼寫的
有兩種寫法,一種是實現介面,另外一種是繼承介面卡類,然後在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>
f-sm-21. 講下SpringMvc的執行流程
系統啟動的時候根據配置檔案建立spring的容器, 首先是傳送http請求到核心控制器disPatherServlet,spring容器通過對映器去尋找業務控制器,
使用介面卡找到相應的業務類,在進業務類時進行資料封裝,在封裝前可能會涉及到型別轉換,執行完業務類後使用ModelAndView進行檢視轉發,資料放在model中,用map傳遞資料進行頁面顯示。
5、MyBatis理解
1、#{}和${}的區別是什麼?
#{}是預編譯處理,${}是字串替換。
Mybatis在處理#{}時,會將sql中的#{}替換為?號,呼叫PreparedStatement的set方法來賦值;
Mybatis在處理${}時,就是把${}替換成變數的值。
使用#{}可以有效的防止SQL注入,提高系統安全性。
2、當實體類中的屬性名和表中的欄位名不一樣 ,怎麼辦 ?
第1種: 通過在查詢的sql語句中定義欄位名的別名,讓欄位名的別名和實體類的屬性名一致
<select id=”selectorder” parametertype=”int” resultetype=”me.gacl.domain.order”>
select order_id id, order_no orderno ,order_price price form orders where order_id=#{id};
</select>
第2種: 通過<resultMap>來對映欄位名和實體類屬性名的一一對應的關係
<select id="getOrder" parameterType="int" resultMap="orderresultmap">
select * from orders where order_id=#{id}
</select>
<resultMap type=”me.gacl.domain.order” id=”orderresultmap”>
<!–用id屬性來對映主鍵欄位–>
<id property=”id” column=”order_id”>
<!–用result屬性來對映非主鍵欄位,property為實體類屬性名,column為資料表中的屬性–>
<result property = “orderno” column =”order_no”/>
<result property=”price” column=”order_price” />
</reslutMap>
3、 模糊查詢like語句該怎麼寫?
(1)第1種:在Java程式碼中新增sql萬用字元。
string wildcardname = “%smi%”;
list<name> names = mapper.selectlike(wildcardname);
<select id=”selectlike”>
select * from foo where bar like #{value}
</select>
(2)第2種:在sql語句中拼接萬用字元,會引起sql注入
string wildcardname = “smi”;
list<name> names = mapper.selectlike(wildcardname);
<select id=”selectlike”>
select * from foo where bar like "%"#{value}"%"
</select>
4、通常一個Xml對映檔案,都會寫一個Dao介面與之對應,請問,這個Dao介面的工作原理是什麼?Dao接口裡的方法,引數不同時,方法能過載嗎?
Dao介面,就是人們常說的Mapper介面,介面的全限名,就是對映檔案中的namespace的值,介面的方法名,就是對映檔案中MappedStatement的id值,介面方法內的引數,就是傳遞給sql的引數。Mapper介面是沒有實現類的,當呼叫介面方法時,介面全限名+方法名拼接字串作為key值,可唯一定位一個MappedStatement,舉例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace為com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中,每一個<select>、<insert>、<update>、<delete>標籤,都會被解析為一個MappedStatement物件。
Dao接口裡的方法,是不能過載的,因為是全限名+方法名的儲存和尋找策略。
Dao介面的工作原理是JDK動態代理,Mybatis執行時會使用JDK動態代理為Dao介面生成代理proxy物件,代理物件proxy會攔截介面方法,轉而執行MappedStatement所代表的sql,然後將sql執行結果返回。
5、Mybatis是如何進行分頁的?分頁外掛的原理是什麼?
Mybatis使用RowBounds物件進行分頁,它是針對ResultSet結果集執行的記憶體分頁,而非物理分頁,可以在sql內直接書寫帶有物理分頁的引數來完成物理分頁功能,也可以使用分頁外掛來完成物理分頁。
分頁外掛的基本原理是使用Mybatis提供的外掛介面,實現自定義外掛,在外掛的攔截方法內攔截待執行的sql,然後重寫sql,根據dialect方言,新增對應的物理分頁語句和物理分頁引數。
6、Mybatis是如何將sql執行結果封裝為目標物件並返回的?都有哪些對映形式?
答:第一種是使用<resultMap>標籤,逐一定義列名和物件屬性名之間的對映關係。第二種是使用sql列的別名功能,將列別名書寫為物件屬性名,比如T_NAME AS NAME,物件屬性名一般是name,小寫,但是列名不區分大小寫,Mybatis會忽略列名大小寫,智慧找到與之對應物件屬性名,你甚至可以寫成T_NAME AS NaMe,Mybatis一樣可以正常工作。
有了列名與屬性名的對映關係後,Mybatis通過反射建立物件,同時使用反射給物件的屬性逐一賦值並返回,那些找不到對映關係的屬性,是無法完成賦值的。
7、如何執行批量插入?
(1)首先,建立一個簡單的insert語句:
<insert id=”insertname”>
insert into names (name) values (#{value})
</insert>
(2)然後在java程式碼中像下面這樣執行批處理插入:
list<string> names = new arraylist();
names.add(“fred”);
names.add(“barney”);
names.add(“betty”);
names.add(“wilma”);
// 注意這裡 executortype.batch
sqlsession sqlsession = sqlsessionfactory.opensession(executortype.batch);
try {
namemapper mapper = sqlsession.getmapper(namemapper.class);
for (string name : names) {
mapper.insertname(name);
}
sqlsession.commit();
} finally {
sqlsession.close();
}
8、如何獲取自動生成的(主)鍵值?
insert 方法總是返回一個int值 - 這個值代表的是插入的行數。
而自動生成的鍵值在 insert 方法執行完後可以被設定到傳入的引數物件中。
示例:
<insert id=”insertname” usegeneratedkeys=”true” keyproperty=”id”>
insert into names (name) values (#{name})
</insert>
name name = new name();
name.setname(“fred”);
int rows = mapper.insertname(name);
// 完成後,id已經被設定到物件中
system.out.println(“rows inserted = ” + rows);
system.out.println(“generated key value = ” + name.getid());
9、在mapper中如何傳遞多個引數?
(1)第1種:
//DAO層的函式
Public UserselectUser(String name,String area);
//對應的xml,#{0}代表接收的是dao層中的第一個引數,#{1}代表dao層中第二引數,更多引數一致往後加即可。
<select id="selectUser"resultMap="BaseResultMap">
select * fromuser_user_t whereuser_name = #{0} anduser_area=#{1}
</select>
(2)第2種: 使用 @param 註解:
import org.apache.ibatis.annotations.param;
public interface usermapper {
user selectuser(@param(“username”) string username,
@param(“hashedpassword”) string hashedpassword);
}
然後,就可以在xml像下面這樣使用(推薦封裝為一個map,作為單個引數傳遞給mapper):
<select id=”selectuser” resulttype=”user”>
select id, username, hashedpassword
from some_table
where username = #{username}
and hashedpassword = #{hashedpassword}
</select>
10、Mybatis動態sql是做什麼的?都有哪些動態sql?能簡述一下動態sql的執行原理不?
Mybatis動態sql可以讓我們在Xml對映檔案內,以標籤的形式編寫動態sql,完成邏輯判斷和動態拼接sql的功能。
Mybatis提供了9種動態sql標籤:trim|where|set|foreach|if|choose|when|otherwise|bind。
其執行原理為,使用OGNL從sql引數物件中計算表示式的值,根據表示式的值動態拼接sql,以此來完成動態sql的功能。
11、Mybatis的Xml對映檔案中,不同的Xml對映檔案,id是否可以重複?
不同的Xml對映檔案,如果配置了namespace,那麼id可以重複;如果沒有配置namespace,那麼id不能重複;畢竟namespace不是必須的,只是最佳實踐而已。
原因就是namespace+id是作為Map<String, MappedStatement>的key使用的,如果沒有namespace,就剩下id,那麼,id重複會導致資料互相覆蓋。有了namespace,自然id就可以重複,namespace不同,namespace+id自然也就不同。
12、為什麼說Mybatis是半自動ORM對映工具?它與全自動的區別在哪裡?
Hibernate屬於全自動ORM對映工具,使用Hibernate查詢關聯物件或者關聯集合物件時,可以根據物件關係模型直接獲取,所以它是全自動的。而Mybatis在查詢關聯物件或關聯集合物件時,需要手動編寫sql來完成,所以,稱之為半自動ORM對映工具。
13、 一對一、一對多的關聯查詢 ?
<mapper namespace="com.lcb.mapping.userMapper">
<!--association 一對一關聯查詢 -->
<select id="getClass" parameterType="int" resultMap="ClassesResultMap">
select * from class c,teacher t where c.teacher_id=t.t_id and c.c_id=#{id}
</select>
<resultMap type="com.lcb.user.Classes" id="ClassesResultMap">
<!-- 實體類的欄位名和資料表的欄位名對映 -->
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher" javaType="com.lcb.user.Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
</association>
</resultMap>
<!--collection 一對多關聯查詢 -->
<select id="getClass2" parameterType="int" resultMap="ClassesResultMap2">
select * from class c,teacher t,student s where c.teacher_id=t.t_id and c.c_id=s.class_id and c.c_id=#{id}
</select>
<resultMap type="com.lcb.user.Classes" id="ClassesResultMap2">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher" javaType="com.lcb.user.Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
</association>
<collection property="student" ofType="com.lcb.user.Student">
<id property="id" column="s_id"/>
<result property="name" column="s_name"/>
</collection>
</resultMap>
</mapper>
6、Ajax的理解
1、什麼是AJAX,為什麼要使用Ajax(請談一下你對Ajax的認識)
什麼是ajax:
AJAX是“Asynchronous JavaScript and XML”的縮寫。他是指一種建立互動式網頁應用的網頁開發技術。
Ajax包含下列技術:
基於web標準(standards-basedpresentation)XHTML+CSS的表示;
使用 DOM(Document ObjectModel)進行動態顯示及互動;
使用 XML 和 XSLT 進行資料交換及相關操作;
使用 XMLHttpRequest 進行非同步資料查詢、檢索;
使用 JavaScript 將所有的東西繫結在一起。
為什麼要用ajax:
Ajax應用程式的優勢在於:
1. 通過非同步模式,提升了使用者體驗
2. 優化了瀏覽器和伺服器之間的傳輸,減少不必要的資料往返,減少了頻寬佔用
3. Ajax引擎在客戶端執行,承擔了一部分本來由伺服器承擔的工作,從而減少了大使用者量下的伺服器負載。
2、AJAX最大的特點是什麼。
Ajax可以實現動態不重新整理(區域性重新整理)
就是能在不更新整個頁面的前提下維護資料。這使得Web應用程式更為迅捷地迴應使用者動作,並避免了在網路上傳送那些沒有改變過的資訊。
3、請介紹一下XMLhttprequest物件。
Ajax的核心是JavaScript物件XmlHttpRequest。該物件在Internet Explorer 5中首次引入,它是一種支援非同步請求的技術。簡而言之,XmlHttpRequest使您可以使用JavaScript向伺服器提出請求並處理響應,而不阻塞使用者。通過XMLHttpRequest物件,Web開發人員可以在頁面載入以後進行頁面的區域性更新。
4、AJAX技術體系的組成部分有哪些。
HTML,css,dom,xml,xmlHttpRequest,javascript
5、AJAX應用和傳統Web應用有什麼不同。
在傳統的Javascript程式設計中,如果想得到伺服器端資料庫或檔案上的資訊,或者傳送客戶端資訊到伺服器,需要建立一個HTML form然後GET或者POST資料到伺服器端。使用者需要點選”Submit”按鈕來發送或者接受資料資訊,然後等待伺服器響應請求,頁面重新載入。
因為伺服器每次都會返回一個新的頁面, 所以傳統的web應用有可能很慢而且使用者互動不友好。
使用AJAX技術, 就可以使Javascript通過XMLHttpRequest物件直接與伺服器進行互動。
通過HTTP Request, 一個web頁面可以傳送一個請求到web伺服器並且接受web伺服器返回的資訊(不用重新載入頁面),展示給使用者的還是通一個頁面,使用者感覺頁面重新整理,也看不到到Javascript後臺進行的傳送請求和接受響應。
6、AJAX請求總共有多少種CALLBACK。
Ajax請求總共有八種Callback
onSuccess
onFailure
onUninitialized
onLoading
onLoaded
onInteractive
onComplete
onException
7.Ajax和javascript的區別。
javascript是一種在瀏覽器端執行的指令碼語言,Ajax是一種建立互動式網頁應用的開發技術 ,它是利用了一系列相關的技術其中就包括javascript。
Javascript是由網景公司開發的一種指令碼語言,它和sun公司的java語言是沒有任何關係的,它們相似的名稱只是一種行銷策略。
在一般的web開發中,javascript是在瀏覽器端執行的,我們可以用javascript控制瀏覽器的行為和內容。
在 Ajax應用中資訊是如何在瀏覽器和伺服器之間傳遞的
通過XML資料或者字串
8、在瀏覽器端如何得到伺服器端響應的XML資料。
XMLHttpRequest物件的responseXMl屬性
9、 XMLHttpRequest物件在IE和Firefox中建立方式有沒有不同。
有,IE中通過new ActiveXObject()得到,Firefox中通過newXMLHttpRequest()得到
10、介紹一下XMLHttpRequest物件的常用方法和屬性。
open(“method”,”URL”) 建立對伺服器的呼叫,第一個引數是HTTP請求 方式可以為GET,POST或任何伺服器所支援的您想呼叫的方式。
第二個引數是請求頁面的URL。
send()方法,傳送具體請求
abort()方法,停止當前請求
readyState屬性 請求的狀態 有5個可取值0=未初始化 ,1=正在載入
2=以載入,3=互動中,4=完成
responseText 屬性 伺服器的響應,表示為一個串
reponseXML 屬性 伺服器的響應,表示為XML
status 伺服器的HTTP狀態碼,200對應ok 400對應not found
12、什麼是XML
XML是擴充套件標記語言,能夠用一系列簡單的標記描述資料
13、XML的解析方式
常用的用dom解析和sax解析。dom解析是一次性讀取xml檔案並將其構造為DOM物件供程式使用,優點是操作方便,但是比較耗記憶體。Sax是按事件驅動的方式解析的,佔用記憶體少,但是程式設計複雜
14、你採用的是什麼框架(架包)
這題是必問的,一般也是最開始就會問到。
在java中比較流行的有 dojo, Prototype , JQuery, Dwr, extjs 等等
15、如果熟悉某種ajax框架,他可能會問到怎樣在程式中使用這種框架
DWR框架介紹
DWR(DirectWeb Remoting)是一個WEB遠端呼叫框架.利用這個框架可以讓AJAX開發變得很簡單.利用DWR可以在客戶端利用JavaScript直接呼叫服務端的Java方法並返回值給JavaScript就好像直接本地客戶端呼叫一樣(DWR根據Java類來動態生成JavaScrip程式碼).
DWR的實現原理是通過反射,將java翻譯成javascript,然後利用回撥機制,從而實現了javascript呼叫Java程式碼
16、介紹一下Prototype的()函式,()函式,F()函式,$A()函式都是什麼作用
$() 方法是在DOM中使用過於頻繁的document.getElementById() 方法的一個便利的簡寫,就像這個DOM方法一樣,這個方法返回引數傳入的id的那個元素。
$F()函式是另一個大收歡迎的“快捷鍵”,它能用於返回任何表單輸入控制元件的值,比如textbox,drop-down list。這個方法也能用元素id或元