天天看點

【轉】Java學習---Java Web基礎面試題整理

 ​

1、什麼是Servlet?

可以從兩個方面去看Servlet:

a、API:有一個接口servlet,它是servlet規範中定義的用來處理用戶端請求的程式需要實作的頂級接口。

b、元件:伺服器端用來處理用戶端請求的元件,需要在web.xml檔案中進行配置。

2、Servlet的生命周期,并說出Servlet和CGI的差別?

servlet有良好的生存期的定義,包括加載和執行個體化、初始化、處理請求以及服務結束。

這個生存期由javax.servlet.servlet接口中的init、service、destroy方法表達。

web容器加載servlet,生命周期開始。通過調用servlet的init()方法進行servlet的初始化。通過調用service()方法實作根據請求的不同調用不同的do**()方法。結束服務,web容器調用servlet的destroy()方法。

【轉】Java學習---Java Web基礎面試題整理

差別:

Servlet處于伺服器程序中,它通過多線程運作service()方法,一個執行個體可以服務于多個請求,并且執行個體一般不會被銷毀;而CGI對每個請求都産生一個新的程序,服務完成後就銷毀,所有效率低于Servlet

3、Servlet接口中有哪些方法?

Servlet接口定義了5個方法:

void init(ServletConfig config) throws ServletException

void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException

void destory()

java.lang.String getServletInfo()

ServletConfig getServletConfig()

4、get和post請求的差別?

a、get是用來從伺服器上擷取資料,而post是用來向伺服器傳遞資料;

b、get将表單中資料按照variable=value的形式,添加到action所指向的URL後面,并且兩者用"?"連接配接,變量之間用"&"連接配接;而post是将表單中的資料放在form的資料體中,按照變量與值對應的方式,傳遞到action所指定的URL。

c、get是不安全的,因為在傳輸過程中,資料是被放在請求的URL中;而post的所有操作對使用者來說都是不可見的。

d、get傳輸的資料量小,這主要應為受url長度限制;而post可以傳輸大量的資料,所有上傳檔案隻能用post送出。

e、get限制form表單的資料集必須為ASCII字元;而post支援整個IS01 0646字元集。

f、get是form表單的預設方法。

5、什麼情況下調用doGet()和doPost()?

預設情況是調用doGet()方法,JSP頁面中的Form表單的method屬性設定為post的時候,調用的為doPost()方法;為get的時候,調用deGet()方法。

6、轉發(Forward)和重定向(Redirect)的差別?

轉發是伺服器行為,重定向是用戶端行為。

轉發(Forword)

通過RequestDispatcher對象的forward(HttpServletRequest request,HttpServletResponse response)方法實作的。RequestDispatcher可以通過HttpServletRequest 的getRequestDispatcher()方法獲得。例如下面的代碼就是跳轉到login_success.jsp頁面。

request.getRequestDispatcher("login_success.jsp").forward(request, response);

重定向(Redirect) 是利用伺服器傳回的狀态嗎來實作的。用戶端浏覽器請求伺服器的時候,伺服器會傳回一個狀态碼。伺服器通過HttpServletRequestResponse的setStatus(int status)方法設定狀态碼。如果伺服器傳回301或者302,則浏覽器會到新的網址重新請求該資源。

1. 從位址欄顯示來說

forward是伺服器請求資源,伺服器直接通路目标位址的URL,把那個URL的響應内容讀取過來,然後把這些内容再發給浏覽器。浏覽器根本不知道伺服器發送的内容從哪裡來的,是以它的位址欄還是原來的位址。

redirect是服務端根據邏輯,發送一個狀态碼,告訴浏覽器重新去請求那個位址,是以位址欄顯示的是新的URL。

2. 從資料共享來說

forward:轉發頁面和轉發到的頁面可以共享request裡面的資料.

redirect:不能共享資料.

3. 從運用地方來說

