JavaWeb核心篇(1)——HTTP/Tomcat/Servlet
在正式講解JavaWeb前,我們先來了解一下JavaWeb:
- Web:全球廣域網,也被稱為萬維網(www),能夠通過瀏覽器訪問的網站
- JavaWeb:通過Java技術來解決相關Web互聯網領域的技術堆疊
如果說網頁是為了展現資料,資料庫是為了存盤和管理資料,那么JavaWeb就是為了進行邏輯處理
溫馨提示:在學習JavaWeb前,需要先學習MYSQL,JDBC和前端三件套,
WEB核心技術堆疊介紹
既然我們想要學習JavaWeb,那么我們就要先來進行了解:
- B/S框架:Browser/Server,瀏覽器/服務器 構造模式,它的特點是,客戶端只需要瀏覽器,應用程式和資料都存盤在服務器端,瀏覽器只需要請求服務器,獲得Web資源,服務器把Web資源發送給瀏覽器即可,
- 靜態資源:HTML,CSS,JavaScript,圖片等,負責頁面展示
- 動態資源:Servlet,JSP等,負責邏輯處理
- 資料庫:負責存盤資料
- HTTP協議:定義通信規則
- Web服務器:負責決議HTTP協議,決議請求資料,并發送回應資料(常用Web服務器:Apache Tomcat)
HTTP
首先我們系統的介紹一下HTTP
- 概念:HyperText Transfer Protocol,超文本傳輸協議,規定了瀏覽器和服務器之間資料傳輸的規則
HTTP特點:
- 基于TCP協議:面向連接,安全
- 基于請求-回應模型:一次請求對應一次回應
- HTTP協議是無狀態的協議:對于事務處理沒有記憶能力;每次請求-回應都是獨立的
HTTP優缺點:
- 優點:速度快
- 缺點:多次請求間不能共享資料,(Java中使用會話技術Cookie,Session來解決這個問題)
HTTP請求資料格式
HTTP請求資料分為三部分:
- 請求行:請求資料的第一行,其中GET表示請求方式(還有POST方法),/表示請求資源路徑,HTTP/1.1表示協議版本
- 請求頭:第二行開始,格式為key:value形式
- 請求體:POST請求的最后一部分
常見的請求頭:
- Host:表示請求的主機名
- User-Agent:瀏覽器版本
- Accept:表示瀏覽器能接收的資源型別,其中text/* , image/* 或者 */ *表示所有
- Accept-Language:表示瀏覽器偏好的語言
- Accept-Encoding:表示瀏覽器可以支持的壓縮型別,類如gzip,deflate等
GET請求和POST請求的區別:
- GET請求請求引數在請求行中,沒有請求體;但是POST請求請求引數在請求體中
- GET請求請求引數有限制,但是POST沒有
下面給出GET和POST兩個例子:
GET請求資料格式
GET/HTTP/1.1
Host:www.itcast.cn
Connection:keep-alive
Cache-Control:max-age=0 Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0Chrome/91.0.4472.106
......
POST請求資料格式
POST/HTTP/1.1
Host:www.itcast.cn
Connection:keep-alive
Cache-Control:max-age=0 Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0Chrome/91.0.4472.106
username=superbaby&password=123456
HTTP回應資料格式
回應資料分為三部分:
- 回應行:回應資料的第一行;其中HTTP/1.1表示協議版本,200表示回應狀態碼,OK表示狀態碼描述
- 回應頭:第二行開始,格式為key:value形式
- 回應體:最后一部分,存放回應資料
常見HTTP回應頭:
- Content-Type:表示該回應內容的型別,類如text/html/image/jpeg
- Content-Length:表示該回應內容的長度(位元組數)
- Content-Encoding:表示該回應壓縮演算法,例如gzip
- Cache-Control:指示客戶端應如何快取,例如max-age=300,表示最多可以快取300s
下面給出HTTP回應例子:
HTTP/1.1 200 OK
Server:Tengine
Content-Type:text/html
Transfer-Encoding:chunked...
<html>
<head>
<title></titile>
</head>
<body>
</body>
</html>
重要狀態碼:
| 狀態碼分類 | 說明 |
|---|---|
| 1xx | 回應中——臨時狀態碼,表示請求已經接受,告訴客戶端應該繼續請求或者如果它已經完成則忽略它 |
| 2xx | 成功——表示請求已經被成功接收,處理已經完成 |
| 3xx | 重定位——重定義到其他地方;它讓客戶端再發起一個請求已完成整個處理 |
| 4xx | 客戶端錯誤——處理發生錯誤,責任在客戶端,如:客戶端請求一個不存在的資源 |
| 5xx | 服務器端錯誤——處理發生錯誤,責任在服務端,如:服務端拋出例外,路由出錯,HTTP版本不支持 |
| 狀態碼 | 英文描述 | 解釋 |
|---|---|---|
| 200 | OK | 客戶端請求成功,處理成功 |
| 404 | NOT FOUND | 請求資源不存在,通常為url錯誤或資源被洗掉 |
| 500 | Internal Server Error | 服務器發生不可預期的錯誤,服務器出現例外,可以查看日志 |
狀態碼大全:HTTP 狀態碼 | 菜鳥教程 (runoob.com)
Tomcat
首先我們知道Tomcat是Web服務器的一種,那么我們從頭介紹:
- Web服務器屬于一個應用程式,對HTTP協議的操作進行封裝,使得程式員不必直接對協議進行操作,讓Web開發更加便捷,
- 其主要功能是“提供網上資訊瀏覽服務”,
然后我們對Tomcat做出一個簡單解釋:
- Tomcat是Apache軟體基金會的一個核心專案,是一個開源免費的輕量級Web服務器,支持Servlet/JSP少量JavaEE規范
- JavaEE:Java企業版,指Java企業級開發的技術規范總和,包含13門技術:JDBC,JSP,XML,Servlet等
- Tomcat也被稱為Web容器;Servlet需要依賴Tomcat才能運行
- 官網:Apache Tomcat? - Welcome!
通俗來講,我們自制的HTML網頁通常只能在自己電腦上使用
如果我們希望將該網頁上傳到網路上被其他人閱讀,就需要書寫HTTP等原本不屬于該網頁的制造代碼
但是我們可以通過Web服務器(Tomcat等)來省略HTTP內容書寫的程序,直接將該網頁上傳至網路被其他人閱讀
Tomcat下載
Tomcat下載流程:
- 下載:官網下載即可(示例Tomcat為Tomcat8)
- 安裝:綠色版本,直接安裝即可(推薦安裝在無漢字無空格的檔案目錄下)
- 啟動:雙擊bin\startup.bat即為啟動
Tomcat關閉流程:
- 強制關閉:直接按×關閉即可
- 正常關閉:雙擊bin\shutdown.bat 或者 在cmd控制面板使用ctrl+c
我們給出Tomcat的檔案目錄展示并解釋:

