JSTLとは
• JSP Standard Tag Library
JSTL(JavaServer Pages Standard Tag Library)とは、JavaServer Pages (JSP) で動的なウェブページを作成する際に使用するカスタムタグライブラリです。Javaのコードを直接JSPに記述することなく、ウェブページに複雑なロジックや動的コンテンツを追加するための標準的な手段を提供します。
JSTLはJSP(JavaServer Pages)ファイルで使用することができるライブラリで、Javaのコードを直接JSPファイルに記述することなく、ウェブページに動的な要素を追加する力強いツールとなっています。
この記事では、JSTLの基本的な使い方を紹介し、特にc:out
タグの重要な機能に焦点を当てます。
プログラムの安全性を保つためやコードの整理に役立つこの機能は、初心者から上級者まで、あらゆるJavaウェブ開発者にとって知っておくべき重要な要素です。
では基本的な使い方について説明します。
JSTLの設定方法については以下をご参照ください。
Servletの記述
IndexServlet
- package controller;
- 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;
- /**Servlet implementation class IndexServlet
- */
- @WebServlet(“/index”)
- public class IndexServlet extends HttpServlet {
- private static final long serialVersionUID = 1L; /**
- @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
- */
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- request.getRequestDispatcher(“/WEB-INF/view/input.jsp”).forward(request, response);
- }/**
- @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
- */
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- request.setCharacterEncoding(“UTF-8”);
- String name = request.getParameter(“name”);
- System.out.println(name); request.setAttribute(“name”,name);
- request.getRequestDispatcher(“/WEB-INF/view/output.jsp”).forward(request, response);
- }
- }
この IndexServlet
クラスは、クライアントからのリクエストを処理するための Servlet で、特定のリクエストタイプに応じた処理を行います。
GET リクエストの処理
GET リクエストがサーバに届くと、doGet
メソッドが呼び出されます。このメソッドでは、リクエストを/WEB-INF/view/input.jsp
にフォワードしています。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/view/input.jsp").forward(request, response);
}
このコードにより、ウェブブラウザからの最初のリクエスト(通常はページの読み込みリクエスト)は、input.jsp
ページにリダイレクトされます。ここで、ユーザーからの入力を受け取るフォームなどを表示することができます。
POST リクエストの処理
一方、POST リクエスト(例: フォームからの送信)がサーバに届くと、doPost
メソッドが呼び出されます。このメソッド内で、エンコーディングの設定やパラメータの取得、次のページへのフォワードなどが行われます。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding(""UTF-8""); // エンコーディングの設定
String name = request.getParameter(""name""); // "name"パラメータの取得
System.out.println(name); // 取得した名前のコンソールへの出力
request.setAttribute(""name"", name); // 名前をリクエスト属性にセット
request.getRequestDispatcher("/WEB-INF/view/output.jsp").forward(request, response); // output.jsp へのフォワード
}
この部分は以下の処理を行います:
- UTF-8エンコーディングの設定
- ユーザーから送信された “name” パラメータの取得
- 取得した名前のコンソールへの出力
- 名前をリクエスト属性としてセットし、次のページにデータを渡す
- レスポンスを
output.jsp
へフォワードする
このように、IndexServlet
クラスは、リクエストのタイプに応じて、適切なページにリダイレクトし、必要なデータを渡す役割を果たします。
JSPの記述
input.jsp
ファイルは、ユーザーに名前の入力を促すシンプルなHTMLフォームを表示するためのJSPページです。
input.jsp
- <%@ page language=”java” contentType=”text/html; charset=UTF-8″pageEncoding=”UTF-8″%>
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset=”UTF-8″>
- <title>Insert title here</title>
- </head>
- <body>
- <form action=”” method=”post”>
- <p>名前:
- <input type=”text” name=”name”>
- </p>
- <input type=”submit”>
- </form>
- </body>
- </html>
-
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-
この部分はJSPページの全体設定を定義します。各属性には以下の意味があります:
- language=”java”: ページがJava言語で書かれていることを指定。
- contentType=”text/html”: ページのコンテンツタイプとしてHTMLを使用することを指定。
- charset=”UTF-8″: 文字エンコーディングとしてUTF-8を使用することを指定。
- pageEncoding=”UTF-8″: ページ自体のエンコーディングをUTF-8として指定。
output.jsp
- <%@ page language=”java” contentType=”text/html; charset=UTF-8″ pageEncoding=”UTF-8″%>
- <%@ taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core” %>
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset=”UTF-8″>
- <title>Insert title here</title>
- </head>
- <body>
- <h1>c:outを利用</h1>
- <c:out value=”${name}” />
- <h1>c:outを利用しない</h1>
- ${name}
- </body>
- </html>
ページ設定とJSTLの導入
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
ここでは、ページの言語としてJavaを使用し、文字エンコーディングをUTF-8に設定しています。また、JSTLのコアライブラリをインポートしています。
c:outタグの利用
<h1>c:outを利用</h1> <c:out value="${name}" />
c:out
タグは、エスケープ処理を行って変数を出力します。この例では、リクエスト属性から取得したname
変数を安全に表示しています。
c:outタグを利用しない場合:
<h1>c:outを利用しない</h1> ${name}
ここでは、c:out
タグを使用せずにEL式で変数name
を直接表示しています。この方法は、変数に含まれるHTMLやJavaScriptをエスケープせずに表示するため、セキュリティリスクがある場合があります。
解説
「IndexServlet」をサーバーで実行します。
名前の入力欄に
<h1>やまだたろう</h1>
と入力して送信ボタンを押します。
c:out(JSTL)を利用を利用した方は
<h1>やまだたろう</h1>
とそのままの記述で出力されていますが
c:outを利用しない EL式 での出力の方は<h1>タグが読み込まれて「やまだたろう」が見出しとなってしまっています。
これが悪意のあるJava Scriptなどであった場合はプログラム自体が変更されてしまうかもしれません。
プログラムの安全性を保つためにもJSTLを利用する等の対策が必要です。
値を出力するだけであればEL式のみでよいが、c:out を使う事でエスケープ処理が行われます。