JavaEE面試常見的問題

2.說一下struts2-hibernate-Spring 的工做流程? 1). Struts2 負責顯示頁面和接受請求 2). Spring 的 IOC 容器管理各個組件: 整合 Struts2,Hibernate 和 其餘組件,AOP 完成聲明式事務 3). Hibernate 提供 DAO 操做. Strus二、SpringMVC Spring Hibernate、JPA\SpringData、Mybatis ------------------------------------------------------------ 3. Struts2 面試問題:  1). 簡述 Struts2 的工做流程:  ①. 請求發送給 StrutsPrepareAndExecuteFilter ②. StrutsPrepareAndExecuteFilter 斷定該請求是不是一個 Struts2 請求 ③. 若該請求是一個 Struts2 請求,則 StrutsPrepareAndExecuteFilter 把請求的處理交給 ActionProxy ④. ActionProxy 建立一個 ActionInvocation 的實例,並進行初始化 ⑤. ActionInvocation 實例在調用 Action 的過程先後,涉及到相關攔截器(Intercepter)的調用。 ⑥. Action 執行完畢,ActionInvocation 負責根據 struts.xml 中的配置找到對應的返回結果。        調用結果的 execute 方法,渲染結果。 ⑦. 執行各個攔截器 invocation.invoke() 以後的代碼 ⑧. 把結果發送到客戶端 2). Struts2 攔截器 和 過濾器 的區別: ①、過濾器依賴於Servlet容器,而攔截器不依賴於Servlet容器。 ②、Struts2 攔截器只能對 Action 請求起做用,而過濾器則能夠對幾乎全部請求起做用。 ③、攔截器能夠訪問 Action 上下文(ActionContext)、值棧裏的對象(ValueStack),而過濾器不能.  ④、在 Action 的生命週期中,攔截器能夠屢次調用,而過濾器只能在容器初始化時被調用一次。 3). 爲何要使用 Struts2 & Struts2 的優勢: ①. 基於 MVC 架構,框架結構清晰。 ②. 使用 OGNL: OGNL 能夠快捷的訪問值棧中的數據、調用值棧中對象的方法 ③. 攔截器: Struts2 的攔截器是一個 Action 級別的 AOP, Struts2 中的許多特性都是經過攔截器來實現的,         例如異常處理,文件上傳,驗證等。攔截器是可配置與重用的 ④. 多種表現層技術. 如:JSP、FreeMarker、Velocity 等 4). Struts2 如何訪問 HttpServletRequest、HttpSession、ServletContext 三個域對象 ? ①. 與 Servlet API 解耦的訪問方式 > 經過 ActionContext 訪問域對象對應的 Map 對象 > 經過實現 Aware 接口使 Struts2 注入對應的 Map 對象 ②.  與 Servlet API 耦合的訪問方式 > 經過 ServletActionContext 直接獲取 Servlet API 對象 > 經過實現 ServletXxxAware 接口的方式使 Struts2 注入對應的對象 5). Struts2 中的默認包 struts-default 有什麼做用? ①. struts-default 包是 struts2 內置的,它定義了 struts2 內部的衆多攔截器和 Result 類型,         而 Struts2 不少核心的功能都是經過這些內置的攔截器實現,         如:從請求中把請求參數封裝到action、文件上傳和數據驗證等等都是經過攔截器實現的。         當包繼承了struts-default包才能使用struts2爲咱們提供的這些功能。    ②. struts-default 包是在 struts-default.xml 中定義,struts-default.xml 也是 Struts2 默認配置文件。     Struts2 每次都會自動加載 struts-default.xml文件。   ③. 一般每一個包都應該繼承 struts-default 包。  6). 說出 struts2 中至少 5 個的默認攔截器 exception;fileUpload;i18n;modelDriven;params;prepare;token;tokenSession;validation 等  7). 談談 ValueStack: ①. ValueStack 貫穿整個 Action 的生命週期,保存在 request 域中,因此 ValueStack 和 request 的生命週期同樣.         當 Struts2 接受一個請求時,會迅速建立 ActionContext,ValueStack,Action.         而後把 Action 存放進 ValueStack,因此 Action 的實例變量能夠被 OGNL 訪問。         請求來的時候,Action、ValueStack 的生命開始;請求結束,Action、ValueStack的生命結束   ②. 值棧是多實例的,由於Action 是多例的(和 Servlet 不同,Servelt 是單例的),         而每一個 Action 都有一個對應的值棧,Action 對象默認保存在棧頂;   ③. ValueStack 本質上就是一個 ArrayList(查看源代碼獲得);   ④. 使用 OGNL 訪問值棧的內容時,不須要#號,而訪問 request、session、application、attr 時,須要加#號;   ⑤. Struts2 重寫了 request 的 getAttribute 方法,因此可使用 EL 直接訪問值棧中的內容 8). ActionContext、ServletContext、PageContext的區別 ? ①. ActionContext Struts2 的 API:是當前的 Action 的上下文環境 ②. ServletContext 和 PageContext 是 Servlet 的 API 9). Struts2 有哪幾種結果類型 ? 參看 struts-default.xml 中的相關配置:dispatcher、chain、redirect 等. 10). 攔截器的生命週期與工做過程 ? ①. 每一個攔截器都是須要實現 Interceptor 接口   > init():在攔截器被建立後當即被調用, 它在攔截器的生命週期內只被調用一次. 能夠在該方法中對相關資源進行必要的初始化;   > intercept(ActionInvocation invocation):每攔截一個動做請求,該方法就會被調用一次;   > destroy:該方法將在攔截器被銷燬以前被調用, 它在攔截器的生命週期內也只被調用一次;   11). 如何在 Struts2 中使用 Ajax 功能 ? ①. JSON plugin ②. DOJO plugin   ③. DWR plugin ④. 使用 Stream 結果類型.  ------------------------------------------------------------ 4. Hibernate 面試問題: 1). Hibernate 的查詢方式有哪些 ? ① 導航對象圖檢索   ② OID檢索   ③ HQL檢索   ④ QBC檢索   ⑤ 本地SQL檢索 2). 在 Hibernate 中 Java 對象的狀態有哪些 ? ①. 臨時狀態(transient):不處於 Session 的緩存中。OID 爲 null 或等於 id 的 unsaved-value 屬性值 ②. 持久化狀態(persistent):加入到 Session 的緩存中。 ③. 遊離狀態(detached):已經被持久化,但再也不處於 Session 的緩存中。 3). Session的清理和清空有什麼區別? 清理緩存調用的是 session.flush() 方法. 而清空調用的是 session.clear() 方法. Session 清理緩存是指按照緩存中對象的狀態的變化來同步更新數據庫,但不清空緩存;清空是把 Session 的緩存置空, 但不一樣步更新數據庫; 4). load()和get()的區別   ①:若是數據庫中,沒有 OID 指定的對象。經過 get方法加載,則返回的是一個null;經過load加載,則返回一個代理對象, 若是後面代碼若是調用對象的某個屬性會拋出異常:org.hibernate.ObjectNotFoundException;  ②:load 支持延遲加載,get 不支持延遲加載。  5). hibernate 優缺點 ①. 優勢: > 對 JDBC 訪問數據庫的代碼作了封裝,簡化了數據訪問層繁瑣的重複性代碼 > 映射的靈活性, 它支持各類關係數據庫, 從一對一到多對多的各類複雜關係.  > 非侵入性、移植性會好 > 緩存機制: 提供一級緩存和二級緩存 ②. 缺點: > 沒法對 SQL 進行優化 > 框架中使用 ORM 原則, 致使配置過於複雜 > 執行效率和原生的 JDBC 相比誤差: 特別是在批量數據處理的時候 > 不支持批量修改、刪除 6). 描述使用 Hibernate 進行大批量更新的經驗. 直接使用 hibernate API 進行批量更新和批量刪除都不推薦 > 執行 UPDATE 操做不會把該對象歸入到 Session 緩存中! 但沒法對更新提供定製的批量操做 > 把全部的對象都歸入到一級緩存中, 逐個取出, 逐個更新. 若對象不少, 會使一級緩存溢出! 而直接經過 JDBC API 執行相關的 SQl 語句或調用相關的存儲過程是最佳的方式 7). Hibernate 的 OpenSessionView 問題 ①. 用於解決懶加載異常, 主要功能就是把 Hibernate Session 和一個請求的線程綁定在一塊兒, 直到頁面完整輸出,  這樣就能夠保證頁面讀取數據的時候 Session 一直是開啓的狀態, 若是去獲取延遲加載對象也不會報錯。 ②. 問題: 若是在業務處理階段大批量處理數據, 有可能致使一級緩存裏的對象佔用內存過多致使內存溢出, 另一個是鏈接問題:   Session 和數據庫 Connection 是綁定在一塊兒的, 若是業務處理緩慢也會致使數據庫鏈接得不到及時的釋放, 形成鏈接池鏈接不夠. 因此在併發量較大的項目中不建議使用此種方式, 能夠考慮使用迫切左外鏈接 (LEFT OUTER JOIN FETCH) 或手工對關聯的對象進行初始化.  ③. 配置 Filter 的時候要放在 Struts2 過濾器的前面, 由於它要頁面徹底顯示完後再退出.   8). Hibernate 中 getCurrentSession() 和 openSession() 的區別 ?  ①. getCurrentSession() 它會先查看當前線程中是否綁定了 Session, 若是有則直接返回, 若是沒有再建立.  而openSession() 則是直接 new 一個新的 Session 並返回。 ②. 使用 ThreadLocal 來實現線程 Session 的隔離。 ③. getCurrentSession() 在事務提交的時候會自動關閉 Session, 而 openSession() 須要手動關閉. 9). Hibernate 批量操做 ①. 批量新增: 一次新增大批量對象, 避免一級緩存內存溢出, 能夠定時 flush() 以後再 clear() 掉,  ②. 批量更新: 能夠經過 hql 來批量更新 ③. 使用無狀態 Session 接口, 它不會實現一二級緩存查詢緩存交互, 查詢後的對象當即處於遊離態,  經過 update 或者 delete 能夠操做並同步到數據庫中 ④. 使用原生的 SQL 或存儲過程 10). 如何調用原生 SQL ? 調用 Session 的 doWork() 方法. ------------------------------------------------------------ 5. Spring 面試題 1). 開發中主要使用 Spring 的什麼技術 ? ①. IOC 容器管理各層的組件 ②. 使用 AOP 配置聲明式事務 ③. 整合其餘框架. 2). 簡述 AOP 和 IOC 概念 AOP: Aspect Oriented Program, 面向(方面)切面的編程;      Filter(過濾器)也是一種 AOP.       AOP 是一種新的方法論, 是對傳統 OOP(Object-Oriented Programming, 面向對象編程) 的補充.      AOP 的主要編程對象是切面(aspect), 而切面模塊化橫切關注點.             舉例經過事務說明.        IOC: Invert Of Control, 控制反轉. 也成爲 DI(依賴注入)             其思想是反轉資源獲取的方向. 傳統的資源查找方式要求組件向容器發起請求查找資源.              做爲迴應, 容器適時的返回資源. 而應用了 IOC 以後, 則是容器主動地將資源推送給它所管理的組件,              組件所要作的僅是選擇一種合適的方式來接受資源. 這種行爲也被稱爲查找的被動形式 3). 在 Spring 中如何配置 Bean ? Bean 的配置方式: 經過全類名(反射)、經過工廠方法(靜態工廠方法 & 實例工廠方法)、FactoryBean 4). IOC 容器對 Bean 的生命週期: ①. 經過構造器或工廠方法建立 Bean 實例 ②. 爲 Bean 的屬性設置值和對其餘 Bean 的引用 ③. 將 Bean 實例傳遞給 Bean 後置處理器的 postProcessBeforeInitialization 方法 ④. 調用 Bean 的初始化方法(init-method) ⑤. 將 Bean 實例傳遞給 Bean 後置處理器的 postProcessAfterInitialization方法 ⑥. Bean 可使用了 ⑦. 當容器關閉時, 調用 Bean 的銷燬方法(destroy-method) 5). Spring 如何整合 Struts2 ? 整合 Struts2, 即由 IOC 容器管理 Struts2 的 Action: > 安裝 Spring 插件: 把 struts2-spring-plugin-2.2.1.jar 複製到當前 WEB 應用的 WEB-INF/lib 目錄下 > 在 Spring 的配置文件中配置 Struts2 的 Action 實例 > 在 Struts 配置文件中配置 action, 但其 class 屬性再也不指向該 Action 的實現類, 而是指向 Spring 容器中 Action 實例的 ID 6). Spring 如何整合 Hibernate 整合 Hibernate, 即由 IOC 容器生成 SessionFactory 對象, 並使用 Spring 的聲明式事務 > 利用 LocalSessionFactoryBean 工廠 Bean, 聲明一個使用 XML 映射文件的 SessionFactory 實例. > 利用 HibernateTransactionManager 配置 Hibernate 的事務管理器 ------------------------------------------------------------ 6. Spring MVC 面試題 1). Spring MVC 比較 Struts2 ①. Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter ②. Spring MVC 會稍微比 Struts2 快些. Spring MVC 是基於方法設計, 而 Sturts2 是基於類, 每次發一次請求都會實例一個 Action. ③. Spring MVC 使用更加簡潔, 開發效率Spring MVC確實比struts2高: 支持JSR303, 處理 ajax 的請求更方便 ④. Struts2 的 OGNL 表達式使頁面的開發效率相比 Spring MVC 更高些.   2). Spring MVC 的運行流程 ①. 在整個 Spring MVC 框架中, DispatcherServlet 處於核心位置,負責協調和組織不一樣組件以完成請求處理並返回響應的工做 ②. SpringMVC 處理請求過程: > 若一個請求匹配 DispatcherServlet 的請求映射路徑(在 web.xml 中指定),  WEB 容器將該請求轉交給 DispatcherServlet 處理 > DispatcherServlet 接收到請求後, 將根據請求信息(包括 URL、HTTP 方法、請求頭、請求參數、Cookie 等)及  HandlerMapping 的配置找處處理請求的處理器(Handler). 可將 HandlerMapping 當作路由控制器,將 Handler 當作目標主機。 > 當 DispatcherServlet 根據 HandlerMapping 獲得對應當前請求的 Handler 後,經過 HandlerAdapter  對 Handler 進行封裝,再以統一的適配器接口調用 Handler。 > 處理器完成業務邏輯的處理後將返回一個 ModelAndView 給 DispatcherServlet,  ModelAndView 包含了視圖邏輯名和模型數據信息 > DispatcherServlet 藉助 ViewResoler 完成邏輯視圖名到真實視圖對象的解析 > 獲得真實視圖對象 View 後, DispatcherServlet 使用這個 View 對 ModelAndView 中的模型數據進行視圖渲染  ------------------------------------------------------------ 7. Shiro 面試題:  1). 比較 SpringSecurity 和 Shiro 相比 Spring Security, Shiro 在保持強大功能的同時, 使用簡單性和靈活性 > SpringSecurity: 即便是一個一個簡單的請求,最少得通過它的 8 個Filter > SpringSecurity 必須在 Spring 的環境下使用 > 初學 Spring Security, 曲線仍是較大, 須要深刻學習其源碼和框架, 配置起來也較費力. 2). Shiro 的優勢 > 簡單的身份認證, 支持多種數據源 > 對角色的簡單的受權, 支持細粒度的受權(方法級) > 支持一級緩存,以提高應用程序的性能; > 內置的基於 POJO 企業會話管理, 適用於 Web 以及非 Web 的環境 > 很是簡單的加密 API > 不跟任何的框架或者容器捆綁, 能夠獨立運行 3). 簡述 Shiro 的核心組件 Shiro 架構 3 個核心組件: > Subject: 正與系統進行交互的人, 或某一個第三方服務.  全部 Subject 實例都被綁定到(且這是必須的)一個SecurityManager 上。 > SecurityManager: Shiro 架構的心臟, 用來協調內部各安全組件, 管理內部組件實例, 並經過它來提供安全管理的各類服務.  當 Shiro 與一個 Subject 進行交互時, 實質上是幕後的 SecurityManager 處理全部繁重的 Subject 安全操做。 > Realms: 本質上是一個特定安全的 DAO. 當配置 Shiro 時, 必須指定至少一個 Realm 用來進行身份驗證和/或受權.  Shiro 提供了多種可用的 Realms 來獲取安全相關的數據. 如關係數據庫(JDBC), INI 及屬性文件等.  能夠定義本身 Realm 實現來表明自定義的數據源。 4). 認證過程: ①. 應用程序代碼調用 Subject.login 方法,傳遞建立好的包含終端用戶的 Principals(身份)和  Credentials(憑證)的 AuthenticationToken 實例 ②. Subject 實例: 一般爲 DelegatingSubject(或子類)委託應用程序的 SecurityManager 經過調用  securityManager.login(token) 開始真正的驗證。 ③. SubjectManager 接收 token,調用內部的 Authenticator 實例調用 authenticator.authenticate(token). Authenticator 一般是一個 ModularRealmAuthenticator 實例, 支持在身份驗證中協調一個或多個Realm 實例 ④. 若是應用程序中配置了一個以上的 Realm, ModularRealmAuthenticator 實例將利用配置好的  AuthenticationStrategy 來啓動 Multi-Realm 認證嘗試. 在Realms 被身份驗證調用以前, 期間和之後,  AuthenticationStrategy 被調用使其可以對每一個Realm 的結果做出反應. ⑤. 每一個配置的 Realm 用來幫助看它是否支持提交的 AuthenticationToken.  若是支持, 那麼支持 Realm 的 getAuthenticationInfo 方法將會伴隨着提交的 token 被調用.  getAuthenticationInfo 方法有效地表明一個特定 Realm 的單一的身份驗證嘗試。 5). 受權過程: ①. 應用程序或框架代碼調用任何 Subject 的hasRole*, checkRole*, isPermitted*,或者checkPermission*方法的變體,  傳遞任何所需的權限 ②. Subject 的實例—一般是 DelegatingSubject(或子類), 調用securityManager 的對應的方法.  ③. SecurityManager 調用 org.apache.shiro.authz.Authorizer 接口的對應方法.  默認狀況下,authorizer 實例是一個 ModularRealmAuthorizer 實例, 它支持協調任何受權操做過程當中的一個或多個Realm 實例 ④. 每一個配置好的 Realm 被檢查是否實現了相同的 Authorizer 接口.  若是是, Realm 各自的 hasRole*, checkRole*,isPermitted*,或 checkPermission* 方法將被調用。 6). 如何自實現認證: Shiro 的認證過程由 Realm 執行, SecurityManager 會調用 org.apache.shiro.realm.Realm 的  getAuthenticationInfo(AuthenticationToken token) 方法.  實際開發中, 一般提供 org.apache.shiro.realm.AuthenticatingRealm 的實現類,  並在該實現類中提供 doGetAuthenticationInfo(AuthenticationToken token)方法的具體實現 7). 如何實現自實現受權: 實際開發中, 一般提供  org.apache.shiro.realm.AuthorizingRealm 的實現類,  並提供 doGetAuthorizationInfo(PrincipalCollection principals) 方法的具體實現 6). 如何配置在 Spring 中配置使用 Shiro ①. 在 web.xml 中配置 Shiro 的 Filter ②. 在 Spring 的配置文件中配置  Shiro: > 配置自定義 Realm:實現自定義認證和受權 > 配置 Shiro 實體類使用的緩存策略 > 配置 SecurityManager > 配置保證 Shiro 內部 Bean 聲明週期都獲得執行的 Lifecycle Bean 後置處理器 > 配置AOP 式方法級權限檢查  > 配置 Shiro Filter ------------------------------------------------------------ 8.    ①. 數據庫集羣 通常來講 MySQL 是最經常使用的, 可能最初是一個 mysql 主機, 當數據增長到 100 萬以上,  MySQL的效能急劇降低. 經常使用的優化措施是 M-S(主-從) 方式進行同步複製, 將查詢和操做和分別在不一樣的服務器上進行操做.  ②. HTML 靜態化: 效率最高、消耗最小的就是純靜態化的 html 頁面, 因此要儘量使的應用中的頁面採用靜態頁面來實現.  ③. 作緩存集羣、負載均衡、分佈式存儲。 ------------------------------------------------------------ 1. 項目相關: 1). 一般會問簡歷中寫的項目,簡歷中能夠寫 3-4 個項目. 發項目模版.  2). 具體問題: ①. 簡述下你的項目. I.   總體介紹,大體說明下項目所實現的功能、多少人、用了多少時間、什麼技術、什麼數據庫 CRM 項目 - 客戶關係管理系統。 3 我的作了 1 年。50 我的月。 30 我的月左右 SpringMVC、Spring、Shiro、Oracle II.  介紹本身實現了哪些功能模塊 主要負責 "系統權限管理" 和 "營銷管理" 模塊. ②. 項目有什麼亮點 ?  I.   全程註解 II.  SpringMVC 對比 Struts2 使用註解開發更便捷。並且在處理 Aajx, 文件上傳、下載也更方便 III. 使用 Shiro 處理權限部分。相對於以前使用的 SpringSecurity 更容易上手。且配置也方便。並且支持方法級別的權限。 IV.  使用 Spring Data 作數據庫層,提升了開發效率。 ③. 項目中遇到困難,怎麼辦 ? I.  若是是業務問題:問同事 -> 問項目經理, 由項目經理解決 -> 有時候也直接和產品經理溝通. II. 技術問題:本身解決:Debug 測試, 查看部分源代碼 -> 百度、Google -> 問技術較好的同事 -> 項目經理 -> 把問題記錄下來,有時間整理 ④. 項目用到了哪些技術 ? 或者說用到了哪些框架 ? SpringMVC、Spring、JPA & SpringDATA、Shiro、Quartz、jQuery ⑤. 在該項目中有哪些提升或思考(不只是技術上可能也包括團隊上) ? I.   新技術的引入:第一次使用 SpringMVC 和 Shiro。相比 Struts2 和 SpringSecurity 更輕量級,使用也更順手。             雖然開始時不是很適應。因此不能排斥新技術 II.  感受時間安排的還不是很好。後期項目週期比較急,因此在和產品團隊的溝通上有些問題。(由於需求總會發生修改) ⑥. 你在項目中的角色 ? 或者說你都作了什麼 ? I. 研發、測試、新技術問題的彙總和解決。 ------------------------------------------------------------
相關文章
相關標籤/搜索