Webの基本
Webアプリケーションの基本構成
Webアプリケーションは通常、フロントエンド、バックエンド、データベース、Webサーバーなどのコンポーネントで構成されます。
-
**フロントエンド:ブラウザ内で動作し、ページの表示、ユーザーインタラクション、および一部のデータ処理を担当します。一般的なテクノロジには、HTML、CSS、Java Script、jQuery、Bootstrapがあります。
-
バックエンド:サーバー内で動作し、リクエストの受信、ビジネスの処理、データベースへのアクセス、結果の返しを担当します。Java Webの一般的な技術にはサーブレットとSpring MVCがある。
-
インターフェイス:リクエストアドレス、リクエストモード、パラメータフォーマット、レスポンスフォーマットを規約し、フロントとリアが連携できるようにします。
フロントとフロントの統合開発
フロントページとバックエンドプログラムは、同じプロジェクトまたは同じサーバーアプリケーションにデプロイされます。通常、サービスが開始されると、ページリソースとバックエンドインタフェースは一緒に動作します。
このパターンでは、バックエンドはビジネスデータの処理に加えて、ページジャンプとサーバーサイドのページレンダリングを担当することがあります。フロントエンドとバックエンドは、同じプロジェクト構造とページテンプレートに強く依存しているため、結合度は通常高くなります。
ログインページの例:

前後端の分離開発
フロントエンドとバックエンドは2つの比較的別々のアプリケーションとして開発およびデプロイされます。フロントエンドはページの表示、ユーザーインタラクション、ルーティングジャンプを担当し、バックエンドはビジネス処理とデータアクセスを担当します。
両者はインターフェイスドキュメントに従ってデータを交換し、一般的なデータ形式はJSONです。通常、フロントエンドはリクエストデータをバックエンドに送信し、バックエンドはJSON 結果を返し、フロントエンドは結果に基づいてページを更新します。
このパターンは、コードとデプロイメントへの直接依存を減らし、バックエンドの並列開発をサポートしますが、両者はインターフェイス規約に従う必要があります。

MVCの階層パターン
MVCはアプリケーションの責任をモデル、ビュー、コントローラに分割します。

