JSP和Servlet


1.講下servlet的執行流程。

Servlet的執行流程也就是servlet的生命周期,Servlet 生命周期可被定義為從創建直到毀滅的整個過程。以下是 Servlet 遵循的過程:
  • Servlet 通過調用 init () 方法進行初始化。
  • Servlet 調用 service() 方法來處理客戶端的請求。
  • Servlet 通過調用 destroy() 方法終止(結束)。
  • 最后,Servlet 是由 JVM 的垃圾回收器進行垃圾回收的。

現在讓我們詳細討論生命周期的方法。

init() 方法

init 方法被設計成只調用一次。它在第一次創建 Servlet 時被調用,在后續每次用戶請求時不再調用。因此,它是用於一次性初始化,就像 Applet 的 init 方法一樣。

Servlet 創建於用戶第一次調用對應於該 Servlet 的 URL 時,但是您也可以指定 Servlet 在服務器第一次啟動時被加載。

當用戶調用一個 Servlet 時,就會創建一個 Servlet 實例,每一個用戶請求都會產生一個新的線程,適當的時候移交給 doGet 或 doPost 方法。init() 方法簡單地創建或加載一些數據,這些數據將被用於 Servlet 的整個生命周期。

init 方法的定義如下:

public void init() throws ServletException { // 初始化代碼... }

service() 方法

service() 方法是執行實際任務的主要方法。Servlet 容器(即 Web 服務器)調用 service() 方法來處理來自客戶端(瀏覽器)的請求,並把格式化的響應寫回給客戶端。

每次服務器接收到一個 Servlet 請求時,服務器會產生一個新的線程並調用服務。service() 方法檢查 HTTP 請求類型(GET、POST、PUT、DELETE 等),並在適當的時候調用 doGet、doPost、doPut,doDelete 等方法。

下面是該方法的特征:

public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException{ }

service() 方法由容器調用,service 方法在適當的時候調用 doGet、doPost、doPut、doDelete 等方法。所以,您不用對 service() 方法做任何動作,您只需要根據來自客戶端的請求類型來重寫 doGet() 或 doPost() 即可。

doGet() 和 doPost() 方法是每次服務請求中最常用的方法。下面是這兩種方法的特征。

doGet() 方法

GET 請求來自於一個 URL 的正常請求,或者來自於一個未指定 METHOD 的 HTML 表單,它由 doGet() 方法處理。

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Servlet 代碼 }

doPost() 方法

POST 請求來自於一個特別指定了 METHOD 為 POST 的 HTML 表單,它由 doPost() 方法處理。

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Servlet 代碼 }

destroy() 方法

destroy() 方法只會被調用一次,在 Servlet 生命周期結束時被調用。destroy() 方法可以讓您的 Servlet 關閉數據庫連接、停止后台線程、把 Cookie 列表或點擊計數器寫入到磁盤,並執行其他類似的清理活動。

