技術問答集錦(六)

猿碼道發表於2018-01-23

1 說出Servlet的生命週期,並說出Servlet和CGI的區別

Servlet被伺服器例項化後,容器執行其init方法,請求到達時執行其service方法service方法自動派遣執行與請求對應的doXXX方法(doGet,doPost)等,當伺服器決定將例項銷燬的時候呼叫其destroy方法

與CGI的區別在於Servlet處於伺服器程式中,它通過多執行緒方式執行其service方法,一個例項可以服務於多個請求,並且其例項一般不會銷燬,而CGI對每個請求都產生新的程式,服務完成後就銷燬,所以效率上低於servlet。

2 forward 和redirect的區別

forward是伺服器內部請求資源,伺服器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器,瀏覽器根本不知道伺服器傳送的內容是從哪兒來的,所以它的位址列中還是原來的地址

redirect就是服務端根據邏輯,傳送一個狀態碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛才請求的所有引數重新請求,所以session,request引數都可以獲取。

3 JSP中動態INCLUDE與靜態INCLUDE的區別

動態INCLUDE用jsp:include動作實現 <jsp:include page="included.jsp" flush="true" />它總是會檢查所含檔案中的變化,適合用於包含動態頁面,並且可以帶引數。

靜態INCLUDE用include偽碼實現,不會檢查所含檔案的變化,適用於包含靜態頁面<%@ include file="included.htm" %>

4 JSP的內建物件及方法

request表示HttpServletRequest物件。它包含了有關瀏覽器請求的資訊,並且提供了幾個用於獲取cookie, header, 和session資料的有用的方法。

response表示HttpServletResponse物件,並提供了幾個用於設定送回瀏覽器的響應的方法(如cookies,頭資訊等)。

out物件是javax.jsp.JspWriter的一個例項,並提供了幾個方法使你能用於向瀏覽器回送輸出結果。

pageContext表示一個javax.servlet.jsp.PageContext物件。它是用於方便存取各種範圍的名字空間、servlet相關的物件的API,並且包裝了通用的servlet相關功能的方法。

session表示一個請求的javax.servlet.http.HttpSession物件。Session可以存貯使用者的狀態資訊。

applicaton 表示一個javax.servle.ServletContext物件。這有助於查詢有關servlet引擎和servlet環境的資訊。

config表示一個javax.servlet.ServletConfig物件。該物件用於存取servlet例項的初始化引數。

page表示從該頁面產生的一個servlet例項。

5 JSP的常用指令

<%@page language=”java” contenType=”text/html;charset=gb2312” session=”true” buffer=”64kb” 
autoFlush=”true” isThreadSafe=”true” info=”text” errorPage=”error.jsp” isErrorPage=”true” 
isELIgnored=”true” pageEncoding=”gb2312” import=”java.sql.*”%>
複製程式碼

isErrorPage(是否能使用Exception物件),isELIgnored(是否忽略表示式)

<%@include file=”filename”%>

<%@taglib prefix=”c”uri=”http://……”%>

6 什麼情況下呼叫doGet()和doPost()?

Jsp頁面中的form標籤裡的method屬性為get時呼叫doGet(),為post時呼叫doPost()。

7 如何現實servlet的單執行緒模式

<%@ page isThreadSafe=”false”%>

8 頁面間物件傳遞的方法

request,session,application,cookie等

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

JSP 是Servlet技術的擴充套件,本質上是Servlet的簡易方式,更強調應用的外表表達。JSP編譯後是"類servlet"。Servlet和JSP最主要的不同點在於,Servlet的應用邏輯是在Java檔案中,並且完全從表示層中的HTML裡分離開來。而JSP的情況是Java和HTML可以組合成一個副檔名為.jsp的檔案。JSP側重於檢視,Servlet主要用於控制邏輯

10 四種會話跟蹤技術

page是代表與一個頁面相關的物件和屬性。一個頁面由一個編譯好的 Java servlet 類(可以帶有任何的 include 指令,但是沒有 include 動作)表示。這既包括 servlet 又包括被編譯成 servlet 的 JSP 頁面。

request是代表與 Web 客戶機發出的一個請求相關的物件和屬性。一個請求可能跨越多個頁面,涉及多個 Web 元件(由於 forward 指令和 include 動作的關係)。

session是代表與用於某個 Web 客戶機的一個使用者體驗相關的物件和屬性。一個 Web 會話可以也經常會跨越多個客戶機請求。

application是代表與整個 Web 應用程式相關的物件和屬性。這實質上是跨越整個 Web 應用程式,包括多個頁面、請求和會話的一個全域性作用域。

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 J2EE是技術還是平臺還是框架?

J2EE本身是一個標準,一個為企業分散式應用的開發提供的標準平臺。J2EE也是一個框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技術。

J2EE是一套全然不同於傳統應用開發的技術架構,包含許多元件,主要可簡化且規範應用系統的開發與部署,進而提高可移植性、安全與再用價值,其核心是一組技術規範與指南,其中所包含的各類元件、服務架構及技術層次,均有共通的標準及規格,讓各種依循J2EE架構的不同平臺之間,存在良好的相容性,解決過去企業後端使用的資訊產品彼此之間無法相容,導致企業內部或外部難以互通的窘境。

