メソッドの宣言

広告

変数の宣言と同じくメソッドも宣言内に記述することができます。例えば次のようになります。

<%!
int getTotal(int num){
  int sum = 0;

  for (int i = 1 ; i <= num ; i++){
    sum += i;
  }

  return sum;
}
%>

上記は1から指定した値までを順に加えた値を返してくれるメソッドです。作成したメソッドはスクリプトレット内から呼び出して利用する事ができます。

サンプルプログラムの実行

それではまず実際に試してみましょう。コンテキストファイルは今までと同じく次のようにします。

<Context path="/hellojsp"
docBase="d:/jsp-sample/hello"/>

JSPページは次のようになります。

dispsum3.jsp

<%@ page contentType="text/html;charset=Shift_JIS" %>

<html>
<head>
<title>計算テスト</title>
</head>
<body>

<%!
int getTotal(int num){
  int sum = 0;

  for (int i = 1 ; i <= num ; i++){
    sum += i;
  }

  return sum;
}
%>

<h1>計算テスト</h1>

<%
int countnumber = 50;
%>

<p>
1から<%= countnumber %>まで加えた合計の値は<%= getTotal(countnumber) %>です。
</p>

</body>
</html>

JSPページはコンテキストファイルで指定したドキュメントルートの直下に置いておきます。

[D] -- jsp-sample
        |
        +-- hello
        |    |
             +-- (dispsum3.jsp)
             |

それでは「http://localhost/hello/dispsum3.jsp」にブラウザからアクセスします。次のように表示されれば成功です。

メソッドの宣言

今回のサンプルではスクリプトレットではなく「<%= %>」を使ってメソッドからの戻り値をそのまま表示させました。

変換されたサーブレットの確認

ではメソッドを宣言した場合にサーブレットにどのように変換されているかを確認しておきます。

package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class dispsum3_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {


int getTotal(int num){
    int sum = 0;

    for (int i = 1 ; i <= num ; i++){
        sum += i;
    }

    return sum;
}

  private static java.util.List _jspx_dependants;

  public Object getDependants() {
    return _jspx_dependants;
  }

  public void _jspService(HttpServletRequest request, HttpServletResponse response)
        throws java.io.IOException, ServletException {

    JspFactory _jspxFactory = null;
    PageContext pageContext = null;
    HttpSession session = null;
    ServletContext application = null;
    ServletConfig config = null;
    JspWriter out = null;
    Object page = this;
    JspWriter _jspx_out = null;
    PageContext _jspx_page_context = null;


    try {
      _jspxFactory = JspFactory.getDefaultFactory();
      response.setContentType("text/html;charset=Shift_JIS");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\r\n");
      out.write("\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<title>計算テスト</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("<h1>計算テスト</h1>\r\n");
      out.write("\r\n");

int countnumber = 50;

      out.write("\r\n");
      out.write("\r\n");
      out.write("<p>\r\n");
      out.write("1から");
      out.print( countnumber );
      out.write("まで加えた合計の値は");
      out.print( getTotal(countnumber) );
      out.write("です。\r\n");
      out.write("</p>\r\n");
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>\r\n");
    } catch (Throwable t) {
      if (!(t instanceof SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          out.clearBuffer();
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
      }
    } finally {
      if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

宣言したメソッドはJSPページにリクエストがあると呼び出される「_jspService」メソッドの外に記述されている事が分かります。

この時に注意して頂きたいのが、JSP内で暗黙のうちに利用していた「out」などのオブジェクトですが、宣言したメソッド内では利用できません。これも上記のサーブレットコードを見て頂くと分かるのですが、「out」などのオブジェクトは「_jspService」メソッドの中で作成されているからです。「session」など他の暗黙オブジェクトは全て利用できませんので注意して下さい。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。