JavaServlet

勉強中のため自分用のアプリケーションです。
Eclipseを使用してます:desktop:

## Java Servlet
Javaのプログラムの一種で、主にWebアプリケーションでサーバーサイド処理を行う為の技術。

## 主な役割
**・リクエスト処理**
クライアントから送信されたデータを受け取る　

**・ビジネスロック実行**
サーバーサイドの処理(データベース操作)を行う。

**・レスポンス作成**
処理結果を基にクライアントにデータを返すHTML, JSON, XMLなど）。

## メリット
**・プラットフォームに依存しない**
javaで実装されているため、javaが動作するプラットフォームであればどこでも動かすことができる。Windows、Linux、macOSなど様々な環境で動作できる

**・ライフリサイクル管理が容易**
ライフリサイクル(生成→初期化→リクエスト処理→破棄)は、サーバが自動的に管理。リソース管理やエラーハンドリングがシンプルになる。

**・セキュリティ**
Javaのセキュリティ機能を活用することで、安全なWebアプリケーションを構築できる

**スケーラビリティ**
Servletはマルチスレッド対応で、多くのリクエストを効率的に処理する設計。複数のクライアントリクエストを並行して処理できる。


## コード作成
こんにちは　と表示されるように作成
Eclipesを使用しているので、web.xmlは自動作成を利用してます。
```HelloServlet.java
//必要なインポート文を記述

import java.io.IOException;// IO操作に関する例外処理をサポートするクラスをインポート
import java.io.PrintWriter;//出力用にPrintWriterインポート

import jakarta.servlet.ServletException;// サーブレットで発生する例外をサポートするクラスをインポート
import jakarta.servlet.annotation.WebServlet;// サーブレットをURLにマッピングするためのアノテーションをインポート
import jakarta.servlet.http.HttpServlet;// サーブレットの基本クラスをインポート
import jakarta.servlet.http.HttpServletRequest;// クライアントからのHTTPリクエスト情報を扱うクラスをインポート
import jakarta.servlet.http.HttpServletResponse;// サーバーからのHTTPレスポンス情報を扱うクラスをインポート

//アノテーションを使ってURLパターンを指定
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	    //レスポンのコンテンツタイプをHTMLに設定し、文字エンコーディングをUTF-8に指定
		response.setContentType("text/html; charset=UTF-8");
    	//レスポンスに書き込むためのPrintWriterオブジェクトを取得
		PrintWriter pw = response.getWriter();
		//こんにちはト表示させるためのHTMLの記述
        pw.println("<html><head><title>HelloServlet></title></head>");
		pw.println("<body>");
		pw.println("<h1>こんにちは</h1>");
		pw.println("</body></html>");
		pw.close();
	}
}
```


## サーブレットにおけるリクエストとレスポンス
**リクエストオブジェクト (HttpServletRequest):**
・クライアントから送信されたリクエスト情報(メソッド、パラメーター、ヘッダー、ボディなど)を保持
・サーブレットはこのオブジェクトを使って、クライアントの要求を取得

**レスポンスオブジェクト (HttpServletResponse):**
・サーバがクライアントに返すレスポンス情報を保持
・サーブレットはこのオブジェクトを使って、レスポンスのステータスコードを設定したり、出力データ(HTML,JSON) をクライアントに送信

## フォームのデータ送信と処理
```profile.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>自己紹介フォーム</title>
</head>
<body>
  <h2>自己紹介を入力してください</h2>
  <form method="post" action="/Sample/InputServlet">
	 名前: <input type="text" name="name"><br><br>
	 年齢：<input type="text" name="age"><br><br>
	 出身：<input type="text" name="from"><br><br>
	 <input type="submit" value="送信">
  </form>
</body>
</html>
```

```InputServlet.java
import java.io.IOException;
import java.io.PrintWriter;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/InputServlet")
public class InputServlet extends HttpServlet {
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		
		// フォームから送信されたデータを取得
		String name = request.getParameter("name");
		String age = request.getParameter("age");
		String from = request.getParameter("from");
		
		PrintWriter pw = response.getWriter();
		
		// フォームデータが入力されているかを確認し、レスポンスを生成
		if(name != null && !name.isEmpty()) {
			pw.println("<html><head><title>自己紹介</title></head>");
			pw.println("<h1>自己紹介</h1>");
			pw.println("私の名前は" + name +"で、年齢は" + age + "歳です。出身地は " + from + "です。");
            pw.println("</body></html>");
		} else {
			pw.println("<html><head><title>エラー</title></head><body>");
            pw.println("<h1>名前を入力してください</h1>");
            pw.println("</body></html>");
		}
		pw.close();
	}
}

```