forward:一般用于使用者登陸的時候,根據角色轉發到相應的子產品.

redirect:一般用于使用者登出登陸時傳回首頁面和跳轉到其它的網站等

4. 從效率來說

forward:高.

redirect:低.

7、自動重新整理(Refresh)

自動重新整理不僅可以實作一段時間之後自動跳轉到另一個頁面,還可以實作一段時間之後自動重新整理本頁面。Servlet中通過HttpServletResponse對象設定Header屬性實作自動重新整理例如:

Response.setHeader("Refresh","1000;URL=http://localhost:8080/servlet/example.htm");

其中1000為時間,機關為毫秒。URL指定就是要跳轉的頁面(如果設定自己的路徑,就會實作沒過一秒自動重新整理本頁面一次)

8、Servlet與線程安全

Servlet不是線程安全的,多線程并發的讀寫會導緻資料不同步的問題。 解決的辦法是盡量不要定義name屬性,而是要把name變量分别定義在doGet()和doPost()方法内。雖然使用synchronized(name){}語句塊可以解決問題,但是會造成線程的等待,不是很科學的辦法。

注意:多線程的并發的讀寫Servlet類屬性會導緻資料不同步。但是如果隻是并發地讀取屬性而不寫入,則不存在資料不同步的問題。是以Servlet裡的隻讀屬性最好定義為final類型的。

9、JSP和Servlet有哪些相同點和不同點,他們之間的聯系是什麼?

JSP是Servlet的擴充,本質上是Servlet的簡易方式,更強調應用的外表表達。JSP編譯後是"類Servlet"。Servlet和JSP最主要的不同點在于,Servlet的應用邏輯是在java檔案中,并且完全從表示層中的HTML裡分離開來。而JSP的情況是java和HTML可以組合成一個擴充名為.jsp的檔案。JSP偏重于視圖,Servlet偏重于業務邏輯。

10、JSP工作原理:

JSP是一種Servlet,但是與HttpServlet的工作方式不太一樣。HttpServlet是先由源代碼編譯為class檔案後部署到伺服器下,為先編譯後部署。而JSP則是先部署後編譯。JSP會在用戶端第一次請求JSP檔案時被編譯為HttpJspPage類(接口Servlet的一個子類)。該類會被伺服器臨時存放在伺服器工作目錄裡面。下面通過執行個體給大家介紹。

工程JspLoginDemo下有一個名為login.jsp的Jsp檔案,把工程第一次部署到伺服器上後通路這個Jsp檔案,我們發現這個目錄下多了下圖這兩個東東。

.class檔案便是JSP對應的Servlet。編譯完畢後再運作class檔案來響應用戶端請求。以後用戶端通路login.jsp的時候,Tomcat将不再重新編譯JSP檔案,而是直接調用class檔案來響應用戶端請求。

【轉】Java學習---Java Web基礎面試題整理

由于JSP隻會在用戶端第一次請求的時候被編譯 ,是以第一次請求JSP時會感覺比較慢,之後就會感覺快很多。如果把伺服器儲存的class檔案删除,伺服器也會重新編譯JSP。

開發Web程式時經常需要修改JSP。Tomcat能夠自動檢測到JSP程式的改動。如果檢測到JSP源代碼發生了改動。Tomcat會在下次用戶端請求JSP時重新編譯JSP,而不需要重新開機Tomcat。這種自動檢測功能是預設開啟的,檢測改動會消耗少量的時間,在部署Web應用的時候可以在web.xml中将它關掉。

11、Request對象的主要方法有哪些?

setAttribute(String name,Object):設定名字為name的request 的參數值

getAttribute(String name):傳回由name指定的屬性值

getAttributeNames():傳回request 對象所有屬性的名字集合,結果是一個枚舉的執行個體

getCookies():傳回用戶端的所有 Cookie 對象,結果是一個Cookie 數組

getCharacterEncoding() :傳回請求中的字元編碼方式 = getContentLength() :傳回請求的 Body的長度

getHeader(String name) :獲得HTTP協定定義的檔案頭資訊

getHeaders(String name) :傳回指定名字的request Header 的所有值,結果是一個枚舉的執行個體

getHeaderNames() :傳回是以request Header 的名字,結果是一個枚舉的執行個體

getInputStream() :傳回請求的輸入流,用于獲得請求中的資料

getMethod() :獲得用戶端向伺服器端傳送資料的方法

getParameter(String name) :獲得用戶端傳送給伺服器端的有 name指定的參數值

getParameterNames() :獲得用戶端傳送給伺服器端的所有參數的名字,結果是一個枚舉的執行個體

getParameterValues(String name):獲得有name指定的參數的所有值

getProtocol():擷取用戶端向伺服器端傳送資料所依據的協定名稱

getQueryString() :獲得查詢字元串

getRequestURI() :擷取送出請求字元串的用戶端位址

getRemoteAddr():擷取用戶端的 IP 位址

getRemoteHost() :擷取用戶端的名字

getSession([Boolean create]) :傳回和請求相關 Session

getServerName() :擷取伺服器的名字

getServletPath():擷取用戶端所請求的腳本檔案的路徑

getServerPort():擷取伺服器的端口号

removeAttribute(String name):删除請求中的一個屬性

12、request.getAttribute()和 request.getParameter()有何差別?

a、request.getParameter()擷取的類型是String;request.getAttribute()擷取的類型是Object。

b、request.getPrameter()擷取的是POST/GET傳遞的參數值和URL中的參數;request.getAttribute()擷取的是對象容器中的資料值/對象。

c、request.setAttribute()和request.getAttribute()可以發送、接收對象;request.getParamter()隻能接收字元串,官方不開放request.setParamter()(也就是沒有這個方法)。

setAttribute()和getAttribute()的傳參原理:

setAttribute()是應用伺服器把這個對象放在該頁面所對應的一塊記憶體中去,當你的頁面伺服器重定向到另外一個頁面時,應用伺服器會把這塊記憶體拷貝到另一個頁面所對應的那塊記憶體中。這個就可以通過getAttribute()擷取到相應的參數值或者對象。

13、JSP中動态include和靜态include的差別?

a、靜态include:文法:<%@ include file="檔案名" %>,相當于複制,編輯時将對應的檔案包含進來,當内容變化時,不會再一次對其編譯,不易維護。

b、動态include:文法:<jsp:include page="檔案名">,能夠自動檢查被包含檔案,當用戶端對JSP檔案進行請求時,會重新将對應的檔案包含進來,進行實時的更新。

14、JSP有哪些内置對象?作用分别是什麼?

JSP一共有9個内置對象:

request:負責得到用戶端請求的資訊,對應類型:javax.servlet.http.HttpServletRequest

response:負責向用戶端發出響應,對應類型:javax.servlet.http.HttpServletResponse

session:負責儲存同一用戶端一次會話過程中的一些資訊,對應類型:javax.servlet.http.httpsession

out:負責管理對用戶端的輸出,對應類型:javax.serlvet.jsp.jspwriter

application:表示整個應用環境的資訊,對應類型:javax.servlet.servletcontext

config:表示ServletConfig,對應類型:javax.servlet.servletconfig

exception:表示頁面中發生的異常,可以通過它獲得頁面異常資訊,對應類型:java.lang.exception

pagecontext:表示這個JSP頁面上下文,對應類型:javax.servlet.jsp.pagecontext

page:表示目前JSP頁面本身。

15、JSP有哪些動作?作用分别是什麼?

JSP一共有以下6中基本動作:

JSP:include (當頁面被請求的時候引入一個檔案)

JSP:forward (将請求轉到另一個頁面)

JSP:useBean (獲得JavaBean的一個執行個體)

JSP:setProperty (設定JavaBean的屬性)

