1. 程式人生 > >【JAVA秒會技術之秒殺面試官】JavaEE常見面試題(四)

【JAVA秒會技術之秒殺面試官】JavaEE常見面試題(四)

裝配 配置文件 action getpara 表達 程序員 錯誤頁面 產生 創建

46.Request對象的主要方法?

答:(1)setAttribute(String name,Object):設置名字為name的request的參數值

(2)getAttribute(String name):返回由name指定的屬性值

(3)getAttributeNames():返回request對象所有屬性的名字集合,結果是一個枚舉的實例

(4)getCookies():返回客戶端的所有Cookie對象,結果是一個Cookie數組

(5)getCharacterEncoding():返回請求中的字符編碼方式

(6)getContentLength():返回請求的Body的長度

(7)getHeader(String name):獲得HTTP協議定義的文件頭信息

(8)getHeaders(String name):返回指定名字的request Header的所有值,結果是一個枚舉的實例

(9)getHeaderNames():返回所以request Header的名字,結果是一個枚舉的實例

(10)getInputStream():返回請求的輸入流,用於獲得請求中的數據

(11)getMethod():獲得客戶端向服務器端傳送數據的方法

(12)getParameter(String name):獲得客戶端傳送給服務器端的有name指定的參數值

(13)getParameterNames():獲得客戶端傳送給服務器端的所有參數的名字,結果是一個枚舉的實例

(14)getParametervalues(String name):獲得有name指定的參數的所有值

(15)getProtocol():獲取客戶端向服務器端傳送數據所依據的協議名稱

(16)getQueryString():獲得查詢字符串

(17)getRequestURI():獲取發出請求字符串的客戶端地址

(18)getRemoteAddr():獲取客戶端的IP地址

(19)getRemoteHost():獲取客戶端的名字

(20)getSession([Boolean create]):返回和請求相關Session

(21)getServerName():獲取服務器的名字

(22)getServletPath():獲取客戶端所請求的腳本文件的路徑

(23)getServerPort():獲取服務器的端口號

(24)removeAttribute(String name):刪除請求中的一個屬性

47.談一談你對Struts的理解?

答:①Struts是一個按MVC模式設計的Web層框架,其實它就是一個大大的servlet,這個servlet名為Action

Servlet,或是ActionServlet的子類。我們可以在web,xml文件中將符合某種特征的所有請求交給Servlet處理,這個Servlet再參照文件(通長為/WEB-INF/struts.cfg.xml)將各個請求分別分配給不同的action去處理;(一個擴展知識點:Struts的配置文件可以有多個,可以按照模塊配置各自的配置文件,這樣可以防止配置文件的過渡膨脹)

②ActionServlet把請求交給action去處理之前,會將參數封裝到一個formbean對象(就是一個java類,這個類中每個屬性對應一個請求參數),封裝成一個什麽樣的formbean對象呢?看配置文件。

③要說明的是,ActionServlet把formbean對象傳遞給action的execute方法之前,可能會調用formbean的validate方法進行校驗,只有校驗通過後,才會將這個formbean對象傳遞給action的execute方法,否則,它將返回一個錯誤頁面,這個錯誤頁面有input屬性指定,(看配置文件)作者為什麽將這裏命名為input屬性,而不是error屬性呢?

④action執行完成後,要返回結果視圖,這個結果視圖是用一個ActionForward對象看來表示的,actionforward對象通過struts-config.xml配置文件中配置關聯到某個jsp頁面,因為程序中使用的是在struts-config.xml配置文件,為jsp頁面設置的邏輯名,這樣可以實現action程序代碼與返回的jsp頁面名稱的解耦。

48談一談你對Hibernate的理解?

答:①概述:它是一個持久層的ORM(對象關系型映射)框架,使用Hibernate框架,不用寫JDBC代碼,僅僅是調用一個save方法,就可以將對象保存到關系數據庫中;僅僅是調用一個get方法,就可以從數據庫中加載出一個對象。

②使用Hibernate的基本流程:配置Configuration對象、產生SessionFactory、創建session對象,開啟事務,完成CRUD操作,提交事務,關閉session。

③配置文件:使用Hibernate時,先要配置hibernate.cfg.xml文件。其中配置數據連接信息和方言等,還要為每個實體配置相應的hbm.xml文件,然後在hibernate.cfg.xml文件中引入;

④關聯關系映射:

a)一對多:

(Ⅰ)一方:需要加入一個包含多方的set集合,註意必須要new。

(Ⅱ)多方:添加一方的bean對象,註意不用new。

(Ⅲ)註意:只配置一方即可正常維護運行。一般一方會放棄外鍵維護。

b)多對多:多對多保存中,有一方必須放棄維護中間表"inverse=ture"

⑤級聯關系:cascade的6種取值

none —— 不使用級聯

save-update —— 保存或修改

delete —— 刪除

delete-orphan —— 孤兒刪除(只有一對多才有!)