我們對檔案夾進行解釋翻譯:
- bin:可執行檔案存放目錄
- conf:組態檔存放目錄
- lib:jar包存放目錄
- logs:日志檔案
- temp:臨時檔案
- webapps:應用發布目錄(我們把需要編譯的檔案放置在該檔案夾下,在啟動后,就可以在網頁中直接搜索)
- work:作業目錄
Tomcat配置與專案部署
Tomcat的配置主要是修改埠號:
我們在conf/server.xml中找到如下代碼,修改port埠號即可
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
注意:HTTP協議默認埠號為80,如果將Tomcat埠號修改為80,則訪問時不需要輸入埠號
Tomcat部署專案:
將專案放在webapps目錄下,即為部署成功
注意:我們的檔案通常打包為war壓縮包,放置在webapps下后會自動解壓(加快速度)
IDEA創建Maven Web專案整體框架
首先我們先對Maven Web專案的整體框架進行解釋:

我們對檔案夾進行解釋翻譯:
- src:主目錄
- java:java代碼
- resources:資源檔案
- webapp:Web專案特有目錄
- html:HTML檔案目錄(可自定義)
- WEB-INF:Web專案核心目錄(必須這個名字)
- web.xml:Web專案組態檔
- test:測驗目錄
在檔案打包之后會創建一個target打包包,即為部署成功的JavaWeb專案包:
- 編譯后的Java位元組碼檔案和resources資源檔案,放到WEB-INF下的class目錄下
- pom.xml中依賴坐標對應的jar包會放到WEB-INF下的lib目錄下
IDEA創建Maven Web專案
創建方法分為使用骨架和不使用骨架(骨架:專案模板)
- 使用骨架:
- 在創建專案中使用Maven Archetype,直接創建即可
- 在創建后,洗掉掉pom.xml中的多余坐標(只保留自身groupId即可)
- 需要補全main下的Java目錄和resources目錄
- 不使用骨架:
- 直接創建Maven專案
- 在pom.xml中的groupId中添加
war ,使其打包方法為war(默認為jar) - 補全webapp目錄
IDEA中使用Tomcat
我們如果在Tomcat的下載地址下上傳網頁,需要不停重繪Tomcat,所以我們希望在IDEA中使用Tomcat
- 集成本地Tomcat(IDEA完整版)
我們需要在IDEA中添加配置(Add)中添加Tomcat即可
- Tomcat Maven插件(Tomcat7版本之前)
直接在pom.xml中添加Tomcat插件
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<path>/</path>
<port>8080</port>
</configuration>
</plugin>
</plugins>
</build>
然后在Maven Helper插件中快速啟動專案,選中專案,右鍵-> Run Maven ->tomcat7:run
Servlet
最后我們介紹一下Servlet:
- Servlet是Java提供的一門動態Web資源開發技術
- Servlet是JavaEE規范之一,其實就是一個介面,將來我們需要定義Servlet類實作Servlet介面,并由Web服務器運行Servlet
如果說Tomcat是Java網頁與互聯網連接的一個框架,那么Servlet就是Java網頁在登陸互聯網后的動態資源
Servlet入門
下面我們通過一個簡單的步驟來介紹Servlet的使用程序:
- 創建Web專案,在pom.xml中匯入Servlet依賴坐標
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>web-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<!-- servlet依賴坐標 -->
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- tomcat 插件 為了方便使用 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>
</project>
- 在Java檔案夾下創建一個類,并實作Servlet介面,重寫所有方法
package com.itheima.web;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/demo1")
public class ServletDemo1 implements Servlet {
// service 在每次開啟網頁后都會啟動一次(是主要代碼)
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("servlet hello world~");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
@Override
public void init(ServletConfig config) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;package com.itheima.web;
- 在類上方使用@WebServlet注解,配置該Servlet的訪問路徑
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
// 這里使用注解,后面括號內為訪問路徑
@WebServlet("/demo1")
public class ServletDemo1 implements Servlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("servlet hello world~");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
@Override
public void init(ServletConfig config) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
}
}
}
- 訪問:啟動Tomcat,輸入URL即可訪問,并且觸動Servlet中的service方法
// /web-demo 是Web專案名稱
// /demo1是配置訪問路徑
http://localhost:8080/web-demo/demo1
Servlet生命周期
在分析執行流程前,我們先明白兩個問題:
- Servlet由Web服務器創建,Servlet方法由Web服務器呼叫
- 因為我們自定義的Servlet,必須實作Servlet介面并復寫其方法,所以Servlet介面中必定存在service方法
生命周期概念:
- 生命周期:指一個物件從被創建到被銷毀的全程序
Servlet生命周期:
- 加載和實體化:
- 默認情況下,當Servlet第一次被訪問時,由容器創建Servlet物件
- 初始化:
- 在Servlet實體化之后,容器將呼叫Servlet的init()方法初始化這個物件,完成一些如加載組態檔,創建連接等初始化的作業,該方法只呼叫一次!
- 請求處理:
- 每次請求Servlet時,Servlet容器都會呼叫Service方法來對請求進行處理
- 服務終止:
- 當需要釋放記憶體或容器關閉時,容器就會呼叫Servlet實體的destroy()方法完成資源的釋放;在destroy方法呼叫之后,容器會釋放這個Servlet實體,該實體隨后會被Java的垃圾收集器回收
注意:@WebServlet(urlPatterns = “/demo1”,loadOnStartup = 1)
loadOnStartup:當為負整數,表示第一次被訪問時創建;當為正整數或0,表示服務器啟動時創建,數字越小優先級越高
Servlet方法介紹
Servlet存在五種方法,我們在代碼中進行介紹:
package com.itheima.web;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/**
* Servlet 生命周期方法
*/
@WebServlet(urlPatterns="/demo2",loadOnStartup = 1)
public class ServletDemo2 implements Servlet {
/**
* 初始化方法
* 1. 呼叫時機:默認情況下,Servlet被第一次訪問時,呼叫
* * loadOnStartup:
* 2. 呼叫次數:1次
* @param config
* @throws ServletException
*/
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init...");
}
/**
* 提供服務
* 1. 呼叫時機:每一次Servlet被訪問時,呼叫
* 2. 呼叫次數:多次
*
*
* @param req
* @param res
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("servlet hello world~");
}
/**
* 銷毀方法
* 1. 呼叫時機:記憶體釋放或者服務器關閉的時候,Servlet物件會被銷毀,呼叫
* 2. 呼叫次數:1次
*/
@Override
public void destroy() {
System.out.println("destroy...");
}
// 用于獲取Servlet的具體資訊
@Override
public String getServletInfo() {
return null;
}
// 用于獲取ServletConfig物件
@Override
public ServletConfig getServletConfig() {
return null;
}
}
Servlet體系結構
Servlet屬于最高級根介面,為了更加契合HTTP的使用
我們又以Servlet創建了GennericServlet類,再以GennericServlet類為模板創建了HTTPServlet類
在這部分我們將介紹HTTPServlet類:
- 我們的B/S構架的Web的開發,都是針對HTTP協議的,所以我們自定義的Servlet類可以繼承HTTPServlet類
HTTPServlet使用步驟:
- 繼承HTTPServlet類
- 重寫doGet和doPost方法
HttpServlet原理:
- 獲得請求方式,并根據不同請求方法,呼叫不同的do方法
我們給出一個具體實體:
package com.itheima.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/demo4")
public class ServletDemo4 extends HttpServlet {
// HTTPServlet根據其請求的GET或POST方法提供不同的回傳資訊
@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...");
}
}
Servlet urlPattern配置
Servlet如果想被訪問,就必須要配置urlPattern資訊(訪問路徑)
首先我們闡明一個道理:
- 一個Servlet,可以配置多個urlPattern
@WebServlet(urlPattern = {"/demo1","/demo2"})
然后我們介紹Servlet的urlPattern匹配規則:
- 精準匹配
// Java原始碼
@WebServlet(urlPattern = "/user/select")
// 查詢網站
localhost8080/web-demo/user/select
- 目錄匹配
// Java原始碼
@WebServlet(urlPattern = "/user/*")
// 查詢網站
localhost8080/web-demo/user/aaa
localhost8080/web-demo/user/bbb
- 擴展名匹配
// Java原始碼
@WebServlet(urlPattern = "*.do")
// 查詢網站
localhost8080/web-demo/aaa.do
localhost8080/web-demo/bbb.do
- 任意匹配
// Java原始碼
@WebServlet(urlPattern = "/")
@WebServlet(urlPattern = "/*")
// 查詢網站
localhost8080/web-demo/hehe
localhost8080/web-demo/haha
/*
介紹一下 / 和 /* 區別:
/*: 可以匹配任意訪問路徑
/: 當我們的專案中配置了"/"后,會覆寫掉tomcat中的DefaultServlet,這樣就會導致你的靜態內容(html)都無法被訪問,所以盡量不要使用
*/
優先級:精確路徑 > 目錄路徑 > 擴展名路徑 > /* > /
XML配置方法撰寫Servlet
Servlet在3.0版本后才可以使用注解配置(@注解)
在3.0版本之前我們需要采用XML組態檔的配置方法
配置方法:
- 撰寫Servlet類
- 在web.xml中配置該Servlet
<?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 全類名
-->
<servlet>
<servlet-name>demo13</servlet-name>
<servlet-class>com.itheima.web.ServletDemo13</servlet-class>
</servlet>
<!--
Servlet 訪問路徑
-->
<servlet-mapping>
<servlet-name>demo13</servlet-name>
<url-pattern>/demo13</url-pattern>
</servlet-mapping>
</web-app>
結束語
好的, 關于JavaWeb的第一期就到這里,具體介紹了HTTP,Tomcat和Servlet三門技術
下一期將會介紹Request和Response以及案例介紹
附錄
該文章屬于學習內容,具體參考B站黑馬程式員陳老師的JavaWeb課程
這里附上鏈接:01-Web核心介紹_嗶哩嗶哩_bilibili
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/505978.html
標籤:其他
