【JAVA面試】java面試題整理(2)

                                           java面試題整理(2)

JAVA常考點總結2

目錄

1、 JVM內存劃分 1

2、 樂觀鎖與悲觀鎖 3

3、Spring的理解 3

4、SpringMVC的理解 7

5、SpringMVC常問面試題 8

5、 MyBatis理解 10

6、 Ajax的理解 16

7、 XML的三種解析 20

 

 

 

 

 

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常見創建對象的註解?

 

答:@Component@Controller@ Service@ 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或元素本身做爲參數。

$A()函數能把它接收到的單個的參數轉換成一個Array對象。

 

17、介紹一下XMLHttpRequest對象

 

通過XMLHttpRequest對象,Web開發人員可以在頁面加載以後進行頁面的局部更新。

AJAX開始流行始於Google在2005年使用的”Google Suggest”。

“Google Suggest”就是使用XMLHttpRequest對象來創建動態的Web接口:

當用戶開始輸入google的搜索框,Javascript發送用戶輸入的字符到服務器,然後服務器返回一個建議列表。

XMLHttpRequest對象在IE5.0+, Safari 1.2, Mozilla1.0/Firefox, Opera 8+ 和NetScapt7 開始被支持。

 

18、AJAX的全稱是什麼? 介紹一下AJAX?

 

AJAX的全稱是Asynchronous JavaScript And XML.

AJAX是2005年由Google發起並流行起來的編程方法, AJAX不是一個新的編程語言,但是它是一個使用已有標準的新的編程技術。

使用AJAX可以創建更好,更快,更用戶界面友好的Web應用。

AJAX技術基於Javascript和HTTP Request.

 

19、Ajax主要包含了哪些技術?

 

Ajax(Asynchronous JavaScript + XML)的定義

基於web標準(standards-based presentation)XHTML+CSS的表示;

使用 DOM(Document Object Model)進行動態顯示及交互;

使用 XML 和 XSLT 進行數據交換及相關操作;

使用XMLHttpRequest 進行異步數據查詢、檢索;

使用 JavaScript 將所有的東西綁定在一起。英文參見Ajax的提出者Jesse James Garrett的原文,原文題目(Ajax: A New Approach to Web Applications)。

類似於DHTML或LAMP,AJAX不是指一種單一的技術,而是有機地利用了一系列相關的技術。事實上,一些基於AJAX的“派生/合成”式(derivative/composite)的技術正在出現,如“AFLAX”。

AJAX的應用使用支持以上技術的web瀏覽器作爲運行平臺。這些瀏覽器目前包括:Mozilla、Firefox、Internet Explorer、Opera、Konqueror及Safari。但是Opera不支持XSL格式對象,也不支持XSLT。

 

20、AJAX都有哪些優點和缺點?

 

1、最大的一點是頁面無刷新,用戶的體驗非常好。

2、使用異步方式與服務器通信,具有更加迅速的響應能力。

3、可以把以前一些服務器負擔的工作轉嫁到客戶端,利用客戶端閒置的能力來處理,減輕服務器和帶寬的負擔,節約空間和寬帶租用成本。並且減輕服務器的負擔,ajax的原則是“按需取數據”,可以最大程度的減少冗餘請求,和響應對服務器造成的負擔。

4、基於標準化的並被廣泛支持的技術,不需要下載插件或者小程序。

ajax的缺點

1、ajax不支持瀏覽器back按鈕。

2、安全問題 AJAX暴露了與服務器交互的細節。

3、對搜索引擎的支持比較弱。

4、破壞了程序的異常機制。

5、不容易調試。

 

 

7、XML的三種解析

(1)SAX

SAX(Simple API for XML) 使用流式處理的方式,它並不記錄所讀內容的相關信息。

 

它是一種以事件爲驅動的XML API,解析速度快,佔用內存少。使用回調函數來實現。

 

缺點是不能倒退。

 

(2)DOM

DOM(Document Object Model) 是一種用於XML文檔的對象模型,可用於直接訪問 XML 文檔的各個部分。

 

它是一次性全部將內容加載在內存中,生成一個樹狀結構,它沒有涉及回調和複雜的狀態管理。

 

缺點是加載大文檔時效率低下。

 

(3)PULL

Pull 內置於 Android 系統中。也是官方解析佈局文件所使用的方式。

 

Pull 與 SAX 有點類似,都提供了類似的事件,如開始元素和結束元素。

 

不同的是,SAX 的事件驅動是回調相應方法,需要提供回調的方法,而後在 SAX 內部自動調用相應的方法。

 

而Pull解析器並沒有強制要求提供觸發的方法。因爲他觸發的事件不是一個方法,而是一個數字。它使用方便,效率高。

 

SAX、DOM、Pull 三者的比較:

 

內存佔用:SAX、Pull比DOM要好;

 

編程方式:SAX 採用事件驅動,在相應事件觸發的時候,會調用用戶編好的方法,也即每解析一類 XML,就要編寫一個新的適合該類XML的處理類。DOM 是 W3C 的規範,Pull 簡潔。

 

訪問與修改:SAX 採用流式解析,DOM 隨機訪問。

 

訪問方式:SAX,Pull 解析的方式是同步的,DOM 逐字逐句。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章