Javaプログラミング入門：ステップ2 Webアプリケーションの基礎

# Javaプログラミング入門：ステップ2 Webアプリケーションの基礎

Webアプリケーションの開発において、Javaは強力なツールとなります。特にJSP（JavaServer Pages）とサーブレットは、動的なWebページを生成するための基本技術です。本記事では、Webアプリケーションの基礎を学ぶためのステップ2として、以下の内容を順を追って解説します。

1. JSPの基本的な使い方
2. サーブレットの基本
3. JSPとサーブレット間のデータのやり取り
4. フォームデータの送受信
5. JSPのカスタムタグ
6. 標準タグライブラリ（JSTL）
7. カスタムタグの作成と使用

## 1. JSPの基本的な使い方

JSPは、HTMLにJavaコードを埋め込んで動的なWebページを作成するための技術です。基本的なJSPファイルは`.jsp`拡張子を持ち、HTMLコードにJavaのスクリプトレットを挿入して動的なコンテンツを生成します。

### JSPの主な要素

- **スクリプトレット**: `<% ... %>` の中にJavaコードを記述します。
- **宣言**: `<%! ... %>` の中にメソッドや変数を宣言します。
- **式**: `<%= ... %>` の中にJava式を記述し、その結果を出力します。
```jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>JSP Example</title>
</head>
<body>
    <h1>Welcome to JSP!</h1>
    <% 
        String message = "Hello, JSP!";
    %>
    <p><%= message %></p>
</body>
</html>
```

## 2. サーブレットの基本

サーブレットは、Javaプログラムとしてサーバー上で動作し、クライアントからのリクエストを処理してレスポンスを生成するコンポーネントです。サーブレットはJavaのクラスとして定義され、`HttpServlet`クラスを継承します。

### サーブレットのライフサイクル

1. **初期化**: `init()`メソッドが呼ばれます。
2. **リクエスト処理**: `doGet()`や`doPost()`メソッドが呼ばれます。
3. **終了処理**: `destroy()`メソッドが呼ばれます。
```java
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("/HelloServlet")
public class HelloServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        response.getWriter().append("Hello, Servlet!");
    }
}
```

## 3. JSPとサーブレット間のデータのやり取り

JSPとサーブレットは、`HttpServletRequest`と`HttpServletResponse`オブジェクトを使ってデータをやり取りします。サーブレットからJSPにデータを渡す場合、リクエスト属性を利用します。

### サーブレットからJSPへのデータ渡し

サーブレットでリクエスト属性を設定し、JSPにフォワードします。
```java
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("/DataServlet")
public class DataServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("message", "Hello from Servlet!");
        request.getRequestDispatcher("display.jsp").forward(request, response);
    }
}
```
```jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Data Display</title>
</head>
<body>
    <h1>Data from Servlet:</h1>
    <p>${message}</p>
</body>
</html>
```
## 4. フォームデータの送受信

Webアプリケーションでは、ユーザーが入力したデータをフォームを通じてサーバーに送信し、サーバーがそのデータを処理します。`HttpServletRequest`オブジェクトを使ってフォームデータを取得します。

### フォームデータの取得方法
```html
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Form Example</title>
</head>
<body>
    <form action="FormServlet" method="post">
        <label for="name">Name:</label>
        <input type="text" id="name" name="name">
        <input type="submit" value="Submit">
    </form>
</body>
</html>
```
```java
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("/FormServlet")
public class FormServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");
        response.setContentType("text/html");
        response.getWriter().append("Name: " + name);
    }
}
```

## 5. JSPのカスタムタグ

JSPカスタムタグは、再利用可能なコンポーネントを作成するために使用されます。カスタムタグを使うことで、JSPページのコードをより簡潔で読みやすくすることができます。

### カスタムタグの作成と使用

1. **タグハンドラクラスの作成**: タグの動作を定義するJavaクラスを作成します。
2. **TLDファイルの作成**: タグライブラリの定義ファイルを作成します。
3. **JSPページでの使用**: 作成したタグライブラリをJSPページでインポートし、カスタムタグを使用します。
```java
import javax.servlet.jsp.tagext.TagSupport;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import java.io.IOException;

public class HelloTag extends TagSupport {
    public int doStartTag() throws JspException {
        JspWriter out = pageContext.getOut();
        try {
            out.print("Hello, Custom Tag!");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return SKIP_BODY;
    }
}
```
```xml
<taglib xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
                            http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
        version="2.1">
    <tlib-version>1.0</tlib-version>
    <short-name>example</short-name>
    <uri>/WEB-INF/tags/example</uri>
    <tag>
        <name>hello</name>
        <tag-class>HelloTag</tag-class>
        <body-content>empty</body-content>
    </tag>
</taglib>
```
```jsp
<%@ taglib uri="/WEB-INF/tags/example" prefix="ex" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Custom Tag Example</title>
</head>
<body>
    <h1>Using Custom Tag</h1>
    <ex:hello />
</body>
</html>
```
## 6. 標準タグライブラリ（JSTL）

JSTL（JavaServer Pages Standard Tag Library）は、JSPでの共通タスクを簡単に行うための標準タグライブラリです。JSTLを使うことで、ループや条件分岐などの処理を簡潔に記述できます。

### JSTLの主なタグ

- **コアタグ**: 条件分岐やループ処理を行うタグ
- **フォーマットタグ**: 日付や数値のフォーマットを行うタグ
- **SQLタグ**: データベース操作を行うタグ
```jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>JSTL Example</title>
</head>
<body>
    <c:choose>
        <c:when test="${param.value > 10}">
            <p>Value is greater than 10</p>
        </c:when>
        <c:otherwise>
            <p>Value is 10 or less</p>
        </c:otherwise>
    </c:choose>
</body>
</html>

```
## 7. カスタムタグの作成と使用

カスタムタグを作成することで、独自の再利用可能なタグを定義できます。これにより、複雑なロジックを簡潔に表現し、JSPページの保守性を向上させることができます。

### カスタムタグの作成手順

1. **タグハンドラクラスの作成**: Javaでタグの機能を定義します。
2. **TLDファイルの作成**: タグライブラリの定義ファイルを作成します。
3. **JSPページでの使用**: カスタムタグをインポートして使用します。

これで、JSPとサーブレットの基本的な使い方についての解説を終わります。これらの技術を理解し、実際にコードを試してみることで、Webアプリケーションの開発スキルを向上させましょう。次回は、より高度なWebアプリケーションの開発に挑戦してみましょう。