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型別。