目錄
?1.Servlet生命周期
2.Servlet的配置
3.Servlet的常用方法
4.Servlet體系結構
5.HTTP請求報文
6.HTTP響應報文
?1.Servlet生命周期
Servlet(Server Applet)是Java Servlet的簡稱。其主要的功能是交互式地瀏覽和修改數據,生成一些動態(tài)的Web內容。
?Servlet的生命周期 可以簡述為以下幾個步驟:
- Servlet容器接收到第一個HTTP請求,將其委派給對應的Servlet。
- Servlet初始化階段,容器會調用Servlet的init()方法,用于執(zhí)行一些初始化操作,比如加載資源、建立數據庫連接等。
- 在接收到客戶端請求時,Servlet容器會調用Servlet的service()方法來處理請求,并根據請求方法(如GET、POST等)決定調用具體的doGet()、doPost()等方法。在這些方法中,開發(fā)者可以編寫處理請求和生成響應的業(yè)務邏輯。
- 當Servlet容器關閉或重新加載時,會調用Servlet的destroy()方法用于清理資源、釋放連接等操作。
- 最后,當沒有活躍的請求或超過一定時間限制時,Servlet容器會通過JVM的垃圾回收機制對Servlet進行回收。
2.Servlet的配置
1.通過xml配置
<!-- servlet聲明-->
<servlet>
<servlet-name> Servlet名字(自己定義的) </servlet-name>
<servlet-class> 此處寫完整的類名 </servlet-class>
</servlet>
<!-- servlet訪問方式的聲明-->
<servlet-mapping>
<servlet-name>Servlet名字(自己定義的)</servlet-name>
<url-pattern>訪問路徑</url-pattern>
</servlet-mapping>
2.通過注解配置
可以看到如果增加一個servlet類就需要多進行配置一次非常麻煩,所以官方引入了注解配置(無需再使用web.xml),但是注意注解配置只能在Web Application3.0以上版本才可用
@WebServlet("/" +" 路徑名(可以自行設置名稱)")
@WebServlet({"/" +" 路徑名(可以自行設置名稱)","/" +" 路徑名(可以自行設置名稱)"...})
案例:
3.Servlet的常用方法
?????? 在實現了Servlet的接口后會出現以下幾個方法:(核心在于init(),service();destory()三個生命周期方法)
package com.company;
import javax.servlet.*;
import java.io.IOException;
public class Main implements Servlet {
// 創(chuàng)建一個ServletConfig對象可以用來接收init傳遞的servletConfig
private ServletConfig servletConfig;
// 初始化,在Servlet創(chuàng)建時候自動執(zhí)行,特點是只會執(zhí)行一次
@Override
public void init(ServletConfig servletConfig) throws ServletException {
// 通過數據范圍上升一級實現能夠獲取ServletConfig信息
this.servletConfig = servletConfig;
}
// 獲取Servlet類的相關配置數據
@Override
public ServletConfig getServletConfig() {
return servletConfig;
}
// 提供服務方法,特點是在每一次用戶訪問時候都能調用方法
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("執(zhí)行服務方法");
}
// 獲取消息
@Override
public String getServletInfo() {
return null;
}
// 結束生命周期,在服務器關閉時候執(zhí)行destroy方法
@Override
public void destroy() {
}
}
案例:
創(chuàng)建一個類叫ServletDemo源碼如下:通過實行按Servlet接口并覆寫相關方法。找到service方法,在其下輸出Hello Servlet和Test
package com.company;
import javax.servlet.*;
import java.io.IOException;
public class ServletDemo implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
// 使用service服務的方法,其他暫時不用管
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello Servlet");
System.out.println("Test");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
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">
<!--配置-->
<display-name>HelloServlet</display-name>
<!-- servlet聲明-->
<servlet>
<!-- 隨便創(chuàng)建想要的Servlet名字-->
<servlet-name> ServletDemo </servlet-name>
<!-- 找到servlet對應的類,輸入 包.具體類名-->
<servlet-class> com.company.ServletDemo </servlet-class>
</servlet>
<!-- servlet訪問方式的聲明-->
<servlet-mapping>
<!-- 映射Servlet名-->
<servlet-name>ServletDemo</servlet-name>
<!-- 映射路徑配置一般就用 "/"+映射類名-->
<url-pattern>/ServletDemo</url-pattern>
</servlet-mapping>
</web-app>
?通過輸入url并加上對應的路徑
再回到idea中的控制臺可以看到能夠正常訪問
4.Servlet體系結構
問題引出:通過案例可以發(fā)現 我們一般使用資源請求,只會調用到service方法。其他init方法,destroy方法等等我們都不太需要,但是由于Servlet是接口所以需要覆寫所有的方法,所以引入了其他類
?Servlet體系結構:
其中GennericServlet抽象類將除了service的方法默認進行空處理如下所示:
package com.company;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class GenServlet extends GenericServlet {
// 除了service方法其他都不需要覆寫
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("我是service方法");
// 判斷請求方式
String method = servletRequest.getMethod();
if (method.equals("GET")){
}else if (method.equals("POST")){
}
}
}
?問題引出:可以看到雖然繼承了GennericServlet類,但是處理請求數據時候,由于請求方式的不同(請求方式有Get和POST)所以要單獨對其進行操作,并且每多一個繼承GennericServlet的類就需要再寫一邊判斷請求方式代碼,為此又細化分了一個HttpServlet抽象類
HttpServlet自動幫助寫完了判斷方法,并且?guī)砹朔椒╠oGet(),doPOST()
案例代碼:
package com.company;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//多路徑設置
@WebServlet({"/Hello","/Dome","/kimi"})
public class HttpServlet extends javax.servlet.http.HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("GET!!!!!!!!!");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("POST!!!!!!!!!!!!");
}
}
在index.jsp中設置一個表單并且可以通過method修改發(fā)送方法
Get方法獲取到信息
?Post方法獲取到信息
5.HTTP請求報文
1.請求報文格式
HTTP 請求報文的格式可分為三個部分:起始行(請求行)、請求頭部(Header)和請求體(Body)。
示例:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
Accept-Language: en-US,en;q=0.9
請求行(Request Line):
- 包含三個要素:HTTP 方法、請求目標(URI/URL)和 HTTP 版本。
- 示例:
GET /index.html HTTP/1.1
請求頭部(Headers):
- 由多個鍵值對組成,每行一個鍵值對,用冒號分隔鍵和值。
- 可包含多個不同的請求頭,如 Host、User-Agent、Content-Type 等。
請求體(Body):
- 僅在某些請求中存在,用于承載客戶端向服務器發(fā)送的數據(如 POST、PUT 請求)。
- 根據不同的應用場景,請求體可以是純文本、JSON、XML、二進制數據等格式。
?2.請求頭部
由關鍵字和值組成,每行一隊,關鍵字和值之間用“:”隔開
請求頭部字段 | 說明 | 示例 |
---|---|---|
Host | 請求的目標主機的域名或IP地址 | Host:www.example.comwww.example.comwww.example.com |
User-Agent | 發(fā)起請求的用戶代理信息 | User-Agent: Mozilla/5.0 |
Accept | 客戶端可接受的響應內容類型 | Accept: text/html, application/json |
Content-Type | 請求中包含的實體的媒體類型 | Content-Type: application/json |
Authorization | 認證信息,用于身份驗證 | Authorization: Bearer token123 |
Cookie | 之前由服務器通過Set-Cookie設置的cookie | Cookie: sessionId=abc123 |
Referer | 表示客戶端是從哪個URL跳轉過來的 | Referer: Example DomainExample DomainExample Domain |
Content-Length | 請求中的消息體長度 | Content-Length: 1024 |
If-None-Match | 用于緩存驗證,與資源的ETag進行比較 | If-None-Match: "abc123" |
If-Modified-Since | 用于緩存驗證,與資源的最后修改時間進行比較 | If-Modified-Since: Tue, 01 Aug 2023 12:00:00 GMT |
6.HTTP響應報文
1.響應報文格式
??? HTTP 響應報文的格式可分為三個部分:起始行(狀態(tài)行)、響應頭部(Header)和響應體(Body)。
示例:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
Cache-Control: max-age=3600
<!DOCTYPE html>
<html>
<head>
<title>Welcome</title>
</head>
<body>
<h1>Hello, World!</h1>
<p>This is a sample HTML page.</p>
</body>
</html>
-
狀態(tài)行(Status Line):
- 包含三個要素:HTTP 版本、狀態(tài)碼和狀態(tài)消息。
- 示例:
HTTP/1.1 200 OK
-
響應頭部(Headers):
- 由多個鍵值對組成,每行一個鍵值對,用冒號分隔鍵和值。
- 可包含多個不同的響應頭,如 Content-Type、Content-Length、Cache-Control 等。
-
響應體(Body):
- 用于承載服務器返回給客戶端的實際數據內容。
- 根據不同的應用場景,響應體可以是純文本、HTML、JSON、XML、二進制數據等格式。
2.常用的狀態(tài)碼
狀態(tài)碼 | 含義 |
---|---|
200 | OK - 請求成功完成 |
301 | Moved Permanently - 資源永久重定向到新URL |
302 | Found - 資源臨時重定向到新URL |
304 | Not Modified - 資源未修改,可以使用緩存的版本 |
400 | Bad Request - 請求無效或非法 |
403 | Forbidden - 拒絕訪問,權限不足或被禁止 |
404 | Not Found - 請求的資源不存在 |
500 | Internal Server Error - 服務器內部錯誤 |
?3.常用的響應頭文章來源:http://www.zghlxwxcb.cn/news/detail-641512.html
響應頭部字段 | 說明 | 示例 |
---|---|---|
Content-Type | 響應中實體的媒體類型 | Content-Type: text/html; charset=UTF-8 |
Content-Length | 響應中實體的長度(字節(jié)) | Content-Length: 1024 |
Server | 服務器軟件名稱和版本號 | Server: Apache/2.4.29 (Unix) |
Set-Cookie | 服務器設置的cookie信息 | Set-Cookie: sessionId=abc123 |
Last-Modified | 資源的最后修改時間 | Last-Modified: Tue, 01 Aug 2023 12:00:00 GMT |
ETag | 資源的實體標識符 | ETag: "abc123" |
Location | 重定向的目標URL | Location: Example Domain |
Cache-Control | 指定響應的緩存機制 | Cache-Control: max-age=3600 |
Content-Encoding | 響應實體的壓縮編碼方式 | Content-Encoding: gzip |
Access-Control-Allow-Origin | 指定允許跨域請求的域名或通配符 | Access-Control-Allow-Origin: * |
下一篇JavaWeb-Servlet服務連接器(二)_Alphamilk的博客-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-641512.html
到了這里,關于JavaWeb-Servlet服務連接器(一)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!