JSP:getProperty (獲得JavaBean的屬性)

JSP:plugin (根據浏覽器類型為Java插件生成object或者embed兩種标記)

16、JSP常用指令有哪些?

page、include、taglib

a、page指令:定義頁面的一些屬性。

常用屬性:

contentType="text/html;charset=utf-8"; 向浏覽器端輸出資料的編碼

pageEncoding="utf-8"; JSP編譯成java檔案時所用的編碼

session="true" 是否自動建立session

b、include指令:引入一個靜态的JSP頁面

c、taglib指令:引入一個标簽庫

17、講解JSP中的四種作用域

JSP中的四種作用域包括page、request、session和application,具體來說:

a、page是代表一個頁面相關的對象和屬性。一個頁面由一個編譯好的java servlet類(可以帶有include指令,但不可以帶有include動作)表示。這既包括servlet又包括編譯成servlet的jsp頁面。

b、request是代表與web客戶機發出的一個請求相關的對象和屬性。一個請求可能跨越多個頁面,涉及多個web元件(由于forware指令和include動作的關系)

c、session是代表與用于某個web客戶機的一個使用者體驗相關的對象和屬性。一個web回話也可以經常跨域多個客戶機請求。

d、application是代表與整個web應用程式相關的對象和屬性。這實質上是跨域整個web應用程式,包括多個頁面、請求和回話的一個全局作用域。

18、如何實作JSP或Servlet的單線程模式?

在JSP中使用page指令進行設定,具體代碼如下:

<%@page isThreadSafe="false"%>

對于Servlet,可以讓自定義的Servlet實作SingleThreadModel辨別接口。

說明:如果将JSP或Servlet設定成單線程工作模式,會導緻每個請求建立一個Servlet執行個體,這種實踐将導緻嚴重的性能問題(伺服器的記憶體壓力很大,還會導緻頻繁的垃圾回收),是以通常情況下并不會這麼做。

19、JSP亂碼如何解決?

a、JSP頁面亂碼:<%@page contentType="text/html;charset=utf-8" %>

b、表單送出時出現亂碼:request.setCharacterEncoding("utf-8");

c、資料庫出現亂碼:jdbc:mysql://localhost:3306:/user?useSSL=false&useUnicode=true&characterEncoding=utf-8;

其實我一般的處理的方法就是配置一個過濾器對每個JSP頁面進行字元集處理。

20、實作會話跟蹤的技術有哪些?

1. 使用Cookie

向用戶端發送Cookie

Cookie c =new Cookie("name","value"); //建立Cookie

c.setMaxAge(60*60*24); //設定最大時效,此處設定的最大時效為一天

response.addCookie(c); //把Cookie放入到HTTP響應中

從用戶端讀取Cookie

String name ="name";

Cookie[]cookies =request.getCookies();

if(cookies !=null){

for(int i= 0;i<cookies.length;i++){

Cookie cookie =cookies[i];

if(name.equals(cookis.getName()))

//something is here.

//you can get the value

cookie.getValue();

}

優點: 資料可以持久儲存,不需要伺服器資源,簡單,基于文本的Key-Value

缺點: 大小受到限制,使用者可以禁用Cookie功能,由于儲存在本地,有一定的安全風險。

2. URL 重寫

在URL中添加使用者會話的資訊作為請求的參數,或者将唯一的會話ID添加到URL結尾以辨別一個會話。

優點: 在Cookie被禁用的時候依然可以使用

缺點: 必須對網站的URL進行編碼,所有頁面必須動态生成,不能用預先記錄下來的URL進行通路。

3. 隐藏的表單域

<input type="hidden" name ="session" value="..."/>

優點: Cookie被禁時可以使用

缺點: 所有頁面必須是表單送出之後的結果。

4. HttpSession

在所有會話跟蹤技術中,HttpSession對象是最強大也是功能最多的。當一個使用者第一次通路某個網站時會自動建立 HttpSession,每個使用者可以通路他自己的HttpSession。可以通過HttpServletRequest對象的getSession方 法獲得HttpSession,通過HttpSession的setAttribute方法可以将一個值放在HttpSession中,通過調用 HttpSession對象的getAttribute方法,同時傳入屬性名就可以擷取儲存在HttpSession中的對象。與上面三種方式不同的 是,HttpSession放在伺服器的記憶體中,是以不要将過大的對象放在裡面,即使目前的Servlet容器可以在記憶體将滿時将HttpSession 中的對象移到其他儲存設備中,但是這樣勢必影響性能。添加到HttpSession中的值可以是任意Java對象,這個對象最好實作了 Serializable接口,這樣Servlet容器在必要的時候可以将其序列化到檔案中,否則在序列化時就會出現異常。

21、Cookie和Session的的差別?

由于HTTP協定是無狀态的協定,是以服務端需要記錄使用者的狀态時,就需要用某種機制來識具體的使用者,這個機制就是Session.典型的場景比如購物車,當你點選下單按鈕時,由于HTTP協定無狀态,是以并不知道是哪個使用者操作的,是以服務端要為特定的使用者建立了特定的Session,用用于辨別這個使用者,并且跟蹤使用者,這樣才知道購物車裡面有幾本書。這個Session是儲存在服務端的,有一個唯一辨別。在服務端儲存Session的方法很多,記憶體、資料庫、檔案都有。叢集的時候也要考慮Session的轉移,在大型的網站,一般會有專門的Session伺服器叢集,用來儲存使用者會話,這個時候 Session 資訊都是放在記憶體的,使用一些緩存服務比如Memcached之類的來放 Session。

思考一下服務端如何識别特定的客戶?這個時候Cookie就登場了。每次HTTP請求的時候,用戶端都會發送相應的Cookie資訊到服務端。實際上大多數的應用都是用 Cookie 來實作Session跟蹤的,第一次建立Session的時候,服務端會在HTTP協定中告訴用戶端,需要在 Cookie 裡面記錄一個Session ID,以後每次請求把這個會話ID發送到伺服器,我就知道你是誰了。有人問,如果用戶端的浏覽器禁用了 Cookie 怎麼辦?一般這種情況下,會使用一種叫做URL重寫的技術來進行會話跟蹤,即每次HTTP互動,URL後面都會被附加上一個諸如 sid=xxxxx 這樣的參數,服務端據此來識别使用者。

Cookie其實還可以用在一些友善使用者的場景下,設想你某次登陸過一個網站,下次登入的時候不想再次輸入賬号了,怎麼辦?這個資訊可以寫到Cookie裡面,通路網站的時候,網站頁面的腳本可以讀取這個資訊,就自動幫你把使用者名給填了,能夠友善一下使用者。這也是Cookie名稱的由來,給使用者的一點甜頭。是以,總結一下:Session是在服務端儲存的一個資料結構,用來跟蹤使用者的狀态,這個資料可以儲存在叢集、資料庫、檔案中;Cookie是用戶端儲存使用者資訊的一種機制,用來記錄使用者的一些資訊,也是實作Session的一種方式。

22、什麼是Tomcat?

Tomcat是一種web伺服器,java編寫的web項目可以部署在上面,使用者在用戶端請求時,都是将請求發到Tomcat上,Tomcat在将請求發到對應的項目上。

23、 較長的描述MVC

基于java的web應用系統采用MVC設計模型,即用Model(模型)、View(視圖)和Controller(控制)分離設計,這是目前web應用服務系統的主流設定方向。

Model:處理業務邏輯的子產品。

View:負責頁面顯示,顯示Model的處理結果給使用者,主要實作資料到頁面的轉換過程。

Controller:負責每個請求的分發,把Form資料傳遞給Model進行處理,處理完成後,把處理結果傳回給相應的View顯示給使用者。

作者:小a玖拾柒