Viewビューレイヤー
データの表示とユーザーアクションの受信を担当。フロントエンド統合プロジェクトでは、ビューはJSPまたはHTMLテンプレートであることができます。フロントエンド分離プロジェクトでは、ビューは通常、スタンドアロンのフロントエンドアプリケーションによって実装されます。
Controllerコントローラレイヤ
クライアントリクエストの受信、リクエストパラメータの読み取り、ビジネス層の呼び出し、処理結果のクライアントへの返却を担当します。
フロントエンド統合モードでは、コントローラはページビューを返します。フロントエンド分離モードでは、コントローラは通常、JSONデータを返します。
Modelモデルレイヤー
ビジネスデータと処理ロジックを担当します実際のJava Webプロジェクトは、通常、次のように分割され続けます。
-
Serviceレイヤビジネスロジックとトランザクションを処理します。 -
DAOまたはリポジトリ層データベースまたはその他のデータソースへのアクセス。
MVCは責任の分割を記述し、実際のプロジェクトの具体的な階層はフレームワークやビジネス規模に応じて調整できます。
Servlet API
サーブレットAPIは、HTTPリクエストの処理、HTTPレスポンスの生成、セッションの管理、WebアプリケーションコンテキストへのアクセスのためにJava Web 開発に必要な一連のインタフェースとクラスを提供する。
Maven 依存関係の追加
次の依存関係は、javax.servlet名前空間ベースのサーブレット4.0プロジェクトに適用されます。
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
providedは、コンパイル時にこの依存が必要であることを示しているが、ランタイムは通常 Tomcatなどのサーブレットコンテナによって提供される。
サーブレットの作成
サーブレットは注釈を介してURLパスとマッピングできます。クライアントが対応するパスにアクセスすると、サーブレットコンテナは対応するメソッドを呼び出します
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/test")
public class TestController extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 读取请求参数
// 调用业务层
// 将结果写入响应
System.out.println("客户端访问了 /test,执行了 TestController 的 service 方法");
}
}サーブレットインスタンスは通常、コンテナによって作成および管理されます。HTTPリクエストはリクエストオブジェクトとレスポンスオブジェクトのセットに対応しますが、複数のリクエストが同じサーブレットインスタンスによって処理される可能性があるため、単一のリクエストからのデータをサーブレットインスタンスフィールドに保存しないでください。
HttpServletRequestリクエストオブジェクト
HttpServletRequestは、クライアントが送信するHTTPリクエストをカプセル化します。一度リクエスト処理が終了すると、そのリクエストオブジェクトは通常使用されなくなります。
通常の操作は以下の通り
-
取得要求方法
request.getMethod()。 -
要求 URLの取得
request.getRequestURL()。 -
コンテキストパスの取得
request.getContextPath()。 -
要求ヘッダーを取得
request.getHeader("请求头名称")。 -
単一の要求パラメータを取得します
request.getParameter("参数名")。 -
同じ名前の複数のパラメータを取得します
request.getParameterValues("参数名")。 -
要求範囲属性
request.setAttribute("name", value)を保存します。 -
要求範囲属性の読み取り
request.getAttribute("name")。
リクエスト属性は、サーバ内転送時にデータを渡すためによく使用され、そのライフサイクルは通常現在のリクエストのみを上書きします。
HttpServletResponse応答オブジェクト
HttpServletResponseは、ステータスコード、レスポンスヘッダ、文字エンコーディング、レスポンスボディを設定するために使用されます。
response.setContentType("text/plain;charset=UTF-8");
response.getWriter().write("响应给浏览器的数据");
通常の操作は以下の通り
-
レスポンスステータスコードを設定します。
-
Response Headerを設定する
-
応答コンテンツタイプと文字エンコーディングを設定します。
-
文字ストリームまたはバイトストリームでレスポンスボディを書き込みます。
-
Redirectの実行
HttpSessionセッション·オブジェクト
HttpSessionは、クライアントセッションに関連するデータをサーバ側で保持するために使用されます。request.getSession()が最初に呼び出されたときに、現在のセッションが存在しない場合、コンテナは通常新しいセッションを作成します。
HttpSession session = request.getSession();
session.setAttribute("test", "test");
Object value = session.getAttribute("test");
ブラウザは通常、セッションクッキーを介してセッションIDを運び、後続のリクエストを同じHttpSessionに関連付けることができます。
セッションは、タイムアウト、アクティブな無効化、またはサーバー処理の後に破棄されます。タイムアウト時間はサーバーまたはアプリケーションの構成によって決まり、20 分に固定されません。
Cookie
クッキーとは、サーバーからブラウザに送信され、ブラウザがルールに従って保存する小さなデータです。ブラウザーが一致するアドレスにアクセスすると、リクエストとともにクッキーをサーバーに送信できます。
クライアントにCookieを书き込む
Cookie cookie = new Cookie("username", "tom");
cookie.setMaxAge(3600);
response.addCookie(cookie);
リクエストからのCookieの読み取り
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
System.out.println(cookie.getName());
System.out.println(cookie.getValue());
}
}
クッキーは、セッション識別、環境設定などの情報を保存するためによく使われます。クリアテキストパスワードなどの機密データをクッキーに直接保存しないでください。認証情報は、HttpOnly、Secure、SameSiteなどのセキュリティ属性とサーバー側検証メカニズムと組み合わせる必要があります。
ServletContextアプリケーションコンテキスト
ServletContextは、現在のWebアプリケーションの実行コンテキストを表します。通常、アプリケーションの開始時に作成され、アプリケーションの停止時に破棄されます。同じWebアプリケーションには通常 1つのServletContextしかありません。
ServletContext context = getServletContext();
context.setAttribute("name", "abcde");
Object value = context.getAttribute("name");
アプリケーションスコープのプロパティは、同じWebアプリケーション内の複数のサーブレットおよび複数のリクエストで共有できます。複数のスレッドから同時にアクセスされる可能性があるため、可変共有データを保存する際にはスレッドセーフを考慮する必要がある。
共通のスコープ比較
| オブジェクト | 標準範囲 | 一般的な用途 |
|---|---|---|
ServletRequest | 1つのリクエスト | データの転送、現在のリクエスト処理結果の保存 |
Session | 1つのクライアントセッション | ログインステータス、セッションレベルのユーザーデータ |
ServletContext | Webアプリケーション全体 | アプリケーションレベルの共有構成または共通データ |
| Cookie(クッキー) | ブラウザ規則による保存[ぶらうざじゅんにほぞん] | セッション識別、ユーザー設定などの少量のデータ |
気に入ったならばコメントを残してくださいね~