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