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

【前言】別人都在你看不到的地方暗自努力,在你看獲得的地方,他們也和你同樣顯得不務正業,和你同樣會抱怨,而只有你本身相信這些都是真的,最後,也只有你一我的繼續不思進取 ……  java

【下載】我的結合諸多資料,總結的一些JavaEE常見面試題,主要針對初/中級程序員想要word完整版下載的,評論裏留言留下你的郵箱!程序員

46.Request對象的主要方法?web

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

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

(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的實質就是一個實現了工廠模式的工廠類,在其配置文件中,經過添加<bean>標籤,來建立實例對象;

③Spring的核心——IoC/DI;

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

b)依賴注入的方式有三種:接口注入、Setter方法注入(使用<property name="" value或者ref="">)、構造注入;

c)IoC的註解方式:

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

<context:component-scan base-package="com.itheima"/>

(Ⅱ)在實現類上添加註解:@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相關

<aop:config>

<!-- 配置切面類 -->

<aop:aspect ref="切面類">

<!-- 通知類:前置通知,還須要配置切入點表達式 ) -->

<aop:before method="加強方法" pointcut="切入點表達式"/>

</aop:aspect>

</aop:config>

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

通常簡寫爲:execution(* com.*.*.*DaoImpl.save*(..))

(Ⅲ)通知類型

前置通知:<aop:after method="before" pointcut-ref="myPointcut3"/>

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

  <aop:after method="after" pointcut-ref="myPointcut3"/>

後置通知:<aop:after-returning method="afterReturning" pointcut-ref="myPointcut2"/>

異常拋出通知:<aop:after-throwing method="afterThorwing" pointcut-ref="myPointcut3"/>

環繞通知:<aop:around method="around" pointcut-ref="myPointcut2"/>

* 要注意:目標的方法默認不執行,須要使用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語句。

相關文章
相關標籤/搜索