1. 程式人生 > 其它 >Servlet+jsp複習

Servlet+jsp複習

Servlet

Servlet是Java EE十三項規範之一,是一個介面。javaweb的三大元件為Servlet、Filter、Listener。

Servlet是一個執行在web伺服器的java程式,可以用來接收客戶端發來的資料和響應回傳資料給客戶端。

通過查詢API文件可以得知,Servlet介面中有以下五個抽象方法

 init()方法是在工程建立的時候呼叫的,請求和響應都在Service(req,res)方法中處理。關閉伺服器的時候呼叫destroy方法。其他兩個不常用就不介紹了。

當我們啟動Tomcat伺服器的時候,可以通過兩種方式來訪問Servlet程式

第一種方式:早期是把Servlet程式的一個資訊寫在web.xml檔案中來訪問,具體寫法如下:

 為了簡化 Servlet 的配置,Servlet 3.0 中增加了註解支援,例如:@WebServlet、@WebInitParm 、@WebFilter 和 @WebLitener 等,這使得 web.xml 從 Servlet 3.0 開始不再是必選項了。下面我們對 @WebServlet 進行介紹。

第二種方式:使用註解來實現

其次再來介紹以下Servlet的繼承體系,GenericServlet這個類實現了Servlet介面,做了很多空實現,並不能滿足我們的需求,我們建立的web工程遵守Http協議,接著HttpServlet類繼承了

GenericServlet類,對service()方法進行了實現,並對Get和Post請求進行了分發處理。

深入淺出,我們要想使用Servlet,就只需要建立一個類繼承HttpServlet類,並且重新doGet和doPost方法即可。

細心可以發現,在init方法中有一個形參,是ServletConfig的實現介面型別的(ServletConfig是一個標準化介面),這個類是Servlet程式的配置資訊類,

可以獲取初始化引數、別名和ServletContext物件  注:Servlet程式的預設第一次訪問的時候建立,ServletConfig 是每個 Servlet 程式建立時,就建立一個對應的 ServletConfig物件(一個servlet類對應一個ServletConfig物件)

 接著,ServletContext類,首先來進行介紹

1、ServletContext 是一個介面,它表示 Servlet 上下文物件 2、一個 web 工程,只有一個 ServletContext 物件例項。

3、ServletContext 物件是一個域物件。 4、ServletContext 是在 web 工程部署啟動的時候建立。在 web 工程停止的時候銷燬。

ServletContext類的四個作用:

1、獲取 web.xml 中配置的上下文引數 context-param 2、獲取當前的工程路徑,格式: /工程路徑 3、獲取工程部署後在伺服器硬碟上的絕對路徑 4、像 Map 一樣存取資料

執行結果如下:

 第一行是空行是因為我的Tomcat路徑設定的問題,放下面了

 接下來是Get和Post請求在Http協議中的不同點                    get請求分為請求行和請求頭,沒有請求體。post請求分為請求行、請求頭和請求體

get請求:

請求行:

1) 請求的方式 GET (2) 請求的資源路徑[+?+請求引數] (3) 請求的協議的版本號 HTTP/1.1

請求頭:存放鍵值對資訊

post請求的get請求的區別就在於,把請求引數放到了請求體中。

關於響應行的請求形式如下:

1、響應行 (1) 響應的協議和版本號 (2) 響應狀態碼 (3) 響應狀態描述符 2、響應頭 (1) key : value 不同的響應頭,有其不同含義 空行 3、響應體 ---->>> 就是回傳給客戶端的資料

響應狀態碼:200 表示請求成功 302 表示請求重定向   404 表示請求伺服器已經收到了,但是你要的資料不存在(請求地址錯誤) 500 表示伺服器已經收到請求,但是伺服器內部錯誤(程式碼錯誤)

請求轉發:RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");   requestDispatcher.forward(req,resp);轉發只能在自己的工程範圍內進行,不能訪問外面的網站,比如百度、b站。轉發是一次請求,request域還可以用,瀏覽器欄的地址不會改變

請求重定向:1、resp.setStatus(302); // 設定響應頭,說明 新的地址在哪裡 resp.setHeader("Location", "http://localhost:8080");

2、resp.sendRedirect("http://localhost:8080"),重定向是兩次請求,地址改變了,相當於重新輸入一遍新地址再訪問。

dopost響應亂碼解決方法:

resp.setContentType("text/html; charset=UTF-8");

 HttpServletresponce類的使用:

 PrintWriter writer = resp.getWriter(); writer.write("response's content!!!");

獲取標準輸出流
PrintWriter out = resp.getWriter();
向標準輸出流中寫入資料,那麼客戶端瀏覽器就會直接看到這寫資料
out.write()是位元組輸出流的方法 
    輸出數字,顯示的是其ASCII對應字元
    out.write(97);  輸出a
out.print()是字元輸出流的方法 
    out.print(97); 輸出97
一、區別 
1. print方法是子類JspWriter,write是Writer類中定義的方法; 
2. 過載的print方法可將各種型別的資料轉換成字串的形式輸出,而過載的write方法只能輸出字元、
 字元陣列和字串等與字元相關的資料; 
3. JspWriter型別的out物件使用print方法和write方法都可以輸出字串,但是,如果字串物件的值
 為null時,print方法將輸出內容為“null”的字串,而write方法則是丟擲NullPointerException異常

但是print()方法的底層實現也是write()只不過把所有型別都轉成了String型別。