13 Servlet執行時一般實現哪幾個方法?

public void init(ServletConfig config)

public ServletConfig getServletConfig()

public String getServletInfo()

public void service(ServletRequest request,ServletResponse response)

public void destroy()
複製程式碼

14 請對以下在J2EE中常用的名詞進行解釋(或簡單描述)

Web容器: 給處於其中的應用程式元件(JSP,SERVLET)提供一個環境,使JSP,SERVLET直接更容器中的環境變數介面互動,不必關注其它系統問題。主 要有WEB伺服器來實現。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。該容器提供的介面嚴格遵守J2EE規範中的WEB APPLICATION 標準。我們把遵守以上標準的WEB伺服器就叫做J2EE中的WEB容器。

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/IOP: (Remote Method Invocation /internet物件請求中介協議)他們主要用於通過遠端呼叫服務。例如,遠端有一臺計算機上執行一個程式,它提供股票分析服務,我們可以在本地計算機 上實現對其直接呼叫。當然這是要通過一定的規範才能在異構的系統之間進行通訊。RMI是JAVA特有的。

15 MVC的各個部分都有那些技術來實現?如何實現?

MVC 是Model-View-Controller的簡寫。"Model" 代表的是應用的業務邏輯(通過JavaBean,EJB元件實現), "View" 是應用的表示面(由JSP頁面產生),"Controller" 是提供應用的處理過程控制(一般是一個Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的元件實現。這些元件可以進行互動和重 用。

16 jsp有哪些動作?作用分別是什麼?

JSP 共有以下6種基本動作:

  1. jsp:include:在頁面被請求的時候引入一個檔案。
  2. jsp:useBean:尋找或者例項化一個JavaBean。
  3. jsp:setProperty:設定JavaBean的屬性。
  4. jsp:getProperty:輸出某個JavaBean的屬性。
  5. jsp:forward:把請求轉到一個新的頁面。
  6. jsp:plugin:根據瀏覽器型別為Java外掛生成OBJECT或EMBED標記。

17 Cookie與Session的區別與聯絡

Cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在伺服器端保持狀態的方案

Cookie機制:正統的Cookie分發是通過 擴充套件HTTP協議來實現的,伺服器通過 在HTTP的響應頭中加上一行特殊的指示 以提示瀏覽器按照指示生成相應的Cookie。然而純粹的客戶端指令碼如JavaScript或者VBScript也可以生成Cookie。而Cookie的使用是由瀏覽器按照一定的原則在後臺自動傳送給伺服器的。瀏覽器檢查所有儲存的Cookie,如果某個Cookie所宣告的作用範圍大於等於將要請求的資源所在的位置,則把該Cookie附在請求資源的HTTP請求頭上傳送給伺服器。

Cookie的內容主要包括:名字,值,過期時間,路徑和域。路徑與域一起構成Cookie的作用範圍。若不設定過期時間,則表示這個Cookie的生命期為瀏覽器會話期間,關閉瀏覽器視窗,Cookie就消失。這種生命期為瀏覽器會話期的Cookie被稱為會話Cookie。

會話Cookie一般不儲存在硬碟上而是儲存在記憶體裡,當然這種行為並不是規範規定的。若設定了過期時間,瀏覽器就會把Cookie儲存到硬碟上,關閉後再次開啟瀏覽器,這些Cookie 仍然有效直到超過設定的過期時間。儲存在硬碟上的Cookie 可以在不同的瀏覽器程式間共享,比如兩個IE視窗。而對於儲存在記憶體裡的Cookie ,不同的瀏覽器有不同的處理方式 。

Session機制:session機制是一種伺服器端的機制,伺服器使用一種類似於雜湊表的結構(也可能就是使用雜湊表)來儲存資訊。

當程式需要為某個客戶端的請求建立一個session時,伺服器首先檢查這個客戶端的請求裡是否已包含了一個session標識(稱為session id),如果已包含則說明以前已經為此客戶端建立過session,伺服器就按照session id把這個session檢索出來使用(檢索不到,會新建一個),如果客戶端請求不包含session id,則為此客戶端建立一個session並且生成一個與此session相關聯的session id,session id的值應該是一個既不會重複,又不容易被找到規律以仿造的字串,這個session id將被在本次響應中返回給客戶端儲存。儲存這個session id的方式可以採用Cookie,這樣在互動過程中瀏覽器可以自動的按照規則把這個標識傳送給伺服器。一般這個cookie的名字都是類似於SEEESIONID。但Cookie 可以被人為的禁止,則必須有其他機制以便在cookie被禁止時仍然能夠把session id傳遞迴伺服器。

經常被使用的一種技術叫做 URL重寫,就是把session id直接附加在URL路徑的後面。

還有一種技術叫做 表單隱藏欄位。就是伺服器會自動修改表單,新增一個隱藏欄位,以便在表單提交時能夠把session id傳遞迴伺服器。比如:

<form name="testform" action="/xxx">
    <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
    <input type="text">
</form>
複製程式碼

實際上這種技術可以簡單的用對action應用URL重寫來代替。

Cookie 和Session 的區別:

  1. cookie資料存放在客戶的瀏覽器上,session資料放在伺服器上。
  2. cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙,考慮到安全應當使用session。
  3. session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能,考慮到減輕伺服器效能方面,應當使用 COOKIE。
  4. 單個cookie在客戶端的限制是3K,就是說一個站點在客戶端存放的COOKIE不能3K。

18 JSP的內建物件與作用

JSP共有以下9種基本內建元件(可與ASP的6種內部元件相對應):

  1. request使用者端請求,此請求會包含來自GET/POST請求的引數
  2. response 網頁傳回使用者端的回應
  3. pageContext 網頁的屬性是在這裡管理
  4. session 與請求有關的會話期
  5. application servlet 正在執行的內容
  6. out 用來傳送回應的輸出
  7. config servlet的構架部件
  8. page JSP網頁本身
  9. exception 針對錯誤網頁,未捕捉的例外

19 jsp的兩種跳轉方式分別是什麼,有什麼區別?

  1. 帶request引數的跳轉

    request.setAttribute("param", "value");
    request.getRequestDispatcher("test.jsp").forward(request, response);
    複製程式碼

    在目的頁面可以獲取引數:

    String Value = request.getAttribute("param")==null?:(String)request.getAttribute("param");
    複製程式碼
  2. 不帶request引數的跳轉

    response.sendredirect("test.jsp");
    複製程式碼

20 forward和redirect的區別

forward 是伺服器內部重定向,程式收到請求後重新定向到另一個程式,客戶機並不知道;

redirect則是伺服器收到請求後傳送一個狀態頭給客戶,客戶將再請求一 次,這裡多了兩次網路通訊的來往。當然forward也有缺點,就是forward的頁面的路徑如果是相對路徑就會有些問題了。

forward 會將 request state , bean 等等資訊帶往下一個 jsp。 redirect 是送到 client 端後再一次 request , 所以資料不被保留。

使用 forward 你就可以用 getAttribute() 來取的前一個 jsp 所放入的 bean 等資料

  1. 從位址列顯示來說

forward是伺服器請求資源,伺服器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器.瀏覽器根本不知道伺服器傳送的內容從哪裡來的,所以它的位址列還是原來的地址.

redirect是服務端根據邏輯,傳送一個狀態碼,告訴瀏覽器重新去請求那個地址.所以位址列顯示的是新的URL.所以redirect等於客戶端向伺服器端發出兩次request,同時也接受兩次response。

  1. 從資料共享來說

forward:轉發頁面和轉發到的頁面可以共享request裡面的資料. redirect:不能共享資料.redirect不僅可以重定向到當前應用程式的其他資源,還可以重定向到同一個站點上的其他應用程式中的資源,甚至是使用絕對URL重定向到其他站點的資源. forward,方法只能在同一個Web應用程式內的資源之間轉發請求. forward 是伺服器內部的一種操作. redirect 是伺服器通知客戶端,讓客戶端重新發起請求. 所以,你可以說 redirect 是一種間接的請求, 但是你不能說"一個請求是屬於forward還是redirect "。

  1. 從運用地方來說

forward:一般用於使用者登陸的時候,根據角色轉發到相應的模組. redirect:一般用於使用者登出登陸時返回主頁面和跳轉到其它的網站等.

  1. 從效率來說

forward:高. redirect:低.

21 描述JSP和Servlet的區別、共同點、各自應用的範圍

JSP在本質上就是SERVLET,但是兩者的建立方式不一樣.Servlet完全是JAVA程式程式碼構成擅長於流程控制和事務處理而通過Servlet來生成動態網頁;JSP由HTML程式碼和JSP標籤構成,可以方便地編寫動態網頁,因此在實際應用中採用Servlet來控制業務流程,而採用JSP來生成動態網頁.在struts框架中,JSP位於MVC設計模式的檢視層,而Servlet位於控制層.

22 列出Jsp中包含外部檔案的2種方式,兩者有何區別。

<jsp:include page="b.jsp" />

<%@ include file="b.jsp" />

區別:

  1. <jsp:include page="b.jsp" />(先執行,後包含)

    此標籤表示法:能動態區別加進來的是動態頁面還是靜態頁面對於靜態頁面則直接將資源包含(僅取其文字)。

    <%@ include file="b.jsp">此指令表示:靜態地包含頁面,不管其內容如何,不過是靜態頁面還是動態頁面都首先將頁面的內容先加進來

  2. <jsp:include page="b.jsp" />可以傳遞引數,如下:

    <jsp:include page="b.jsp" >
        <jsp:param name="引數名" value="引數值"/>
    </jsp:include>
    複製程式碼

23 Jsp和Servlet中的請求轉發分別如何實現

servlet的轉發方式有兩種:

response.sendRedirect(response.encodeURL(相對路徑或絕對路徑)); request.getRequestDispatcher(相對路徑).forward();

jsp是servlet的擴充套件,除可用上面兩種之外,還可以用標籤:

<jsp:forward page="相對路徑" />
複製程式碼

相關文章