知識點總結: Java 面試寶典 2013版(超長版) - Java Web 部分

1. Servlet 生命週期

Servlet 有良好的生存期的定義,包括加載,實例化,初始化,處理請求以及服務結束。
這個生存期由javax.servlet.Servlet 接口的init,service和destroy方法表達。
- Servlet被服務器實例化後,容器運行其init方法;
- 請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX 方法(doPost,doGet)等;
- 當服務器決定將實例銷燬時調用destroy方法

2. Servlet 基本架構

public class ServletName extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //do something
    }
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws  ServletException, IOException {
        //do something
    }
}

3. Servlet API 中forward() 和 redirect()

  • forward() : 僅僅是容器中控制權的轉向,是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來再發送給瀏覽器,瀏覽器根本就不知道發送的內容是從哪裏來的。在客戶端瀏覽器地址欄中還是原來的地址,不會顯示轉向後的地址;比較高效,推薦使用。
  • redirect() : 是完全的跳轉,是瀏覽器根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址。瀏覽器會得到跳轉的地址,用剛纔請求的所有參數重新發送請求,所以session,request參數都可以獲取。可以看到地址欄中跳轉的地址。有時需要跳轉到另一個服務器時必須使用sendRedirect().

4. request.getAttribute() 和 request.getParameter()

方法名 返回值
getAttribute 返回的是Object 獲取Session的值 服務器重定向forward,接收setAttribute傳過來的值
getParameter 返回的是String 獲取Post/Get傳遞的參數值 客戶端重定向redirect,點擊鏈接或提交,接收表單或url重定向傳值

5. JSP 九大內置對象:

  • request : 用戶端請求,此請求包含來自GET/POST請求的參數,可以獲取cookie,header和session等數據;
  • response: 網頁傳回用戶端的響應,可以設置送回瀏覽器的參數,如cookie,header等;
  • pageContext: 網頁的屬性管理,方便存取各種範圍的名字空間、servlet相關對象的API,以及包裝了servlet相關功能的方法。
  • session: 與請求有關的會話期,存貯用戶的狀態信息;
  • application servlet: 正在執行的內容,有助於查找有關servlet引擎和sevlet環境的信息;
  • out: 用來傳送的響應的輸出,是javax.jsp.Jspwriter的一個實例,用於向瀏覽器會送輸出結果。
  • config: Servlet的架構部件,javax.servlet.ServeletConfig 對象,存取servlet實例的初始化參數。
  • page: JSP網頁本身 ,表示從該頁面產生的一個servlet實例。
  • exception:錯誤的網頁

6. JSP中include 動態&靜態

  • 動態include:<jsp:include page=index.jsp flush=true>總是會檢查所含文件中的變化,適用於包含動態頁面,並且可以帶參數.
  • 靜態include: %@include file=index.html % 用僞代碼實現,不會檢查所含文件的變化,適用於包含靜態頁面

7. 頁面間傳遞對象的方法:

  • request
  • session
  • application
  • cookie

8. JSP 和 Servlet 異同

Jsp 是Servlet技術的擴展,本質是Servlet的簡易方法,更強調應用的外表表達。
Servlet 與 Jsp最大的不同是,Servlet的應用邏輯是在Java文件中,並且完全從表示層的HTML分離出來,側重於控制邏輯;
而JSP是Java 和 Html 可以組合成一個jsp文件,側重於視圖。

9. MVC 技術實現

  • Model 應用的業務邏輯,通過JavaBean,EJB組件實現;
  • View 應用的表示層,由JSP頁面產生
  • Controller 提供應用的處理過程控制,一般是Servlet

10. 數據連接池的工作機制

J2EE服務器啓動時會建立一定數量的池連接,並一直維持不少於此數目的池連接。
客戶端需要連接時,池驅動就會返回一個未使用的池連接並將其標記爲忙。
如果當前沒有空閒連接,池驅動程序就會新建一定數量的連接,數目由配置參數決定。
當使用的池連接調用完成後,池驅動程序就可以將其標記爲閒,下次就可以繼續使用。
實現方法: 返回的connection是原始的connection的代理,代理connection的close方法不是真正的關閉連接,而是把代理的connection對象還回到連接池中。

11. Struts 框架

