王振國老師整理
Servlet 技術
什麼是 Servlet?
- Servlet 是 JavaEE 規範之一。規範就是接口
- Servlet 就 JavaWeb 三大組件之一。三大組件分別是:Servlet 程序、Filter 過濾器、Listener 監聽器。
- Servlet 是運行在服務器上的一個 java 小程序,它可以接收客戶端發送過來的請求,並響應數據給客戶端。
手動實現 Servlet 程序
- 編寫一個類去實現 Servlet 接口
- 實現 service 方法,處理請求,並響應數據
- 到 web.xml 中去配置 servlet 程序的訪問地址
Servlet 程序的示例代碼:
public class HelloServlet implements Servlet {
/**
* service 方法是專門用來處理請求和響應的
*
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service( ServletRequest servletRequest, ServletResponse servletResponse ) throws
ServletException, IOException {
System.out.println("Hello Servlet 被訪問了");
}
}
web.xml 中的配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- servlet 標籤給 Tomcat 配置 Servlet 程序 -->
<servlet>
<!--servlet-name 標籤 Servlet 程序起一個別名(一般是類名) -->
<servlet-name>HelloServlet</servlet-name>
<!--servlet-class 是 Servlet 程序的全類名-->
<servlet-class>com.servlet.HelloServlet</servlet-class>
</servlet>
<!--servlet-mapping 標籤給 servlet 程序配置訪問地址-->
<servlet-mapping>
<!--servlet-name 標籤的作用是告訴服務器,我當前配置的地址給哪個 Servlet 程序使用-->
<servlet-name>HelloServlet</servlet-name>
<!--url-pattern 標籤配置訪問地址 <br/>
/ 斜槓在服務器解析的時候,表示地址爲:http://ip:port/工程路徑 <br/>
/hello 表示地址爲:http://ip:port/工程路徑/hello <br/>
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
url 地址到 Servlet 程序的訪問
Servlet 的生命週期
- 執行 Servlet 構造器方法
- 執行 init 初始化方法
- 執行 service 方法
- 執行 destroy 銷燬方法
注意:
- 第一、二步,是在第一次訪問,的時候創建 Servlet 程序會調用。
- 第三步,每次訪問都會調用。
- 第四步,在 web 工程停止的時候調用。
GET 和 POST 請求的分發處理
public class HelloServlet implements Servlet {
/**
* service 方法是專門用來處理請求和響應的
*
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service( ServletRequest servletRequest, ServletResponse servletResponse ) throws
ServletException, IOException {
System.out.println("3 service === Hello Servlet 被訪問了");
// 類型轉換(因爲它有 getMethod()方法)
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
// 獲取請求的方式
String method = httpServletRequest.getMethod();
if ("GET".equals(method)) {
doGet();
} else if ("POST".equals(method)) {
doPost();
}
}
/**
* 做 get 請求的操作
*/
public void doGet() {
System.out.println("get 請求");
System.out.println("get 請求");
}
/**
* 做 post 請求的操作
*/
public void doPost() {
System.out.println("post 請求");
System.out.println("post 請求");
}
}
通過繼承 HttpServlet 實現 Servlet 程序
一般在實際項目開發中,都是使用繼承 HttpServlet 類的方式去實現 Servlet 程序。
- 編寫一個類去繼承 HttpServlet 類
- 根據業務需要重寫 doGet 或 doPost 方法
- 到 web.xml 中的配置 Servlet 程序的訪問地址
Servlet 類的代碼:
@WebServlet("/helloServlet2")
public class HelloServlet2 extends HttpServlet {
/**
* doGet()在 get 請求的時候調用
*
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet( HttpServletRequest req, HttpServletResponse resp ) throws ServletException,
IOException {
System.out.println("HelloServlet2 的 doGet 方法");
}
/**
* doPost()在 post 請求的時候調用
*
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doPost( HttpServletRequest req, HttpServletResponse resp ) throws ServletException,
IOException {
System.out.println("HelloServlet2 的 doPost 方法");
}
}
Servlet 類的繼承體系
ServletConfig 類
- ServletConfig 類從類名上來看,就知道是 Servlet 程序的配置信息類。
- Servlet 程序和 ServletConfig 對象都是由 Tomcat 負責創建,我們負責使用。
- Servlet 程序默認是第一次訪問的時候創建,ServletConfig 是每個 Servlet 程序創建時,就創建一個對應的 ServletConfig 對 象。
ServletConfig 類的三大作用
- 可以獲取 Servlet 程序的別名 servlet-name 的值
- 獲取初始化參數 init-param
- 獲取 ServletContext 對象
Servlet 中的代碼:
@Override
public void init(ServletConfig servletConfig)throws ServletException{
System.out.println("2 init 初始化方法");
// 1、可以獲取 Servlet 程序的別名 servlet-name 的值
System.out.println("HelloServlet 程序的別名是:"+servletConfig.getServletName());
// 2、獲取初始化參數 init-param
System.out.println("初始化參數 username 的值是;"+servletConfig.getInitParameter("username"));
System.out.println("初始化參數 url 的值是;"+servletConfig.getInitParameter("url"));
// 3、獲取 ServletContext 對象
System.out.println(servletConfig.getServletContext());
}
web.xml 中的配置:
<!--servlet-class 是 Servlet 程序的全類名-->
<servlet-class>com.servlet.HelloServlet</servlet-class>
<!--init-param 是初始化參數-->
<init-param>
<!--是參數名-->
<param-name>username</param-name>
<!--是參數值-->
<param-value>root</param-value>
</init-param>
<!--init-param 是初始化參數-->
<init-param>
<!--是參數名-->
<param-name>url</param-name>
<!--是參數值-->
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</init-param>
</servlet>
<!--servlet-mapping 標籤給 servlet 程序配置訪問地址-->
<servlet-mapping>
<!--servlet-name 標籤的作用是告訴服務器,我當前配置的地址給哪個 Servlet 程序使用-->
<servlet-name>HelloServlet</servlet-name>
<!--
url-pattern 標籤配置訪問地址 <br/>
/ 斜槓在服務器解析的時候,表示地址爲:http://ip:port/工程路徑 <br/>
/hello 表示地址爲:http://ip:port/工程路徑/hello <br/>
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
注意:
- 重寫init方法裏面一定要調用父類的init(ServletConfig)操作
ServletContext 類
什麼是 ServletContext?
- ServletContext 是一個接口,它表示 Servlet 上下文對象
- 一個 web 工程,只有一個 ServletContext 對象實例。
- ServletContext 對象是一個域對象。
- ServletContext 是在 web 工程部署啓動的時候創建。在 web 工程停止的時候銷燬。
什麼是域對象?
域對象,是可以像 Map 一樣存取數據的對象,叫域對象。 這裏的域指的是存取數據的操作範圍,整個 web 工程。
存數據 取數據 刪除數據
Map put() get() remove()
域對象 setAttribute() getAttribute() removeAttribute();
ServletContext 類的四個作用
- 獲取 web.xml 中配置的上下文參數 context-param
- 獲取當前的工程路徑,格式: /工程路徑
- 獲取工程部署後在服務器硬盤上的絕對路徑
- 像 Map 一樣存取數據
ServletContext 演示代碼:
protected void doGet(HttpServletRequest request,HttpServletResponse response)throws
ServletException,IOException{
// 1、獲取 web.xml 中配置的上下文參數 context-param
ServletContext context=getServletConfig().getServletContext();
String username=context.getInitParameter("username");
System.out.println("context-param 參數 username 的值是:"+username);
System.out.println("context-param 參數 password 的值是:"+
context.getInitParameter("password"));
// 2、獲取當前的工程路徑,格式: /工程路徑
System.out.println("當前工程路徑:"+context.getContextPath());
// 3、獲取工程部署後在服務器硬盤上的絕對路徑
/**
* / 斜槓被服務器解析地址爲:http://ip:port/工程名/ 映射到 IDEA 代碼的 web 目錄<br/>
*/
System.out.println("工程部署的路徑是:"+context.getRealPath("/"));
System.out.println("工程下 css 目錄的絕對路徑是:"+context.getRealPath("/css"));
System.out.println("工程下 imgs 目錄 1.jpg 的絕對路徑是:"+context.getRealPath("/imgs/1.jpg"));
}
HTTP 協議
什麼是 HTTP協議?
- 協議是指雙方,或多方,相互約定好,大家都需要遵守的規則,叫協議。
- 所謂 HTTP 協議,就是指,客戶端和服務器之間通信時,發送的數據,需要遵守的規則,叫 HTTP 協議。
- HTTP 協議中的數據又叫報文。
請求的 HTTP 協議格式
- 客戶端給服務器發送數據叫請求。
- 服務器給客戶端回傳數據叫響應。
- 請求又分爲 GET 請求,和 POST 請求兩種
GET 請求
請求行
- 請求的方式 GET
- 請求的資源路徑[+?+請求參數]
- 請求的協議的版本號 HTTP/1.1
請求頭 key : value 組成 不同的鍵值對,表示不同的含義。
POST 請求
請求行
- 請求的方式 POST
- 請求的資源路徑[+?+請求參數]
- 請求的協議的版本號 HTTP/1.1
請求頭
- key : value 不同的請求頭,有不同的含義
空行
請求體 ===>>> 就是發送給服務器的數據
常用請求頭的說明
- Accept: 表示客戶端可以接收的數據類型
- Accpet-Languege: 表示客戶端可以接收的語言類型
- User-Agent: 表示客戶端瀏覽器的信息
- Host: 表示請求時的服務器 ip 和端口號
如何區分是GET和POST請求
GET 請求有哪些:
- form 標籤 method=get
- a 標籤
- link 標籤引入 css
- Script 標籤引入 js 文件
- img 標籤引入圖片
- iframe 引入 html 頁面
- 在瀏覽器地址欄中輸入地址後敲回車
POST 請求有哪些:
- form 標籤 method=post
響應的 HTTP 協議格式
響應行
- 響應的協議和版本號
- 響應狀態碼
- 響應狀態描述符
響應頭
- key : value 不同的響應頭,有其不同含義
空行
響應體 ---->>> 就是回傳給客戶端的數據
常用的響應碼說明
- 200 表示請求成功
- 302 表示請求重定向
- 404 表示請求服務器已經收到了,但是你要的數據不存在(請求地址錯誤)
- 500 表示服務器已經收到請求,但是服務器內部錯誤(代碼錯誤)
MIME 類型說明
- MIME 是 HTTP 協議中數據類型。
- MIME 的英文全稱是"Multipurpose Internet Mail Extensions" 多功能 Internet 郵件擴充服務。
- MIME 類型的格式是“大類型/小 類型”,並與某一種文件的擴展名相對應。
常見的 MIME 類型:
谷歌瀏覽器如何查看 HTTP 協議:
火狐瀏覽器如何查看 HTTP 協議: