解説 · セクション 5
アノテーション基礎
@WebServlet と @Override の意味、アノテーション = メタ情報の感覚をつかみます。
身近に置き換えると
レストランのスタッフが胸につけている「店長」や「研修中」といった名札を想像してみてください。名札自体が料理を作るわけではありませんが、お客さんや他のスタッフに「その人がどんな役割か」を伝える重要な情報です。
Javaにおける「アノテーション(@から始まる言葉)」も、これと全く同じです。プログラムのコードにペタッと貼る「付箋」や「ラベル」のようなもので、パソコンやサーバーに「このコードはこういう役割だよ」と伝えるための追加情報(メタ情報)として働きます。
3 行でまとめると
- アノテーション(@)は、コードの役割をコンパイラやサーバーに伝える「メタ情報(ラベル)」です。
@Overrideは、親クラスのメソッドを正しく上書き(オーバーライド)できているか確認してくれる安全装置です。@WebServlet("/users")を使うと、指定したURLにアクセスが来たときにどのプログラムを動かすかを簡単に設定できます。
図で見ると
flowchart LR
Client[ブラウザ] -- "/users にアクセス" --> Server[Webサーバー]
Server -- "@WebServlet を探す" --> Label{アノテーション}
Label -- "/users を発見!" --> Servlet[UserServletクラス]
style Label fill:#f9f,stroke:#333,stroke-width:2px
サーバーは、アクセスされたURLと一致する「@WebServlet」というラベル(アノテーション)が貼られたクラスを探し出して実行します。
順を追って理解する
1. アノテーションは「メタ情報(ラベル)」
アノテーションとは、英語で「注釈」という意味です。Javaでは @ 記号を使って記述します。プログラムの計算処理そのものではなく、「このメソッドは上書き用です」「このクラスはWeb用です」といった、コードに関する情報(メタ情報)をコンパイラや実行環境に伝える役割を持ちます。
2. タイポを防ぐ安全装置「@Override」
親クラスのメソッドを子クラスで上書き(オーバーライド)するとき、メソッド名を1文字でも間違えると「新しい別のメソッド」として扱われてしまい、エラーにもならないためバグの原因になります。そこでメソッドの上に @Override というラベルを貼ります。これを貼っておくと、もし名前を間違えていた場合に「親クラスにそんなメソッドはありませんよ!」とJavaがエラーを出して教えてくれる強力な安全装置になります。
3. URLとプログラムを結びつける「@WebServlet」
Webアプリケーションでは、「どのURLにアクセスされたら、どのJavaプログラムを動かすか」を決める必要があります。ここで活躍するのが @WebServlet です。クラスの上に @WebServlet("/users") と書くだけで、「このクラスは /users というURLを担当します」とサーバーに宣言することができます。
4. 複数のURLを1つのプログラムで担当する
場合によっては、「/users」と「/members」の両方のURLを同じプログラムで処理したいことがあります。その場合は、アノテーションの値に配列(中括弧 { })を使って @WebServlet({"/users", "/members"}) のように書くことで、複数の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;
// アノテーションで、2つのURLをこのServletにマッピングする
@WebServlet({"/users", "/members"})
public class UserServlet extends HttpServlet {
// 親クラス(HttpServlet)のメソッドを上書きする目印
// もし "doGet" を "doget" とタイポしたらコンパイルエラーで教えてくれる
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// URLにアクセスされたときの処理をここに書く
response.setContentType("text/html; charset=UTF-8");
response.getWriter().println("ユーザー一覧ページです");
}
}
応用講義では、このようにクラスの先頭に @WebServlet を書き、処理を行うメソッドに @Override を付けるスタイルが基本の形になります。
よくある誤解
誤解: アノテーション自体がすごい処理をしてくれている
正しくは: アノテーション自体はただの「目印(文字列)」に過ぎません。その目印を見つけたコンパイラや、TomcatなどのWebサーバーが「おっ、この目印があるならこういう処理をしよう」と裏側で頑張ってくれています。アノテーションはあくまで「指示書」です。
誤解: @Override は書かなくても動くから、書かなくていい
正しくは: 確かに書かなくてもオーバーライド自体は成立しますが、絶対に書くべきです。人間は必ずタイポ(打ち間違い)をします。バグを探すために何時間も無駄にするのを防ぐため、プロの現場でも @Override は必須のルールになっています。
つまずいたら
このトピックで詰まったら基礎復習へ: 章 3 クラスの継承