Strust 是一個按照MVC模式設計的Web層框架,其實本質上就是一個大大的Servlet,名爲ActionServlet 以及其子類。
在web.xml 文件中將符合某種特徵的所有請求交給這個Servlet處理,Servlet再參照另外一個配置文件(一般是 /WEB_INF/strust-config.xml)將各個請求分別分配給不同的action處理。分配到action之前,ActionServlet將請求參數封裝成formBean對象。 action處理完後,返回顯示的結果視圖,用ActionForward對象表示,這個對象通過strust-config.xml配置文件關聯到某個jsp頁面。

12. Hibernate 框架

面向對象的軟件實際上就是處理對象,爲了存儲對象,可以將其保存在數據庫中。
Java 用jdbc 來實現與數據庫的交互,但是需要些大量重複性的代碼來實現。
人們通多封裝jdbc代碼成ORM框架來實現這個這個映射關係。
Hibernate是一種流行的ORM(Object Relation Mapping)框架。使用Hibernate,不用寫JDBC代碼,僅僅是調用一個save方法,就可以將對象保存到數據庫中,僅僅調用一個get方法就可以從數據庫中加載出一個對象。
首先要配置hibernate.cfg.xml 文件,其中配置數據庫連接信息,還要爲每個實體配置相應的hbm.xml文件,並在hibernate.cfg.xml 文件中登記每一個hbm.xml文件。
Hibernate 基本流程:

  • 配置Configuration對象
  • 產生SessionFactory
  • 創建session對象
  • 啓動事物
  • 完成CRUD操作
  • 提交事物
  • 關閉session

13. Spring 框架

Spring 實現了工廠模式的工廠類,類名是BeanFactory(實際上是一個接口)。在程序中通常是BeanFactory的子類ApplicationContext。
Spring相當於一個大工廠,在配置文件中通過 <bean> 來創建實例對象的類名和屬性。
Spring 中提供了對AOP的良好封裝。AOP是面向切面編程,就是系統中有很多不相干的類的方法,在衆多方法中加入某種系統功能的代碼,如加入日誌,加入權限判斷,加入異常處理,這些應用稱爲AOP。
實現AOP功採用的是代理技術。客戶端不再調用目標類,而是調用代理類。代理類和目標類對外具有相同的方法聲明。
只需在spring配置文件中配給這兩個元素即可實現代理和AOP。

14. 、iBatis與Hibernate有什麼不同?

相同點:屏蔽jdbc api的底層訪問細節,使用我們不用與jdbc api打交道,就可以訪問數據。
jdbc api編程流程固定,還將sql語句與java代碼混雜在了一起,經常需要拼湊sql語句,細節很繁瑣。

ibatis的好處:屏蔽jdbc api的底層訪問細節;將sql語句與java代碼進行分離;提供了將結果集自動封裝稱爲實體對象和對象的集合的功能,queryForList返回對象集合,用queryForObject返回單個對象;提供了自動將實體對象的屬性傳遞給sql語句的參數。
Hibernate是一個全自動的orm映射工具,它可以自動生成sql語句,ibatis需要我們自己在xml配置文件中寫sql語句,hibernate要比ibatis功能負責和強大很多。因爲hibernate自動生成sql語句,我們無法控制該語句,我們就無法去寫特定的高效率的sql。對於一些不太複雜的sql查詢,hibernate可以很好幫我們完成,但是,對於特別複雜的查詢,hibernate就很難適應了,這時候用ibatis就是不錯的選擇,因爲ibatis還是由我們自己寫sql語句。

15.Hibernate的二級緩存

  • 緩存就是把以前從數據庫中查詢出來和使用過的對象保存在內存中(一個數據結構中),這個數據結構通常是或類似Hashmap,當以後要使用某個對象時,先查詢緩存中是否有這個對象,如果有則使用緩存中的對象,如果沒有則去查詢數據庫,並將查詢出來的對象保存在緩存中,以便下次使用
  • )Hibernate的Session就是一種緩存,我們通常將之稱爲Hibernate的一級緩存,當想使用session從數據庫中查詢出一個對象時,Session也是先從自己內部查看是否存在這個對象,存在則直接返回,不存在纔去訪問數據庫,並將查詢的結果保存在自己內部。由於Session代表一次會話過程,一個Session與一個數據庫連接相關連,所以Session最好不要長時間保持打開,通常僅用於一個事務當中,在事務結束時就應關閉。並且Session是線程不安全的,被多個線程共享時容易出現問題。通常只有那種全局意義上的緩存纔是真正的緩存應用,纔有較大的緩存價值.
  • 因此,Hibernate的Session這一級緩存的緩存作用並不明顯,應用價值不大。Hibernate的二級緩存就是要爲Hibernate配置一種全局緩存,讓多個線程和多個事務都可以共享這個緩存。我們希望的是一個人使用過,其他人也可以使用,session沒有這種效果.
  • 二級緩存是獨立於Hibernate的軟件部件,屬於第三方的產品,多個廠商和組織都提供有緩存產品,例如,EHCache和OSCache等等。在Hibernate中使用二級緩存,首先就要在hibernate.cfg.xml配置文件中配置使用哪個廠家的緩存產品,接着需要配置該緩存產品自己的配置文件,最後要配置Hibernate中的哪些實體對象要納入到二級緩存的管理中。明白了二級緩存原理和有了這個思路後,很容易配置起Hibernate的二級緩存。

擴展知識:一個SessionFactory可以關聯一個二級緩存,也即一個二級緩存只能負責緩存一個數據庫中的數據,當使用Hibernate的二級緩存後,注意不要有其他的應用或SessionFactory來更改當前數據庫中的數據,這樣緩存的數據就會與數據庫中的實際數據不一致

16.J2EE

J2EE 是Sun公司提出的多層(multi-diered),分佈式(distributed),基於組件(component-base)的企業級應用模型(enterpriese applicationmodel).在這樣的一個應用系統中,可按照功能劃分爲不同的組件,這些組件又可在不同計算機上,並且處於相應的層次(tier)中。所屬層次包括客戶層(clietn tier)組件,web層和組件,Business層和組件,企業信息系統(EIS)層。
J2EE本身是一個標準,一個爲企業分佈式應用的開發提供的標準平臺。
J2EE也是一個框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技術。
J2EE 中常用的術語:
- web容器:給處於其中的應用程序組件(JSP,SERVLET)提供一個環境,使JSP,SERVLET直接更容器中的環境變量接口交互,不必關注其它系統問題。主要有WEB服務器來實現。例如:TOMCAT,WEBLOGIC,WEBSPHERE等
- EJB容器:Enterprise java bean容器。更具有行業領域特色。他提供給運行在其中的組件EJB各種管理功能。只要滿足J2EE規範的EJB放入該容器,馬上就會被容器進行高效率的管理。並且可以通過現成的接口來獲得系統級別的服務。主要提供聲明週期管理、代碼產生、持續性管理、安全、事務管理、鎖和併發行管理等服務
- JNDI:(Java Naming & Directory Interface)JAVA命名目錄服務。主要提供的功能是:提供一個目錄系統,讓其它各地的應用程序在其上面留下自己的索引,從而滿足快速查找和定位分佈式應用程序的功能。
- JMS:(Java Message Service)JAVA消息服務。主要實現各個應用程序之間的通訊。包括點對點和廣播。
- JTA:(Java Transaction API)JAVA事務服務。提供各種分佈式事務服務。應用程序只需調用其提供的接口即可。
- JAF:(Java Action FrameWork)JAVA安全認證框架。提供一些安全控制方面的框架。讓開發者通過各種部署和自定義實現自己的個性安全控制策略。
- RMI/IIOP:(Remote Method Invocation /internet對象請求中介協議)他們主要用於通過遠程調用服務。例如,遠程有一臺計算機上運行一個程序,它提供股票分析服務,我們可以在本地計算機上實現對其直接調用。當然這是要通過一定的規範才能在異構的系統之間進行通信。RMI是JAVA特有的。

17.EJB與JAVA BEAN的區別?

Java Bean 是可複用的組件,對Java Bean並沒有嚴格的規範,理論上講,任何一個Java類都可以是一個Bean。但通常情況下,由於Java Bean是被容器所創建(如Tomcat)的,所以Java Bean應具有一個無參的構造器,另外,通常Java Bean還要實現Serializable接口用於實現Bean的持久性。Java Bean實際上相當於微軟COM模型中的本地進程內COM組件,它是不能被跨進程訪問的。Enterprise Java Bean相當於DCOM,即分佈式組件。它是基於Java的遠程方法調用(RMI)技術的,所以EJB可以被遠程訪問(跨進程、跨計算機)。但EJB必須被佈署在諸如Webspere、WebLogic這樣的容器中,EJB客戶從不直接訪問真正的EJB組件,而是通過其容器訪問。EJB容器是EJB組件的代理,EJB組件由容器所創建和管理。客戶通過容器來訪問真正的EJB組件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章