Web: World Wide Web (www) とも呼ばれるグローバル ワイド エリア ネットワークで、ブラウザからアクセスできる Web サイトです。
JavaWeb: Java技術を利用して関連するウェブとインターネット分野を解決する技術スタックです
Java Web テクノロジースタック
-
B/S アーキテクチャ: ブラウザ/サーバー、ブラウザ/サーバー アーキテクチャ モード、その特徴は、クライアントがブラウザのみを必要とし、アプリケーションのロジックとデータがサーバーに格納されることです。ブラウザーは、Web リソースを取得するためにサーバーに要求するだけでよく、サーバーは Web リソースをブラウザーに送信します。
利点: 保守とアップグレードが容易: サーバーのアップグレード後、クライアントはデプロイメントなしで新しいバージョンを使用できます。
-
静的リソース: HTML、CSS、JavaScript、画像など。ページ表示担当
-
動的リソース: サーブレット、JSP など。ロジック処理担当
-
データベース: データの保存を担当
-
HTTP プロトコル: 通信ルールを定義する
-
Web サーバー: HTTP プロトコルの解析、要求データの解析、および応答データの送信を担当します。
HTTP
コンセプト: HyperText Transfer Protocol、ハイパーテキスト転送プロトコルは、ブラウザとサーバー間のデータ転送のルールを指定します
HTTP プロトコル機能:
- TCP プロトコルに基づく: 接続指向、安全
- 要求応答モデルに基づく: 要求は応答に対応します
- HTTP プロトコルはステートレス プロトコルです。トランザクション処理用のメモリはありません。各要求応答は独立しています。
- デメリット: 複数のリクエスト間でデータを共有できない。この問題を解決するには、Java のセッション技術 (Cookie、Session) を使用します。
- 利点: 速い
HTTP リクエストのデータ形式
リクエスト データは 3 つの部分に分かれています。
- リクエスト行: リクエスト データの最初の行。このうち、GET はリクエスト メソッドを示し、/ はリクエスト リソース パスを示し、HTTP/1.1 はプロトコル バージョンを示します。
- リクエストヘッダー: 2 行目以降はキー:値の形式です。
- リクエスト ボディ: POST リクエストの最後の部分で、リクエスト パラメータを格納します。
GET / HTTP/1.1
ホスト: www.itcast.cn
接続: キープアライブ
ユーザーエージェント: Mozilla/5.0 Chrome/91.0.4472.106
…
ポスト/HTTP/1.1
ホスト: www.itcast.cn
接続: キープアライブ
キャッシュ制御: max-age=0 Upgrade-Insecure-Requests: 1
ユーザーエージェント: Mozilla/5.0 Chrome/91.0.4472.106
ユーザー名=スーパーベイビー&パスワード=123456
GET リクエストと POST リクエストの違い:
-
GET リクエストのリクエスト パラメータはリクエスト ラインにあり、リクエスト ボディはありません。
リクエスト本文の POST リクエストのリクエスト パラメータ
-
GET リクエストのリクエスト パラメータのサイズは制限されています。
ポスト番号
一般的な HTTP リクエスト ヘッダー:
- ホスト: 要求されたホスト名を示します
- User-Agent: ブラウザのバージョン。たとえば、Chrome ブラウザのロゴは Mozilla/5.0 ... Chrome/79 に似ており、IE ブラウザのロゴは Gecko のように Mozilla/5.0 (Windows NT ...) に似ています。
- Accept: text/*、image/、または/* はすべてを意味するなど、ブラウザーが受け取ることができるリソースの種類を示します。
- Accept-Language: ブラウザーが優先する言語を示し、サーバーはそれに応じてさまざまな言語で Web ページを返すことができます。
- Accept-Encoding: gzip、deflate など、ブラウザでサポートされている圧縮タイプを示します。
HTTP 応答データ形式
応答データは 3 つの部分に分かれています。
- 応答行: 応答データの最初の行。このうち、HTTP/1.1 はプロトコル バージョン、200 はレスポンス ステータス コード、OK はステータス コードの説明を示します。
- 応答ヘッダー: 2 行目から、形式は key: value です
- レスポンスボディ: 最後の部分。応答データを保存する
HTTP/1.1 200 OK
サーバー: Tengine
コンテンツタイプ: text/html
Transfer-Encoding: チャンク…
<html>
<頭>
<タイトル></タイトル>
</head>
<本文></本文>
</html>
一般的な HTTP 応答ヘッダー:
- Content-Type: text/html、image/jpeg などの応答コンテンツのタイプを示します。
- Content-Length: 応答コンテンツの長さ (バイト数) を示します。
- Content-Encoding: gzip などの応答圧縮アルゴリズムを示します。
- Cache-Control: クライアントがキャッシュする方法を示します。たとえば、max-age=300 は最大 300 秒間キャッシュできることを意味します。
Web サーバー - Tomcat
ウェブサーバー
Web サーバーは、HTTP プロトコルの操作をカプセル化したアプリケーション プログラム (ソフトウェア) であるため、プログラマーはプロトコルを直接操作する必要がなく、Web 開発がより便利になります。主な機能は「オンライン情報閲覧サービスの提供」です。
トムキャット
序章
- コンセプト: Tomcat は、Apache Software Foundation のコア プロジェクトであり、サーブレット/ISP 向けの少数の JavaEE 仕様をサポートする、オープン ソースで無料の軽量 Web サーバーです。
- JavaEE: Java エンタープライズ エディション、Java エンタープライズ エディション。Java エンタープライズ レベル開発の技術仕様の概要を指します。JDBC、JNDI、EJB、RMI、JSP、サーブレット、XML、JMS、Java lDL、JTS、JTA、JavaMail、JAF の 13 の技術仕様が含まれています。
- Tomcat は、Web コンテナー、サーブレット コンテナーとも呼ばれます。サーブレットは Tomcat に依存して実行する必要がある
- 公式サイト: https: //tomcat.apache.org/
基本的な使用法: プロジェクトのインストール、アンインストール、開始、シャットダウン、構成、デプロイ
-
ダウンロード:公式サイトダウンロード
-
インストール: グリーン版、直接解凍するだけ
-
アンインストール: ディレクトリを直接削除するだけです
-
開始: ダブルクリック: bin\startup.bat
-
Tomcat の出力ログのエンコーディングは UTF-8 ですが、Windows コンソールのエンコーディングは GBK であり、一般的に文字化けが発生します。
conf/logging.properties を変更します
java.util.logging.ConsoleHandler.encoding = GBK
-
-
閉鎖:
- 実行中のウィンドウから直接 × : 強制的に閉じる
- bin\shutdown.bat: 正常なシャットダウン
- Ctrl+C: 通常のシャットダウン
-
構成:
起動ポート番号を変更します: conf/server.xml
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
注: HTTP プロトコルのデフォルトのポート番号は 80 です。Tomcat のポート番号を 80 に変更すると、今後 Tomcat にアクセスするときにポート番号を入力する必要がなくなります。
-
Tomcat 展開プロジェクト:
プロジェクトを webapps ディレクトリに配置すると、デプロイが完了します
通常、JavaWeb プロジェクトは war パッケージにパッケージ化され、war パッケージが webapps ディレクトリに配置され、Tomcat が自動的に war ファイルを解凍します。
IDEA で Maven Web プロジェクトを作成する
Web プロジェクトの構造
Maven Web プロジェクトの構造: 開発中のプロジェクト:
デプロイされた JavaWeb プロジェクトの構造: 開発が完了した後にデプロイできるプロジェクト:
- コンパイルされた Java バイトコード ファイルとリソース リソース ファイルは、WEB-INF の下のクラス ディレクトリに配置されます。
- pom.xml の依存座標に対応する jar パッケージは、WEB-INF の下の lib ディレクトリに配置されます。
スケルトンを使用して作成
スケルトン: プロジェクト テンプレート
新しいプロジェクトまたはモジュールを作成し、Maven Archetype をクリックして、Archetype で選択します。
org.apache.maven.archetypes:maven-archetype-webapp
[作成] をクリックして作成を完了します。
main の下に Java ディレクトリがないことがわかります。main、New、Directory を右クリックし、Java を直接選択します。
スケルトンの作成には適していません
新しいプロジェクトまたはモジュールを作成します: File->New -> Module… または Project…
ここでモジュールを作成し、[New Module] を選択して、[Build System] に [Maven] を選択します。
[作成] をクリックして作成を完了します。
次に、pom.xml にパッケージング メソッドを記述します。
<packaging>war</packaging>
次に、webapp ディレクトリを作成するために、手動または自動で作成できます。
自動作成: プロジェクト構造を開き、[ファセット] を選択し、[Web] を右クリックして [追加] をクリックし、[Web] を選択して、作成したばかりのプロジェクトを選択します。
デプロイメント記述子のパスを変更します。
Web リソース ディレクトリのパスを変更します。
[適用] をクリックし、[OK] をクリックします。
IDEA で Tomcat を使用する
Tomcat を IDEA に統合する方法は 2 つあります。つまり、ローカルの TomcatとTomcat Maven プラグインを統合する方法です。
ローカル Tomcat を統合する
[構成の編集...] をクリックし、[+] 記号をクリックして、[Tomcat サーバー、ローカル] を選択します。
Application server の後に configure... をクリックし、Tomcat Home のパスを選択します。[OK] をクリックします。
次は展開です。展開に切り替えます。[Deploy at the server startup] の下の + 記号をクリックし、[Artifact...] をクリックして tomcat-deom:war を選択します。
最後に、[適用] をクリックし、[OK] をクリックして完了します。
Tomcat Maven プラグイン
Tomcat プラグインを pom.xml に追加します。ショートカット キー alt+(fn)+ins(ert) を使用できます。
<build>
<finalName>tomcat-deom</finalName>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>
プロジェクトで、右クリック -> Maven の実行 -> tomcat7:run で実行します
現在、Maven Tomcat プラグインには Tomcat7 バージョンのみがあり、それ以上のバージョンは使用できません
Maven Tomcat プラグインを使用して、Tomcat のポートとアクセス パスを変更する場合は、pom.xml を直接変更できます。
<build>
<finalName>tomcat-deom</finalName>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8000</port><!--访问端口号 -->
<!--项目访问路径-->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
サーブレット
サーブレットは JavaWeb のコアコンテンツであり、Java が提供する動的な Web リソース開発技術です。
Servlet は JavaEE 仕様の 1 つで、実際にはインターフェースです. 将来的には Servlet クラスを定義して Servlet インターフェースを実装し、Web サーバーで Servlet を実行する必要があります.
クイックスタート
-
Web プロジェクトを作成し、サーブレットの依存関係座標をインポートする
... <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <!-- provided指的是在编译和测试过程中有效,最后生成的war包时不会加入 因为Tomcat的lib目录中已经有servlet-api这个jar包,如果在生成war包的时候生效就会和Tomcat中的jar包冲突,导致报错 --> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>web-demo</finalName> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin> </plugins> </build> </project>
-
作成: クラスを定義し、Servlet インターフェースを実装し、インターフェース内のすべてのメソッドを書き換え、サービス メソッド内に文を出力する
public class ServletDemo1 implements Servlet { public void init(ServletConfig servletConfig) throws ServletException { } public ServletConfig getServletConfig() { return null; } public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("Servlet:Hello World!"); } public String getServletInfo() { return null; } public void destroy() { } }
-
構成: クラスで @WebServlet アノテーションを使用して、サーブレットのアクセス パスを構成します。
@WebServlet("/demo1") public class ServletDemo1 implements Servlet { public void init(ServletConfig servletConfig) throws ServletException { } ... }
-
アクセス: Tomcat を起動し、ブラウザに URL を入力してサーブレットにアクセスします。
サーブレットの実行プロセス
- ブラウザはリクエストを送信し、コンテンツの 3 つの部分、つまり、、、
http://localhost:8080/web-demo/demo1
をリクエストから解析できます。localhost:8080
web-demo
demo1
localhost:8080
アクセスするTomcat Webサーバーは、次のように見つけることができますweb-demo
Tomcat サーバーにデプロイされた web-demo プロジェクトによると、見つけることができます。demo1
プロジェクト内のどのサーブレット クラスにアクセスできるかによって、@WebServlet の後ろの値に従って一致します。
- ServletDemo1 クラスを見つけると、Tomcat Web サーバーは ServletDemo1 クラスのオブジェクトを作成し、オブジェクトのサービス メソッドを呼び出します。
- サービス メソッドには、ServletRequest と ServletResponse の 2 つのパラメーターがあり、ServletRequest は要求データをカプセル化し、ServletResponse は応答データをカプセル化します。
サーブレットのライフサイクル
ライフ サイクル: オブジェクトのライフ サイクルは、オブジェクトの作成から破棄までのプロセス全体を指します。
サーブレットはサーブレット コンテナー (Web サーバー) で実行され、そのライフ サイクルはコンテナーによって管理されます。コンテナーは次の 4 つの段階に分けられます。
-
読み込みとインスタンス化: デフォルトでは、サーブレットが初めてアクセスされると、コンテナによってサーブレット オブジェクトが作成されます。
デフォルトでは、最初のアクセス時にコンテナによってサーブレットが作成されます。
サーバーの起動時にサーブレットを作成することもできます。
/* loadOnstartup的取值有两类情况 (1)负整数:第一次访问时创建Servlet对象 (2)0或正整数:服务器启动时创建Servlet对象,数字越小优先级越高 */ @WebServlet(urlPatterns = "/demo1",loadOnStartup = 1)
-
初期化: サーブレットがインスタンス化された後、コンテナーはサーブレットの init() メソッドを呼び出してオブジェクトを初期化し、構成ファイルのロードや接続の作成などの初期化タスクを完了します。このメソッドは一度だけ呼び出されます
-
リクエスト処理: サーブレットがリクエストされるたびに、サーブレット コンテナはサーブレットの service() メソッドを呼び出してリクエストを処理します。
-
サービスの終了: メモリを解放する必要がある場合、またはコンテナーを閉じる必要がある場合、コンテナーはサーブレット インスタンスの destroy() メソッドを呼び出して、リソースの解放を完了します。destroy() メソッドが呼び出された後、コンテナーはサーブレット インスタンスを解放し、Java のガベージ コレクターによって再利用されます。
ターミナル コマンド ラインでは、mvn tomcat7:run
スタートアップを使用してから、ctrl+c
シャットダウン tomcat を使用できます。
package com.xlr.web;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet(urlPatterns = "/demo2",loadOnStartup = 1)
public class ServletDemo2 implements Servlet {
/**
* 初始化方法
* 1.调用时机:默认情况下,Servlet被第一次访问时,调用
* * loadOnStartup: 默认为-1,修改为0或者正整数,则会在服务器启动的时候,调用
* 2.调用次数: 1次
*/
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init...");
}
public ServletConfig getServletConfig() {
return null;
}
/**
* 提供服务
* 1.调用时机:每一次Servlet被访问时,调用
* 2.调用次数: 多次
*/
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Servlet:Hello World!");
}
public String getServletInfo() {
return null;
}
/**
* 销毁方法
* 1.调用时机:内存释放或者服务器关闭的时候,Servlet对象会被销毁,调用
* 2.调用次数: 1次
*/
public void destroy() {
System.out.println("destroy");
}
}
サーブレット方式
- サーブレットの作成時に実行される、一度だけ実行される初期化メソッド
void init(ServletConfig servletConfig)
- サーブレットにアクセスするたびに呼び出されるサービス メソッドを提供する
void service(ServletRequest servletRequest, ServletResponse servletResponse)
- Destroy メソッドは、サーブレットが破棄されるときにこのメソッドが呼び出されます。メモリの割り当て解除またはサーバーのシャットダウン時にサーブレットを破棄する
void destroy()
残りの 2 つの方法は次のとおりです。
- サーブレット情報を取得する
String getServletInfo()
//该方法用来返回Servlet的相关信息,没有什么太大的用处,一般我们返回一个空字符串即可
public String getServletInfo() {
return "";
}
- ServletConfig オブジェクトを取得する
ServletConfig getServletConfig()
サーブレット アーキテクチャ
将来的には B/S アーキテクチャの Web プロジェクトをすべて HTTP プロトコルで開発する予定なので、HttpServlet を継承してサーブレットをカスタマイズします。
@WebServlet("/demo4")
public class ServletDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//TODO GET 请求方式处理逻辑
System.out.println("get");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//TODO POST 请求方式处理逻辑
System.out.println("post");
}
}
-
GETリクエストを送信してサーブレットをリクエストしたい場合は、ブラウザ経由で送信するだけで
http://localhost:8080/web-demo/demo4
、doGetメソッドが実行されることがわかります -
POST リクエストを送信するには、フォーム フォームを作成してリクエストを送信し、
a.html
webapp の下に次の内容のページを作成する必要があります。<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/web-demo/demo4" method="post"> <input name="username"><input type="submit"> </form> </body> </html>
テストを開始すると、doPost メソッドが実行されていることがわかります。
フロント エンドが GET リクエストと POST リクエストを送信するとき、パラメーターの位置が矛盾しています. GET リクエスト パラメーターはリクエスト行にあり、POST リクエスト パラメーターはリクエスト ボディにあります. 異なるリクエストメソッドに対応するには、サービスメソッドで判断して、異なるビジネス処理を書く必要があります。
@WebServlet(urlPatterns = "/demo5",loadOnStartup = 1)
public class ServletDemo5 implements Servlet {
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init...");
}
public ServletConfig getServletConfig() {
return null;
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//获取请求方式,根据不同的请求方式进行不同的业务处理
HttpServletRequest request = (HttpServletRequest) servletRequest;
//1. 获取请求方式
String method = request.getMethod();
//2. 判断
if ("GET".equals(method)) {
// get方式处理逻辑
} else if ("POST".equals(method)) {
// get方式处理逻辑
}
}
public String getServletInfo() {
return null;
}
public void destroy() {
System.out.println("destroy");
}
}
コード開発を簡素化するために、サーブレット インターフェイスを継承してカプセル化できます。
package com.xlr.web;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class MyHttpServlet implements Servlet {
public void init(ServletConfig servletConfig) throws ServletException {
}
public ServletConfig getServletConfig() {
return null;
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//获取请求方式,根据不同的请求方式进行不同的业务处理
HttpServletRequest request = (HttpServletRequest) servletRequest;
//1. 获取请求方式
String method = request.getMethod();
//2. 判断
if ("GET".equals(method)) {
// get方式处理逻辑
doGet(request,servletResponse);
} else if ("POST".equals(method)) {
// get方式处理逻辑
doPost(request,servletResponse);
}
}
protected void doPost(ServletRequest req, ServletResponse res) {
}
protected void doGet(ServletRequest req, ServletResponse res) {
}
public String getServletInfo() {
return null;
}
public void destroy() {
}
}
MyHttpServlet クラスは、今後 Servlet クラスを作成する際に、MyHttpServlet を継承し、親クラスの doGet メソッドと doPost メソッドを書き換えて、GET および POST リクエストのビジネス ロジックを処理するだけで済みます。
package com.xlr.web;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
@WebServlet("/demo")
public class ServletDemo extends MyHttpServlet{
@Override
protected void doPost(ServletRequest req, ServletResponse res) {
System.out.println("post...");
}
@Override
protected void doGet(ServletRequest req, ServletResponse res) {
System.out.println("get...");
}
}
Servlet urlPattern配置
アクセスするには、サーブレットはそのアクセス パス (urlPattern) を構成する必要があります。
サーブレットは複数の urlPatterns で構成できます
@WebServlet(urlPatterns = {
"/demo","/demo0"})
urlPattern 構成ルール:
-
完全に一致
- 構成パス:
@WebServlet("/demo5")
- アクセスパス:
localhost:8030/web-demo/demo5
- 構成パス:
-
ディレクトリの一致
-
構成パス:
@WebServlet("/demo/*")
-
アクセスパス:
localhost:8030/web-demo/demo localhost:8030/web-demo/demo/abc localhost:8030/web-demo/demo/123 localhost:8030/web-demo/demo/abc/123
/*
ディレクトリへのゼロ以上のアクセス レベルを表し、完全一致の優先度はディレクトリ一致の優先度よりも高くなります。
-
-
延長戦
- 構成パス:
@WebServlet("*.do")
- アクセスパス:
localhost:8030/web-demo/abc.do localhost:8030/web-demo/123.do
- パス構成が拡張子でない場合は、パスの前に追加する必要があります
/
。そうしないと、エラーが報告されます - パス構成が の場合
*.do
、 *.do の前に追加できません/
。そうしないと、エラーが報告されます
- 構成パス:
-
任意の一致
-
構成パス:
@WebServlet("/") @WebServlet("/*")
-
アクセスパス:
localhost:8030/web-demo/abc localhost:8030/web-demo/123
プロジェクトのサーブレットが「/」で構成されている場合、Tomcat の DefaultServlet が上書きされます。
次のような静的リソースを要求するときに、デフォルトのサーブレット クラスではなくカスタム サーブレット クラスが発生します。
**DefaultServlet:** 他の URL パターンが一致しない場合にこのサーブレットを使用します
優先度は完全一致 > ディレクトリ一致 > 拡張子一致 > /* > /
-
XML 構成モードでサーブレットを作成する
サーブレットは、バージョン 3.0 以降のアノテーション構成をサポートしており、バージョン 3.0 より前の XML 構成ファイルの構成方法のみをサポートしています。
XML 構成手順には、次の 2 つの手順があります。
-
サーブレットクラスを書く
-
web.xml でサーブレットを構成する
<web-app> <display-name>Archetype Created Web Application</display-name> <!--Servleet全类名--> <servlet> <servlet-name>demo</servlet-name> <servlet-class>com.xlr.web.ServletDemo</servlet-class> </servlet> <!--Servlet访问路径--> <servlet-mapping> <!-- servlet的名称,要和上面的名称一致--> <servlet-name>demo</servlet-name> <url-pattern>/demo</url-pattern> </servlet-mapping> </web-app>