在調用 destroy() 方法之后,servlet 對象被標記為垃圾回收。destroy 方法定義如下所示:

  public void destroy() { // 終止化代碼... }

架構圖

下圖顯示了一個典型的 Servlet 生命周期方案。

  • 第一個到達服務器的 HTTP 請求被委派到 Servlet 容器。
  • Servlet 容器在調用 service() 方法之前加載 Servlet。
  • 然后 Servlet 容器處理由多個線程產生的多個請求,每個線程執行一個單一的 Servlet 實例的 service() 方法。
Servlet 生命周期

2.Get和Post的區別

在頁面提交數據時,get的數據大小有限制4k,post沒有限制,get請求提交的數據會在地址欄顯示,post不顯示,所以post比get安全.

3.有三台服務器,如果在一台服務器上登陸了這個用戶,其他兩台就不能再登陸這個用戶,使用session共享,你是怎么做的。

把所有的session的數據保存到Mysql服務器上,所有Web服務器都來這台Mysql服務器來獲取Session數據。

4.寫一個自定義標簽要繼承什么類

  1. SimpleTagSupport,一般調用doTag方法
  2. 或者實現SimpleTag接口

5.Jsp如何處理json

在 jsp 中處理 JSON,通常需要配套使用 JQuery 控件,並且導入一些 Common jar 包。使用 JQuery 控件是因為它能有效的解析並且展示 JSON 數據,導入Common 則是因為 Java 中的對象並不是純粹的數據,需要通過這些 Jar 包的處理使之轉化成真實數據。

6.如何處理Servlet的線程不安全問題

1.最簡單的就是不使用字段變量;
2.使用final修飾變量;
3.線程安全就是多線程操作同一個對象不會有問題,線程同步一般來保護線程安全,
所以可以在Servlet的線程里面加上同步方法或同步塊。(Synchronized)可以保證在同一時間只有一個線程訪問,(使用同步塊會導致性能變差,最好不去使用實例變量)

7.Jsp的重定向和轉發的流程有什么區別

  1.  重定向是客戶端行為,轉發是服務器端行為
  2.  重定向時服務器產生兩次請求,轉發產生一次請求,重定向時可以轉發到項目以外的任何網址,轉發只能在當前項目里轉發
  3.  重定向會導致request對象信息丟失。轉發則不會
  4.  轉發的url不會變,request.getRequestDispatch().forward()
  5.  重定向的url會改變,response.getRedirect().sendRedirect();

8.Jsp和Servlet的區別

  1.  Jsp的可讀性強,容易看得懂,並且Jsp在最后會編譯成Servlet
  2.  servlet容易調試,但是生成html頁面工作量大

10.Jsp可以操作窗口嗎?

Jsp不能夠直接調用窗口,只能先生成打開窗口的js,再由js調用窗口

11.Session的主要幾個方法的區別

  1.  Session不能通過new創建,需要通過調用getSession()或者getSession(true)方法創建,getSession()是自動創建session,getSession(true)是強制創建session,setAttribute()方法可以用於傳值,getAttribute()可以用於取值
  2.  (第一次創建session的時候,就是訪問第一次一個jsp頁面<這個頁面的page指令 沒有設置session=false>)
  3.  銷毀session調用invalidate方法
  4.  通過setMaxInactiveInterval()可以設定session的生存時間(web.xml可以設置session的生存時間)

12.Jsp的九大內置對象,三大指令,七大動作的具體功能

JSP九大內置對象:

pageContext :只對當前jsp頁面有效,里面封裝了基本的request和session的對象

Request :對當前請求進行封裝

Session :瀏覽器會話對象,瀏覽器范圍內有效

Application :應用程序對象,對整個web工程都有效

Out :頁面打印對象,在jsp頁面打印字符串

Response :返回服務器端信息給用戶

Config :單個servlet的配置對象,相當於servletConfig對象

Page :當前頁面對象,也就是this

Exception :錯誤頁面的exception對象,如果指定的是錯誤頁面,這個就是異常對象

三大指令:

Page :指令是針對當前頁面的指令

Include :用於指定如何包含另一個頁面

Taglib :用於定義和指定自定義標簽

七大動作:

Forward,執行頁面跳轉,將請求的處理轉發到另一個頁面

Param :用於傳遞參數 Include :用於動態引入一個jsp頁面

Plugin :用於下載javaBean或applet到客戶端執行

useBean:使用javaBean

setProperty :修改javaBean實例的屬性值

getProperty :獲取javaBean實例的屬性值

13.獲取頁面的元素的值有幾種方式,分別說一下

  1.  request.getParameter() 返回客戶端的請求參數的值
  2.  request.getParameterNames() 返回所有可用屬性名的枚舉
  3.  request.getParameterValues() 返回包含參數的所有值的數組

14.Servlet和JavaScript的區別, 它們分別是什么作用

  1.  一個是服務端,一個是客戶端
  2.  Servlet是獨立於平台和協議的服務器端的Java應用程序,可以動態生成Web頁面,並采用響應--請求的模式提供Web服務
  3.  JavaScript是一種解釋性語言,用於向html頁面提供交互行為,通常被直接嵌入在html頁面中
  4.  Servlet是Java語言編寫的web應用
  5. Js是基於html上的一種解釋語言

15.Jsp的執行原理

 客戶端發出請求(request),Jsp引擎將jsp頁面翻譯成Servlet的java源文件,在Tomcat(Servlet容器)中將源文件編譯成class文件,並加載到內存中執行,把結果返回(response)給客戶端。

16.HTML和Servlet的異同

不同: Html是靜態,servlet是動態 html頁面由服務器直接返回, servlet是用來處理客戶請求,並返回html頁面 ,Servlet需要服務器調用servlet方法生成動態html頁面,且需要在web.xml中配置url路徑

17.會話跟蹤有哪些,他們的區別是什么

Cookie,session和application, Cookie是http對象,客戶端與服務端都可以操縱

cookie是在客戶端保持狀態,session是在服務器端保持狀態,由於cookie是保存在客戶端本地的,所以數據很容易被竊取,當訪問量很多時,使用session則會降低服務器的性能,application的作用域是整個工程里只有一個,可以在不同瀏覽器之間共享數據,所有人都可以共享,因此application也是不安全的,Cookie和Session的區別

18.說說Jsp的隱藏對象有哪些

Request,out,response , pageContext , session , application , config , page , exception,也即jsp的九大內置對象

19.request ,response,session 和 application是怎么用的

  1.  Request是客戶端向服務端發送請求
  2.  Response是服務端對客戶端請求做出響應
  3.  Session在servlet中不能直接使用,需要通過getSession()創建,如果沒有設定它的生命周期,或者通過invildate()方法銷毀,關閉瀏覽器session就會消失
  4.  Application不能直接創建,存在於服務器的內存中,由服務器創建和銷毀

20.為什么在session少放對象

因為session底層是由cookie實現的,當客戶端的cookie被禁用后,session也會失效,且應盡量少向session中保存信息,session的數據保存在服務器端,當有大量session時,會降低服務器的性能

21.怎么判斷瀏覽器是否支持Cookie

可以使用javaScript的方法navigator.cookieEnabled判斷瀏覽器是否支持cookie

22.Request和Session的取值區別,以及出現亂碼的解決方式(不能在java代碼中設置)

  1.  Request可以通過getAttribute()方法直接取值,也可通過getParameter()取值
  2.  Session需要通過request.getSession().getAttribute()才能取值
  3.  Request是針對一次請求,Session是針對整個會話
  4.  在頁面通過contentType,pageEncoding,content設置編碼格式,必須要一致

24.Jsp頁面跳轉

Jsp頁面跳轉有兩種方式,forward和redirect(轉發和重定向) 

25.說出Jsp內置對象以及方法.

Request:客戶端發送請求
getParameter() 得到前台傳入的參數值
  1.  setCharacterEncoding(String arg0):設置編碼格式
  2.  getCharacterEncoding():獲取編碼格式
  3.  getRequestDispatcher(String path):返回一個RequestDispatcher對象
Response:服務器端返回信息給用戶
  1.  setAttribute("name",Object obj):設置名字為name的request參數的值,該值是由Object類型的obj指定
  2.  getAttribute("name"):返回name屬性值
  3.  getAttributeNames():返回所有可用屬性名的枚舉
  4.  setCharacterEncoding(String charset):設置編碼格式
  5.  getCharacterEncoding():獲取編碼格式
  6.  sendRedirect(String location):返回對包裝的響應對象調用
pageContext:網頁的屬性是在這里管理的
  1.  setAttribute("name",Object obj):設置名字為name的request參數的值,該值是由Object類型的obj指定
  2.  getAttribute("name"):返回name屬性值
  3.  getAttributeNames():返回所有可用屬性名的枚舉
Session:與請求有關的會話期
  1.  setAttribute("name",Object obj):設置名字為name的request參數的值,該值是由Object類型的obj指定
  2.  getAttribute("name"):返回name屬性值
  3.  getAttributeNames():返回所有可用屬性名的枚舉
  4.  invalidate():使當前會話失效
  5.  setMaxInactiveInterval():指定在Servlet容器使此會話失效之前客戶端請求之間的時間間隔,以秒為單位。負數時間指示會話永遠不會超時
  6.  getMaxInactivelnterval():返回servlet 容器在客戶端訪問之間將使此會話保持打開狀態的最大時間間隔,以秒為單位。在此間隔之后,servlet 容器將使會話無效
Application:Servlet正在執行的內容
  1.  setAttribute("name",Object obj):設置名字為name的request參數的值,該值是由Object類型的obj指定
  2.  getAttribute("name"):返回name屬性值
Out:用來傳送回應的輸出
  1.  print():打印信息
  2.  println():換行打印信息
Config:Servlet的構架部件

getInitParameter(String paramNarne):從web.xml中獲取指定名稱的值 getInitParameterNames():從web.xml中獲取所有的名稱

Page:JSP頁面本身

Exception:針對錯誤網頁,未捕捉的例外 getMessage():返回異常的詳細信息 getClass():返回異常的名稱

26.有幾種方式將頁面的值傳到后台

可通過get或post將值傳遞到后台,也可通過Jsp里面的setAttribute()方法將值傳遞到后台

27.一個form表單的值如何獲取

在Servlet中通過request.getParameter()方法可以獲取表單的值或者是request.getParameterValuse();

29.Jsp中父頁面中怎么拿到子頁面的表單元素,不是拿值怎么拿

通過設置屬性setAttribute(),通過getAttribute()拿值,getParameter()方法可以做到

31.404和500是什么意思

  1.  404 :找不到url請求的路徑,一般是工程名不對或者拼寫錯誤
  2.  500 :服務器內部錯誤,一般是服務器內部代碼編寫錯誤,也有可能是拋異常導致

32.寫出5種JSTL常用標簽

<c:if>,<c:item>,<c:foreach>,<c:out>,<c:set>

33.Jsp頁面把一個元素隱藏的方法

通過使用屬性hidden可以將元素隱藏

35.我們在web應用開發過程中經常遇到輸出某種編碼的字符,如ISO-8859-1,如何輸出一個某種編碼的字符串

如將ISO-8859-1輸出為GBK格式的字符, 通過new String(byte[] bytes,String charset) 構造器設置編碼構造一個新的String(new String("ISO-8859-1","GBK"));

36.Jsp里有那些標簽

jsp:include等

37.怎么判斷用戶請求時是第一次,如果客戶端和服務端斷開怎么連到上一次操作

通過session中的isNew()可以判斷是否是新用戶,可以用cookie來保存信息到客戶端,可以連接到上一次操作

38.如果創建servlet實例不用構造方法,怎么創建一個servlet實例

Web容器會自動為servlet寫一個無參的構造器,它使用class.forName("").newInstance()反射來創建servlet實例的

39.Servlet和過濾器的區別

  Servlet:是用來處理客戶端發送的請求,然后生成響應並將其傳給server服務器,最后服務器將響應返回給客戶端

  過濾器:是用於 對servlet容器調用servlet的過程進行攔截,可以在servlet進行響應處理前后做一些特殊的處理,譬如權限,日志,編碼等

40.說明一下jsp中<jsp: include page..>和<%@ include file%>的區別

動態導入
  1.  是行為元素、是在請求處理階段引入的,引入執行頁面或servlet所生成的應答文本
  2.  先編譯,后包含,就是將每個jsp頁面都單獨轉化成html頁面,最后再將所有的html頁面相加,如果有相同變量不會沖突
<%@ include file="" %> 靜態導入
  1.  是指令元素
  2.  是編譯時包含,引入靜態文本(html,jsp),在JSP頁面被轉化成servlet之前和它融和到一起。先包含,后編譯
  3.  就是將多個jsp一起解析,最后再一起生成html頁面,如果有相同變量會沖突

41. pageContext有什么作用

可以使用pageContext對象來設定屬性,並指定屬性的作用范圍,提供了對JSP頁面內所有的對象及名字空間的訪問

42.Servlet是單例還是多例

是單例的,可以提高性能

43.攔截器(Filter)怎么執行的

  1.  首先初始化過濾器,然后服務器組織過濾器鏈,所有的請求都必須需要先通過過濾器鏈,
  2.  過濾器鏈是一個棧,遵循先進后出的原則 ,所有的請求需要經過一個一個的過濾器,執行順序要根據web.xml里配置的<filter-mapping>的位置前后執行,每個過濾器之間通過chain.doFilter連接, 最后抵達真正請求的資源,執行完后再從過濾器鏈退出
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM