【Java基礎面試題】【03】

來源:互聯網
上載者:User

標籤:java   面試   面試題   

81、JDBC中如何進行交易處理?

答:Connection提供了交易處理的方法,通過調用setAutoCommit(false)可以設定手動提交事務;當事務完成後用commit()顯式提交事務;如果在交易處理過程中發生異常則通過rollback()進行交易回復。除此之外,從JDBC 3.0中還引入了Savepoint(儲存點)的概念,允許通過代碼設定儲存點並讓交易回復到指定的儲存點。

82、JDBC能否處理Blob和Clob?

答: Blob是指二進位大對象(Binary Large Object),而Clob是指大字元對象(Character Large Objec),因此其中Blob是為儲存大的位元據而設計的,而Clob是為儲存大的文本資料而設計的。JDBC的PreparedStatement和ResultSet都提供了相應的方法來支援Blob和Clob操作。

83、簡述Regex及其用途。

答:在編寫處理字串的程式時,經常會有尋找符合某些複雜規則的字串的需要。Regex就是用於描述這些規則的工具。換句話說,Regex就是記錄文本規則的代碼。
說明:電腦誕生初期處理的資訊幾乎都是數值,但是時過境遷,今天我們使用電腦處理的資訊更多的時候不是數值而是字串,Regex就是在進行字串匹配和處理的時候最為強大的工具,絕大多數語言都提供了對Regex的支援。

84、Java中是如何支援Regex操作的?

答:Java中的String類提供了支援Regex操作的方法,包括:matches()、replaceAll()、replaceFirst()、split()。此外,Java中可以用Pattern類表示Regex對象,它提供了豐富的API進行各種Regex操作。

面試題: - 如果要從字串中截取第一個英文左括弧之前的字串,例如:北京市(朝陽區)(西城區)(海澱區),截取結果為:北京市,那麼Regex怎麼寫?

import java.util.regex.Matcher;import java.util.regex.Pattern;class RegExpTest {    public static void main(String[] args) {        String str = "北京市(朝陽區)(西城區)(海澱區)";        Pattern p = Pattern.compile(".*?(?=\\()");        Matcher m = p.matcher(str);        if(m.find()) {            System.out.println(m.group());        }    }}

85、獲得一個類的類對象有哪些方式?
答:

  • 方法1:類型.class,例如:String.class
  • 方法2:對象.getClass(),例如:”hello”.getClass()
  • 方法3:Class.forName(),例如:Class.forName(“java.lang.String”)。
86、如何通過反射建立對象?

答:

  • 方法1:通過類對象調用newInstance()方法,例如:String.class.newInstance()
  • 方法2:通過類對象的getConstructor()或getDeclaredConstructor()方法獲得構造器(Constructor)對象並調用其newInstance()方法建立對象,例如:String.class.getConstructor(String.class).newInstance(“Hello”);
87、如何通過反射擷取和設定對象私人欄位的值?

答:可以通過類對象的getDeclaredField()方法欄位(Field)對象,然後再通過欄位對象的setAccessible(true)將其設定為可以訪問,接下來就可以通過get/set方法來擷取/設定欄位的值了。

89、簡述一下物件導向的”六原則一法則”。

答:

  • 單一職責原則:一個類只做它該做的事情。(單一職責原則想表達的就是”高內聚”,寫代碼最終極的原則只有六個字”高內聚、低耦合”。
  • 開閉原則:軟體實體應當對擴充開放,對修改關閉。(在理想的狀態下,當我們需要為一個軟體系統增加新功能時,只需要從原來的系統派生出一些新類就可以,不需要修改原來的任何一行代碼。要做到開閉有兩個要點:①抽象是關鍵,一個系統中如果沒有抽象類別或介面系統就沒有擴充點;②封裝可變性,將系統中的各種可變因素封裝到一個繼承結構中,如果多個可變因素混雜在一起,系統將變得複雜而換亂,如果不清楚如何封裝可變性,可以參考《設計模式精解》一書中對橋樑模式的講解的章節。)
  • 依賴倒轉原則:面向介面編程。(該原則說得直白和具體一些就是聲明方法的參數類型、方法的傳回型別、變數的參考型別時,儘可能使用抽象類別型而不用具體類型,因為抽象類別型可以被它的任何一個子類型所替代,請參考下面的裡氏替換原則。)
  • 裡氏替換原則:任何時候都可以用子類型替換掉父類型。(關於裡氏替換原則的描述,Barbara Liskov女士的描述比這個要複雜得多,但簡單的說就是能用父類型的地方就一定能使用子類型。裡氏替換原則可以檢查繼承關係是否合理,如果一個繼承關係違背了裡氏替換原則,那麼這個繼承關係一定是錯誤的,需要對代碼進行重構。例如讓貓繼承狗,或者狗繼承貓,又或者讓正方形繼承長方形都是錯誤的繼承關係,因為你很容易找到違反裡氏替換原則的情境。需要注意的是:子類一定是增加父類的能力而不是減少父類的能力,因為子類比父類的能力更多,把能力多的對象當成能力少的對象來用當然沒有任何問題。)
  • 介面隔離原則:介面要小而專,絕不能大而全。(臃腫的介面是對介面的汙染,既然介面表示能力,那麼一個介面只應該描述一種能力,介面也應該是高度內聚的。例如,琴棋書畫就應該分別設計為四個介面,而不應設計成一個介面中的四個方法,因為如果設計成一個介面中的四個方法,那麼這個介面很難用,畢竟琴棋書畫四樣都精通的人還是少數,而如果設計成四個介面,會幾項就實現幾個介面,這樣的話每個介面被複用的可能性是很高的。Java中的介面代表能力、代表約定、代表角色,能否正確的使用介面一定是編程水平高低的重要標識。)
  • 合成彙總複用原則:優先使用彙總或合成關係複用代碼。(通過繼承來複用代碼是物件導向程式設計中被濫用得最多的東西,因為所有的教科書都無一例外的對繼承進行了鼓吹從而誤導了初學者,類與類之間簡單的說有三種關係,Is-A關係、Has-A關係、Use-A關係,分別代表繼承、關聯和依賴。其中,關聯關係根據其關聯的強度又可以進一步劃分為關聯、彙總和合成,但說白了都是Has-A關係,合成彙總複用原則想表達的是優先考慮Has-A關係而不是Is-A關係複用代碼,原因嘛可以自己從百度上找到一萬個理由,需要說明的是,即使在Java的API中也有不少濫用繼承的例子,例如Properties類繼承了Hashtable類,Stack類繼承了Vector類,這些繼承明顯就是錯誤的,更好的做法是在Properties類中放置一個Hashtable類型的成員並且將其鍵和值都設定為字串來儲存資料,而Stack類的設計也應該是在Stack類中放一個Vector對象來儲存資料。記住:任何時候都不要繼承工具類,工具是可以擁有並可以使用的,而不是拿來繼承的。)
  • 迪米特法則:迪米特法則又叫最少知識原則,一個對象應當對其他對象有儘可能少的瞭解。(迪米特法則簡單的說就是如何做到”低耦合”,門面模式和調停者模式就是對迪米特法則的踐行。對於門面模式可以舉一個簡單的例子,你去一家公司洽談業務,你不需要瞭解這個公司內部是如何運作的,你甚至可以對這個公司一無所知,去的時候只需要找到公司入口處的前台美女,告訴她們你要做什麼,她們會找到合適的人跟你接洽,前台的美女就是公司這個系統的門面。再複雜的系統都可以為使用者提供一個簡單的門面,Java Web開發中作為前端控制器的Servlet或Filter不就是一個門面嗎,瀏覽器對伺服器的運作方式一無所知,但是通過前端控制器就能夠根據你的請求得到相應的服務。調停者模式也可以舉一個簡單的例子來說明,例如一台電腦,CPU、記憶體、硬碟、顯卡、音效卡各種裝置需要相互配合才能很好的工作,但是如果這些東西都直接連接到一起,電腦的布線將異常複雜,在這種情況下,主板作為一個調停者的身份出現,它將各個裝置串連在一起而不需要每個裝置之間直接交換資料,這樣就減小了系統的耦合度和複雜度。
90、簡述一下你瞭解的設計模式。

答:所謂設計模式,就是一套被反覆使用的代碼設計經驗的總結(情境中一個問題經過證實的一個解決方案)。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。設計模式使人們可以更加簡單方便的複用成功的設計和體繫結構。將已證實的技術表述成設計模式也會使新系統開發人員更加容易理解其設計思路。
在GoF的《Design Patterns: Elements of Reusable Object-Oriented Software》中給出了三類(建立型[對類的執行個體化過程的抽象化]、結構型[描述如何將類或對象結合在一起形成更大的結構]、行為型[對在不同的對象之間劃分責任和演算法的抽象化])共23種設計模式,包括:Abstract Factory(抽象原廠模式),Builder(建造者模式),Factory Method(Factory 方法模式),Prototype(原始模型模式),Singleton(單例模式);Facade(門面模式),Adapter(適配器模式),Bridge(橋樑模式),Composite(合成模式),Decorator(裝飾模式),Flyweight(享元模式),Proxy(代理模式);Command(命令模式),Interpreter(解譯器模式),Visitor(訪問者模式),Iterator(迭代子模式),Mediator(調停者模式),Memento(備忘錄模式),Observer(觀察者模式),State(狀態模式),Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibility(責任鏈模式)。
面試被問到關於設計模式的知識時,可以揀最常用的作答,例如:

  • 原廠模式:工廠類可以根據條件產生不同的子類執行個體,這些子類有一個公用的抽象父類並且實現了相同的方法,但是這些方法針對不同的資料進行了不同的操作(多態方法)。當得到子類的執行個體後,開發人員可以調用基類中的方法而不必考慮到底返回的是哪一個子類的執行個體。
  • 代理模式:給一個對象提供一個代理對象,並由代理對象控制原對象的引用。實際開發中,按照使用目的的不同,代理可以分為:遠程代理、虛擬代理、保護代理、Cache代理、防火牆代理、同步化代理、智能引用代理。
  • 適配器模式:把一個類的介面變換成用戶端所期待的另一種介面,從而使原本因介面不匹配而無法在一起使用的類能夠一起工作。
  • 模板方法模式:提供一個抽象類別,將部分邏輯以具體方法或構造器的形式實現,然後聲明一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法(多態實現),從而實現不同的商務邏輯。
    除此之外,還可以講講上面提到的門面模式、橋樑模式、單例模式、裝潢模式(Collections工具類和I/O系統中都使用裝潢模式)等,反正基本原則就是揀自己最熟悉的、用得最多的作答,以免言多必失。
92、什麼是UML?

答:UML是整合模組化語言(Unified Modeling Language)的縮寫,它發表於1997年,綜合了當時已經存在的物件導向的建模語言、方法和過程,是一個支援模型化和軟體系統開發的圖形化語言,為軟體開發的所有階段提供模型化和可視化支援。使用UML可以協助溝通與交流,輔助應用設計和文檔的產生,還能夠闡釋系統的結構和行為。

93、UML中有哪些常用的圖?

答:UML定義了多種圖形化的符號來描述軟體系統部分或全部的靜態結構和動態結構,包括:使用案例圖(use case diagram)、類圖(class diagram)、時序圖(sequence diagram)、共同作業圖表(collaboration diagram)、狀態圖(statechart diagram)、活動圖表(activity diagram)、構件圖(component diagram)、部署圖(deployment diagram)等。在這些圖形化符號中,有三種圖最為重要,分別是:使用案例圖(用來捕獲需求,描述系統的功能,通過該圖可以迅速的瞭解系統的功能模組及其關係)、類圖(描述類以及類與類之間的關係,通過該圖可以快速瞭解系統)、時序圖(描述執行特定任務時對象之間的互動關係以及執行順序,通過該圖可以瞭解對象能接收的訊息也就是說對象能夠向外界提供的服務)。

94、什麼是ORM?

答:對象關係映射(Object-Relational Mapping,簡稱ORM)是一種為瞭解決程式的物件導向模型與資料庫的關聯式模式互不匹配問題的技術;簡單的說,ORM 是通過使用描述對象和資料庫之間映射的中繼資料(可以用XML或者是註解),將Java程式中的對象自動持久化到關聯式資料庫中或者將關聯式資料庫表中的行轉換成Java對象,其本質上就是將資料從一種形式轉換到另外一種形式。

95、說一下你對約定優於配置(CoC)的理解。

答:約定優於配置(convention over configuration),也稱作按約定編程,是一種軟體設計範式,旨在減少軟體開發人員需做決定的數量,獲得簡單的好處而又不失靈活性。CoC本質是說,開發人員僅需規定應用中不符約定的部分。例如,如果模型中有個名為Sale的類,那麼資料庫中對應的表就會預設命名為sales。只有在偏離這一約定時,例如將該表命名為products_sold,才需寫有關這個名字的配置。如果您所用工具的約定與你的期待相符,便可省去配置;反之,你可以配置來達到你所期待的方式。遵循約定雖然損失了一定的靈活性,不能隨意安排目錄結構,不能隨意進行函數命名,但是卻能減少配置。更重要的是,遵循約定可以協助開發人員遵守構建標準,包括各種命名的規範,這對團隊開發是非常有利的。

96、說出Servlet的生命週期

答:Web容器載入Servlet並將其執行個體化後,Servlet生命週期開始,容器運行其init()方法進行Servlet的初始化;請求到達時調用Servlet的service方法,service方法會調用與請求對應的doGet或doPost等方法;當伺服器關閉,項目被卸載時伺服器會將Servlet執行個體銷毀,此時會調用Servlet的destroy方法。
Servlet介面定義了5個方法,其中前三個方法與Servlet生命週期相關:

  • 1.void init(ServletConfig config) throws ServletException
  • 2.void service(ServletRequest req, ServletResponse resp) throws - - ServletException, java.io.IOException
  • 3.void destory()
  • 4.java.lang.String getServletInfo()
  • 5.ServletConfig getServletConfig()
97、轉寄(forward)和重新導向(redirect)的區別?

答:forward是容器中控制權的轉向,是伺服器請求資源,伺服器直接存取目標地址的URL,把那個URL 的響應內容讀取過來,然後把這些內容再發給瀏覽器,瀏覽器根本不知道伺服器發送的內容是從哪兒來的,所以它的地址欄中還是原來的地址。redirect就是伺服器端根據邏輯,發送一個狀態代碼(302),告訴瀏覽器重新去請求那個地址,因此從瀏覽器的地址欄中可以看到跳轉後的連結地址。前者更加高效,在前者可以滿足需要時,盡量使用轉寄(通過RequestDispatcher對象的forward方法,RequestDispatcher對象可以通過ServletRequest對象的getRequestDispatcher方法獲得),並且,這樣也有助於隱藏實際的連結;在有些情況下,比如,需要跳轉到一個其它伺服器上的資源,則必須使用重新導向(通過HttpServletResponse對象調用其sendRedirect方法)。

98、JSP有哪些內建對象?作用分別是什嗎?

答:JSP有9個內建對象:
- 1.request:封裝用戶端的請求,其中包含來自GET或POST請求的參數;
- 2.response:封裝伺服器對用戶端的響應;
- 3.pageContext:通過該對象可以擷取其他對象;
- 4.session:封裝使用者會話的對象;
- 5.application:封裝伺服器運行環境的對象;
- 6.out:輸出伺服器響應的輸出資料流對象;
- 7.config:Web應用的設定物件;
- 8.page:JSP頁面本身(相當於Java程式中的this);
- 9.exception:封裝頁面拋出異常的對象。

【補充】如果用Servlet來產生網頁中的動態內容無疑是非常繁瑣的工作,另一方面,所有的文本和HTML標籤都是寫入程式碼,即使做出微小的修改,都需要進行重新編譯。JSP解決了Servlet的這些問題,它是Servlet很好的補充,可以專門用作呈現給使用者的視圖(View),而Servlet作為控制器(Controller)專門負責處理使用者請求並轉寄或重新導向到某個頁面。基於Java的Web開發很多都同時使用了Servlet和JSP。JSP頁面其實是一個Servlet,能夠運行Servlet的伺服器(Servlet容器)通常也是JSP容器,可以提供JSP頁面的運行環境,Tomcat就是一個Servlet/JSP容器。第一次請求一個JSP頁面時,Servlet/JSP容器首先將JSP頁面轉換成一個JSP頁面的實作類別,這是一個實現了JspPage介面或其子介面HttpJspPage的Java類。JspPage介面是Servlet的子介面,因此每個JSP頁面都是一個Servlet。轉換成功後,容器會編譯Servlet類,之後容器載入和執行個體化Java位元組碼,並執行它通常對Servlet所做的生命週期操作。對同一個JSP頁面的後續請求,容器會查看這個JSP頁面是否被修改過,如果修改過就會重新轉換並重新編譯並執行。如果沒有則執行記憶體中已經存在的Servlet執行個體。

99、get和post請求的區別?

答:

  • ①get請求用來從伺服器上獲得資源,而post是用來向伺服器提交資料;
  • ②get將表單中資料按照name=value的形式,添加到action 所指向的URL 後面,並且兩者使用“?”串連,而各個變數之間使用“&”串連;post是將表單中的資料放在HTML頭部(header),傳遞到action所指向URL;
  • ③get傳輸的資料要受到URL長度限制(1024位元組);而post可以傳輸大量的資料,上傳檔案只能使用post方式;
  • ④使用get時參數會顯示在地址欄上,如果這些資料不是敏感性資料,那麼可以使用get;對于敏感資料還是應用使用post;
  • ⑤get使用MIME類型application/x-www-form-urlencoded的URL 編碼(URL encoding,也叫百分比符號編碼)文本的格式傳遞參數,保證被傳送的參數由遵循規範的文本組成,例如一個空格的編碼是”%20”。
100、JSP 和Servlet 有有什麼關係?

答: Servlet是一個特殊的Java程式,它運行於伺服器的JVM中,能夠依靠伺服器的支援向瀏覽器提供顯示內容。JSP本質上是Servlet的一種簡易形式, JSP會被伺服器處理成一個類似於Servlet的Java程式,可以簡化頁面內容的產生。Servlet和JSP最主要的不同點在於,Servlet 的應用邏輯是在Java 檔案中,並且完全從展示層中的HTML分離開來。而JSP的情況是Java和HTML可以組合成一個副檔名為.jsp 的檔案(有人說,Servlet就是在Java中寫HTML,而JSP就是在HTML中寫Java代碼,當然,這個說法還是很片面的)。JSP側重於視圖,Servlet更側重於控制邏輯,在MVC架構模式中,JSP適合充當視圖(view)而Servlet適合充當控制器(controller)。

101、JSP中的四種範圍?

答:page、request、session和application,具體如下:

  • ①page 代表與一個頁面相關的對象和屬性。
  • ②request 代表與Web客戶機發出的一個請求相關的對象和屬性。一個請求可能跨越多個頁面,涉及多個Web 元件;需要在頁面顯示的臨時資料可以置於此範圍
  • ③session代表與某個使用者與伺服器建立的一次會話相關的對象和屬性。跟某個使用者相關的資料應該放在使用者自己的session中
  • ④application代表與整個Web應用程式相關的對象和屬性,它實質上是跨越整個Web應用程式,包括多個頁面、請求和會話的一個全域範圍。
102、實現會話跟蹤的技術有哪些?

答:由於HTTP協議本身是無狀態的,伺服器為了區分不同的使用者,就需要對使用者會話進行跟蹤,簡單的說就是為使用者進行登記,為使用者指派唯一的ID,下一次使用者在請求中包含此ID,伺服器據此判斷到底是哪一個使用者。

  • ①URL 重寫:在URL中添加使用者會話的資訊作為請求的參數,或者將唯一的會話ID添加到URL結尾以標識一個會話。
  • ②設定表單隱藏欄位:將和會話跟蹤相關的欄位添加到隱式表單域中,這些資訊不會在瀏覽器中顯示但是提交表單時會提交給伺服器。
    這兩種方式很難處理跨越多個頁面的資訊傳遞,因為如果每次都要修改URL或在頁面中添加隱式表單域來儲存使用者會話相關資訊,事情將變得非常麻煩。
  • ③cookie:cookie有兩種,一種是基於視窗的,瀏覽器視窗關閉後,cookie就沒有了;另一種是將資訊儲存在一個臨時檔案中,並設定存在的時間。當使用者通過瀏覽器和伺服器建立一次會話後,會話ID就會隨響應資訊返回儲存在基於視窗的cookie中,那就意味著只要瀏覽器沒有關閉,會話沒有逾時,下一次請求時這個會話ID又會提交給伺服器讓伺服器識別使用者身份。會話中可以為使用者儲存資訊。會話對象是在伺服器記憶體中的,而基於視窗的cookie是在用戶端記憶體中的。如果瀏覽器禁用了cookie,那麼就需要通過下面兩種方式進行會話跟蹤。當然,在使用cookie時要注意幾點:首先不要在cookie中存放敏感資訊;其次cookie儲存的資料量有限(4k),不能將過多的內容儲存cookie中;再者瀏覽器通常只允許一個網站最多存放20個cookie。當然,和使用者會話相關的其他資訊(除了會話ID)也可以存在cookie方便進行會話跟蹤。
  • ④HttpSession:在所有會話跟蹤技術中,HttpSession對象是最強大也是功能最多的。當一個使用者第一次訪問某個網站時會自動建立HttpSession,每個使用者可以訪問他自己的HttpSession。可以通過HttpServletRequest對象的getSession方法獲得HttpSession,通過HttpSession的setAttribute方法可以將一個值放在HttpSession中,通過調用HttpSession對象的getAttribute方法,同時傳入屬性名稱就可以擷取儲存在HttpSession中的對象。與上面三種方式不同的是,HttpSession放在伺服器的記憶體中,因此不要將過大的對象放在裡面,即使目前的Servlet容器可以在記憶體將滿時將HttpSession中的對象移到其他存放裝置中,但是這樣勢必影響效能。添加到HttpSession中的值可以是任意Java對象,這個對象最好實現了Serializable介面,這樣Servlet容器在必要的時候可以將其序列化到檔案中,否則在序列化時就會出現異常。
103、過濾器有哪些作用和用法?

答: Java Web開發中的過濾器(filter)是從Servlet 2.3規範開始增加的功能,並在Servlet 2.4規範中得到增強。對Web應用來說,過濾器是一個駐留在伺服器端的Web組件,它可以截取用戶端和伺服器之間的請求與響應資訊,並對這些資訊進行過濾。當Web容器接受到一個對資源的請求時,它將判斷是否有過濾器與這個資源相關聯。如果有,那麼容器將把請求交給過濾器進行處理。在過濾器中,你可以改變請求的內容,或者重新佈建要求的前序資訊,然後再將請求發送給目標資源。當目標資源對請求作出響應時候,容器同樣會將響應先轉寄給過濾器,再過濾器中,你可以對響應的內容進行轉換,然後再將響應發送到用戶端。
常見的過濾器用途主要包括:對使用者請求進行統一認證、對使用者的訪問請求進行記錄和審核、對使用者發送的資料進行過濾或替換、轉換圖象格式、對響應內容進行壓縮以減少傳輸量、對請求或響應進行加解密處理、觸發資源訪問事件、對XML的輸出應用XSLT等。
和過濾器相關的介面主要有:Filter、FilterConfig、FilterChain

104、監聽器有哪些作用和用法?

答:Java Web開發中的監聽器(listener)就是application、session、request三個對象建立、銷毀或者往其中添加修改刪除屬性時自動執行代碼的功能組件,如下所示:

  • ①ServletContextListener:對Servlet內容相關的建立和銷毀進行監聽。
  • ②ServletContextAttributeListener:監聽Servlet內容屬性的添加、刪除和替換。
  • ③HttpSessionListener:對Session的建立和銷毀進行監聽。
    補充:session的銷毀有兩種情況:1、session逾時(可以在web.xml中通過/標籤配置逾時時間);2、通過調用session對象的invalidate()方法使session失效。
  • ④HttpSessionAttributeListener:對Session對象中屬性的添加、刪除和替換進行監聽。
  • ⑤ServletRequestListener:對請求對象的初始化和銷毀進行監聽。
  • ⑥ServletRequestAttributeListener:對請求對象屬性的添加、刪除和替換進行監聽。
105、web.xml 的作用?

答:用於配置Web應用的相關資訊,如:監聽器(listener)、過濾器(filter)、 Servlet、相關參數、會話逾時時間、安全驗證方式、錯誤頁面等。例如:

106、你的項目中使用過哪些JSTL標籤?

答:項目中主要使用了JSTL的核心標籤庫,包括、、、、等,主要用於構造迴圈和分支結構以控制顯示邏輯。
【說明】雖然JSTL標籤庫提供了core、sql、fmt、xml等標籤庫,但是實際開發中建議只使用核心標籤庫(core),而且最好只使用分支和迴圈標籤並輔以運算式語言(EL),這樣才能真正做到資料顯示和商務邏輯的分離,這才是最佳實務。

107、使用標籤庫有什麼好處?如何自訂JSP標籤?

答:使用標籤庫的好處包括以下幾個方面:

  • 1.分離JSP頁面的內容和邏輯,簡化了Web開發;
  • 2.開發人員可以建立自訂標籤來封裝商務邏輯和顯示邏輯;
  • 3.標籤具有很好的可移植性、可維護性和可重用性;
  • 4.避免了對Scriptlet(小指令碼)的使用(很多公司的項目開發都不允許在JSP中書寫小指令碼)
    自訂JSP標籤包括以下幾個步驟:
  • 1.編寫一個Java類實現實現Tag/BodyTag/IterationTag介面(通常不直接實現- 這些介面而是繼承TagSupport/BodyTagSupport/SimpleTagSupport類,這是對適配器模式中預設適配模式的應用)
  • 2.重寫doStartTag()、doEndTag()等方法,定義標籤要完成的功能
  • 3.編寫副檔名為tld的標籤描述檔案對自訂標籤進行部署,tld檔案通常放在WEB-INF檔案夾或其子目錄
  • 4.在JSP頁面中使用taglib指令引用該標籤庫。
108、運算式語言(EL)的隱式對象及其作用?

答:pageContext、initParam(訪問上下文參數)、param(訪問請求參數)、paramValues、header(訪問要求標頭)、headerValues、cookie(訪問cookie)、applicationScope(訪問application範圍)、sessionScope(訪問session範圍)、requestScope(訪問request範圍)、pageScope(訪問page範圍)。用法如下所示:

${pageContext.request.method}${pageContext["request"]["method"]}${pageContext.request["method"]}${pageContext["request"].method}${initParam.defaultEncoding}${header["accept-language"]}${headerValues["accept-language"][0]}${cookie.jsessionid.value}${sessionScope.loginUser.username}

【補充】運算式語言的.和[]運算作用是一致的,唯一的差別在於如果訪問的屬性名稱不符合Java標識符命名規則,例如上面的accept-language就不是一個有效Java標識符,那麼這時候就只能用[]運算子而不能使用.擷取它的值。

109、運算式語言(EL)支援哪些運算子?

答:除了.和[]運算子,EL還提供了:

  • ?算術運算子:+、-、*、/或div、%或mod
  • ?關係運算子:==或eq、!=或ne、>或gt、>=或ge、<或lt、<=或le
  • ?邏輯運算子:&&或and、||或or、!或not
  • ?條件運算子:${statement? A : B}(跟Java的條件運算子類似)
  • ?empty運算子:檢查一個值是否為null或者空(數組長度為0或集合中沒有元素也返回true)
110、請對以下Java EE中的名詞進行解釋

答:

  • 1.容器:容器為Java EE應用程式組件提供了運行時支援。容器提供了一份從底層Java EE API到應用程式組件的聯合視圖。Java EE應用程式組件不能直接地與其它Java EE應用程式組件互動。它們通過容器的協議和方法來達成它們之間以及它們與平台服務之間的互動。在應用程式組件和Java EE服務之間插入一個容器,這允許該容器透明地為組件注入必須的服務,例如聲明式交易管理,安全檢查,資源集區和狀態管理。
  • 2.資來源配接器:資來源配接器是一個系統級的組件,它通常實現了對外部資源管理員的網路連接。資來源配接器能夠擴充Java EE平台的功能。這隻需要實現一個Java EE標準服務API(例如JDBC驅動程式),或者定義並實現一個能串連到外部應用程式系統的資來源配接器就可以達到。資來源配接器也可以提供完整的本地或本地資源的服務。資來源配接器介面通過Java EE服務供應商介面(Java EE SPI)來串連Java EE平台。使用Java EE SPI串連到Java EE平台的資來源配接器可以和所有的Java EE產品協同工作。
  • 3.JNDI(Java Naming & Directory Interface):Java命名目錄介面,主要提供的功能是:提供一個目錄系統,讓其它各地的應用程式在其上面留下自己的索引,從而滿足快速尋找和定位分布式應用程式的功能。
  • 4.JMS(Java Message Service):JavaMessage Service是用於訊息發送的標準API,它支援可靠的“點對點”訊息發送和“發布-訂閱”模型。Java EE規範要求JMS供應商同時實現“點對點”訊息發送和”發布/訂閱”型訊息發送。
  • 5.JTA(Java Transaction API):Java 事務編程介面。Java事務API由兩部分組成:①一個應用程式級的邊界劃分介面,容器和應用程式組件用它來劃分事務邊界;②一個介於交易管理員和資源管理員之間的Java EE SPI級介面。
  • 6.JPA(Java Persistence API):Java持久化API是用於持久化和對象/關係映射管理的標準API。通過使用一個Java領域模型來管理關聯性型資料庫,Java EE規範為應用程式開發人員提供了一種對象/關係映射功能。Java EE必須對Java持久化API提供支援。它也可以用在Java SE環境中。
  • 7.JAF(JavaBean Activation FrameWork):JAF API提供了一個架構來處理不同MIME類型的資料,它們源於不同的格式和位置。JavaMail API使用了JAF API。JAF API包含在Java SE中,因此它可以被Java EE應用程式使用。
  • 8.JAAS(Java Authentication and Authorization Service):使服務能夠基於使用者進行驗證和實施存取控制。它實現了一個Java版的標準的的Plugable Authentication Module (PAM)架構,並支援基於使用者的授權。Java Authorization Service Provider Contract for Containers (JACC) 定義了Java EE應用程式伺服器和授權服務提供者之間的協議,允許將自訂的授權服務提供者插入任何Java EE產品中。
  • 9.JMX(Java Management Extension):Java平台企業版管理規範中定義了一種API,通過一種特殊的管理型EJB來管理Java EE伺服器。JMX API也提供了一些管理上的支援。
111、你是如何理解控制反轉(IoC)和依賴注入(DI)的?

答:控制反轉 (Inversion of Control, IoC)是把傳統上由程式碼直接操控的對象的調用權交給容器,通過容器來實現對象組件的裝配和管理。所謂的“控制反轉”就是對組件對象控制權的轉移,從程式碼本身轉移到了外部容器,由容器來建立對象並管理對象之間的依賴關係。IoC體現了好萊塢原則:“Don’t call me, we will call you”。依賴注入(Dependency Injection,DI)的基本原則是:應用組件不應該負責尋找資源或者其他依賴的協作對象。設定物件的工作應該由容器負責,尋找資源的邏輯應該從應用組件的代碼中抽取出來,交給容器來完成。DI是對IoC更準確的描述,即組件之間的依賴關係由容器在運行期決定,形象的來說,即由容器動態將某種依賴關係注入到組件之中。
舉個例子:一個類A需要用到介面B中的方法,那麼就需要為類A和介面B建立關聯或依賴關係,最原始的方法是在類A中建立一個介面B的實作類別C的執行個體,但這種方法需要開發人員自我維護二者的依賴關係,也就是說當依賴關係發生變動的時候需要修改代碼並重新構建整個系統。如果通過一個容器來管理這些對象以及對象的依賴關係,則只需要在類A中定義好用於關聯結口B的方法(構造器或setter方法),將類A和介面B的實作類別C放入容器中,通過對容器的配置來實現二者的關聯。

112、請說出Spring 中依賴注入和AOP的實現機制。

答:

  • 實現依賴注入的方式包括:構造器注入、設值注入和介面(回調)注入。Spring中可以通過設值注入(setter方法注入)和構造器注入實現IoC,推薦使用的方式為設值注入。
  • 實現AOP的方式包括:編譯時間AOP(需要特殊的編譯器)、運行時AOP(代理模式)、載入時AOP(需要特殊的類載入器)。Spring中使用了運行時的AOP,主要通過代理的方式對原來的代碼進行增強實現。對於實現了介面的類,Spring通過Java的動態代理(請參考Proxy類和InvocationHandler介面)來進行增強;對於沒有實現介面的類,Spring使用第三方位元組碼產生工具CGLIB,通過繼承的方式對原有代碼進行增強。
113、你的項目選擇使用Spring架構的原因是什嗎?

答:

  • 1.Spring提供了企業級開發的一站式選擇,有大量的功能模組可供選擇,並且可以根據項目的需要自由取捨。Spring通過POJO簡化了JavaEE開發,低侵入式的編程提供了代碼的持續整合能力和易測試性。
  • 2.Spring架構的核心功能是依賴注入(DI)。DI使得代碼的單元測試更加方便、系統更好維護、代碼也更加靈活。DI代碼自身很容易測試,通過構建實現了應用所需的介面的“類比”對象就可以進行功能的黑箱測試。DI代碼也更容易複用,因為其“被依賴的”功能封裝在在定義良好的介面中,允許其他對象根據需要將其插入到所需的對象中,這些對象是在其他應用平台中進行配置的。DI使代碼更加靈活,由於其天生的松耦合性,它允許程式員僅需考慮自己所需的介面和其他模組暴露出來的介面來就可以決定對象之間如何關聯。
  • 3.Spring支援面向切面編程(AOP),允許通過分離應用商務邏輯和系統服務從而進行內聚性的開發。AOP通常用來支援日誌、審計、效能和記憶體監控等功能。
  • 4.Spring還提供了許多實現準系統的模板類,使得Java EE應用的開發更加容易。例如,JdbcTemplate類和JDBC、JpaTemplate類和JPA,JmsTemplate類和JMS都可以很好地結合起來使用。RestTemplate類非常簡潔,使用這個模板的代碼的可讀性和可維護性也都很好。
  • 5.Spring提供了聲明性交易處理,工作調度,身份認證,成熟的Web MVC架構以及和其他架構的整合,例如Hibernate、MyBatis、JasperReports、JSF、Struts、Tapestry、Seam和Quartz等等。
  • 6.Spring Bean對象可以通過Terracotta在不同的JVM之間共用。這就允許使用已有的Bean並在叢集中共用 ,將Spring應用上下文事件變為分布式事件,還可以通過Spring JMX匯出叢集Bean,使得Spring應用高可用、叢集化。
  • 7.Spring傾向於使用非受檢異常(運行時異常)和減少不當try、catch和finally代碼塊,例如JpaTemplate這樣的Spring模板類會負責關閉或釋放資料庫連接,這避免了潛在的外部資源流失問題並提高了代碼的可讀性。

【Java基礎面試題】【03】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.