【JAVA秒會技術之秒殺面試官】JavaEE常見面試題(四)
答:(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常見面試題(四)