all —— 除了孤兒刪除,其他的所有

all-delte-orphan —— 包含孤兒刪除所有的。

⑥延遲加載:

底層:動態代理技術

第一次查詢時 ====> 至查詢ID值,生成代理對象(只含ID)

     =====> 繼續操作,如打印某屬性  ==發送sql語句==> 返回查詢值

類級別的延遲加載:查詢的是某一個對象

session.get()不延遲加載

session.load()延遲加載

兩者區別

關聯級別的延遲加載

 fetch="select" lazy="true"  延遲加載(默認)

 fetch="select" lazy="false" 不延遲加載

 fetch="select" lazy="extra" 極其延遲加載

⑦Hibernate三種檢索方式:

QBC(Query By Criteria)

HQL(Hibernate Query Language)

SQL(基本不用)

⑧緩存:

緩存概念

 緩存是內存中開辟的一塊空間,用來保存數據

 實質是:一些集合設計

一級緩存:Session

    自帶的,不能卸載。一定存在的,與Session生命周期一樣長

二級緩存:

    默認沒有開啟,只提供了相關的策略,需第三方插件,常用EHCache。

快照機制(SnapShot)

    持久態對象,在獲取的時候,會保存兩份:一份在緩存區,一份在快照區;

    在事務提交之前,會自動對比緩存區和快照區的數據,

    如果不一致,會自動修改緩存和快照區數據;

49.談一談你對Spring的理解?

①Spring是一個開源的業務層框架,分模塊,一站式框架,它能夠整合各種其他主流框架;

②Spring的實質就是一個實現了工廠模式的工廠類,在其配置文件中,通過添加標簽,來創建實例對象;

③Spring的核心——IoC/DI;

a)IoC(Inverse of Control)控制反轉,將對象的創建全交給Spring去管理,然後Spring容易通過依賴註入的方式,註入給調用者。這樣做的好處是,讓bean與bean之間以配置文件的形式組織在一起,而不是以硬編碼的方式耦合在一起。

b)依賴註入的方式有三種:接口註入、Setter方法註入(使用)、構造註入;

c)IoC的註解方式:

(Ⅰ)在applicationContext.xml配置文件中開啟組件掃描

(Ⅱ)在實現類上添加註解:@Component(value="id值")

@Component的三個衍生註解(功能一樣)

  • @Controller -- 作用在WEB層

  • @Service -- 作用在業務層

  • @Repository -- 作用在持久層

(Ⅲ)3.屬性註入的註解(說明:使用註解註入的方式,可以不用提供set方法)

  • @Value -- 用於註入普通類型

  • @Autowired -- 默認按類型進行自動裝配

  • @Qualifier -- 強制使用名稱註入

  • @Resource -- 相當於@Autowired和@Qualifier一起使用,強調:Java提供的註解,屬性使用name屬性

④Spring的核心——AOP;

a)AOP(面向切面編程),可以在不修改源代碼的前提下,對程序進行增強,例如,加入日誌,加入權限判斷,加入異常處理等;

b)AOP底層使用的是代理技術,分為JDK動態代理(面向接口)和CGLIB動態代理(沒接口的,產生子類代理);

c)使用步驟:

(Ⅰ)編寫切面類==>在IoC中配置切面類的bean標簽==>配置aop相關

(Ⅱ)切入點表達式:execution([修飾符] 返回值類型 包名.類名.方法名(參數))

一般簡寫為:execution( com...DaoImpl.save*(..))

(Ⅲ)通知類型

前置通知:

最終通知:如果程序出現了異常,最終通知也會執行。

後置通知:

異常拋出通知:

環繞通知:

  • 要註意:目標的方法默認不執行,需要使用ProceedingJoinPoint對來讓目標對象的方法執行。

50.JDBC、ibatis(mybatis)、Hibernate有什麽不同?

答:①JDBC編程流程固定,同時將sql語句和java代碼混在了一起,經常需要拼湊sql語句,細節很繁瑣;

②ibatis(mybatis)它不完全是一個ORM框架,因為MyBatis需要程序員自己編寫Sql語句,不過mybatis可以通過XML或註解方式靈活配置要運行的sql語句,並將java對象和sql語句映射生成最終執行的sql,最後將sql執行的結果再映射生成java對象。但是mybatis無法做到數據庫無關性,如果需要實現支持多種數據庫的軟件則需要自定義多套sql映射文件,工作量大。

③Hibernate對象/關系映射能力強,數據庫無關性好,因為hibernate自動生成sql語句,我們無法控制該語句,我們就無法去寫特定的高效率的sql。對於一些不太復雜的sql查詢,hibernate可以很好幫我們完成,但是,對於特別復雜的查詢,hibernate就很難適應了,這時候用ibatis就是不錯的選擇,因為ibatis還是由我們自己寫sql語句。

【JAVA秒會技術之秒殺面試官】JavaEE常見面試題(四)