JSP/Servlet | JSP(Java Server Pages) | メソッドとフィールドを定義する

これで、複数行のコード処理をJavaで書いて実行できるようになった。しかし、これは少し妙な感じがする。Javaという言語は、このように文をずらずら書いてそれを実行する言語ではない。一般的にはクラスを定義し、その中にメソッドやフィールドを定義して実行する言語である。

このように実行する文を並べて書く方式では、メソッドを定義して呼び出すことはできないのだろうか、と思うかもしれない。しかし、その心配は不要である。メソッドをきちんと定義するための専用タグが用意されている。

そのタグが<%! ~ %>である。これは<%!%>の間にメソッド定義や変数宣言などを記述すると、コード内ですぐに使用できる。メソッドだけでなく変数も宣言でき、一種のグローバル変数として使える。つまり、<%! ~ %>内で宣言された変数は、他のメソッドなどすべての場所から使用できる。クラスのフィールドと同じ役割をすると考えればよい。

それでは、簡単な使用例を作ってみよう。前の例をさらに修正する。

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ page import="java.util.Calendar" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%!
String formatPattern = "yyyy-MM-dd";
String result = "none.";

void setFormatPattern(String f) {
    formatPattern = f;
}
void printToday() {
    Calendar calendar = Calendar.getInstance();
    SimpleDateFormat format = new SimpleDateFormat(formatPattern);
    result = format.format(calendar.getTime());
}
%>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Sample jsp</title>
    <style>
    h1 {font-size:16pt; background:#AAFFAA; padding:5px; }
    </style>
</head>
<body>
    <h1>Sample jsp page</h1>
     <p>このページはサンプルです。</p>
    <% printToday(); %>
    <p><%=result %></p>
    <% setFormatPattern("yyyy年 MM月 dd日"); %>
    <% printToday(); %>
    <p><%=result %></p>
</body>
</html>

ここでは、日付形式を表すテキストを保存するformatPattern変数と、フォーマット生成された日付テキストを保存するresult変数を宣言している。そして、日付形式を設定するsetFormatPatternと、今日の日付をフォーマットしてresult変数に代入するprintTodayの2つのメソッドを用意している。

ここではテキストを2回出力する。この部分を見ると、次のようになっている。

<% printToday(); %>
<p><%=result %></p>
<% setFormatPattern("yyyy年 MM月 dd日"); %>
<% printToday(); %>
<p><%=result %></p>

setFormatPatternでフォーマットを設定し、printTodayでフォーマット済みのテキストを代入し、<%=result %>で出力する流れになっている。それぞれのメソッドと変数が正しく機能していることがわかる。

また、このコードからもう一つ重要なことがわかる。それは「JSPのJavaコードは複数のタグに分けて書かれていても、すべて1つに統合されたものとして扱われる」という点である。実行する処理を1つの<% ~ %>タグにまとめて書く必要はない。複数のタグに分かれていても、すべてが1つにつながった処理として実行される。これは非常に重要なJSPの特徴なので、必ず覚えておこう。