2.3 レスポンスを利用した画面表示内容の設定

2.3 レスポンスを利用した画面表示内容の設定

レスポンスを利用して、画面表示したい文言をJavaのプログラム内で指定することができます。ポイントとしては以下となります。

  • responseインタフェースのオブジェクトに用意されたgetWriter()メソッドを使って、文字列出力を行うPrintWriterクラスのオブジェクトを生成する。
  • PrintWriterクラスのオブジェクトのprintln()メソッドを使って文字列を出力する。

レスポンスの設定について、凡例を元に案内します。

書式:表示したい文字列をレスポンスに設定する

PrintWriter out = response.getWriter();
out.println(表示したい文字列);

凡例:表示したい文字列をレスポンスに設定する

PrintWriter out = response.getWriter();
out.println("Bookの価格は" + 2000 + "円です");

変数responseは、jakarta.servlet.http.HttpServletResponseインタフェースのオブジェクトです。
println()メソッドで設定する文字列は、ダブルクォーテーションで囲んだ文字列1つだけでも良いですし、凡例のように文字列や値を組み合わせても設定することができます。
値については、上記のようなベタ書きの値はもちろん、リクエストスコープで渡された値を使うこともできます。

リクエストスコープを利用してデータを渡し、レスポンスで出力するプログラム

サーブレット内で定義した文字列をリクエストスコープに登録し、その文字列を次のサーブレットで受け取り画面に表示するプログラムです。リクエストスコープへのデータの登録方法とリクエストスコープからのデータの取得方法、およびブラウザに出力する方法について学習しましょう。

① ソース・フォルダ: web_basic/src/main/java
② パッケージ: ch02
③ 名前: UseRequestServlet1
④ スーパークラス: jakarta.servlet.http.HttpServlet
⑤ アクセスURL: http://localhost:8080/web_basic/UseRequestServlet1

UseRequestServlet1.java

package ch02;

import java.io.IOException;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/UseRequestServlet1")
public class UseRequestServlet1 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //リクエストスコープへの登録
        request.setAttribute("bookTitle", "Text Of WebApp");
        
        //画面遷移
        request.getRequestDispatcher("/UseRequestServlet2").forward(request, response);
    }
}

① ソース・フォルダ: web_basic/src/main/java
② パッケージ: ch02
③ 名前: UseRequestServlet2
④ スーパークラス: jakarta.servlet.http.HttpServlet
⑤ アクセスURL: UseRequestServlet1.javaからの画面遷移でアクセスされる

UseRequestServlet2.java

package  ch02;

import java.io.IOException;
import java.io.PrintWriter;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/UseRequestServlet2")
public class UseRequestServlet2 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        //リクエストスコープの取得
        String bookTitle = (String)request.getAttribute("bookTitle");

        //画面表示
        PrintWriter out = response.getWriter();
        out.println("TITLE:" + bookTitle);
    }
}

解説

このプログラムは、UseRequestServlet1.java内の18行目でsetAttribute()メソッドを利用し、リクエストスコープにデータを登録しています。setAttribute()メソッドの第1引数に「bookTitle」という文字列を渡しています。この第1引数が、登録するデータの名前になります。また、第2引数には「Text Of WebApp」という文字列を渡しています。この文字列が、実際にリクエストスコープに登録されるデータです。

18: request.setAttribute("bookTitle", " Text Of WebApp ");

改めてここで1つ注意する点があります。setAttribute()メソッドの第2引数は、Object型と呼ばれるクラス型です。Object型は全てのクラスが継承している型なので、この型を引数とすることで、どのような型でも登録することができます。

void setAttribute(String name, Object value)

setAttribute()メソッドによってリクエストスコープ内に登録される際に、String型の文字列「Text Of WebApp」はObject型に自動型変換されて登録されます。

21行目では、リクエストスコープの機能の一つであるgetRequestDispatcher ()メソッドとforward()メソッドを利用して、引数のURLパターン「/UseRequestServlet2」を元に、UseRequestServlet2.javaへ処理を転送しています。

getRequestDispatcher ()メソッドやforward()メソッドについては、画面遷移を行うために使うメソッド、という理解していただければ今は大丈夫です。

21: request.getRequestDispatcher("/UseRequestServlet2").forward(request, response);

UseRequestServlet2.javaへ処理の転送後は、19行目で登録された文字列を取得しています。
getAttribute()メソッドの引数に「bookTitle」という文字列を渡しています。この引数の文字列がリクエストスコープから取得するデータの名前になります。

19: String bookTitle = (String)request.getAttribute("bookTitle");

ここで注意する点は、登録されたデータはObject型で取得されることです。そのため、取得されたデータを適切に扱うためには、型をリクエストスコープへ登録される前の型に明示的に変換(キャスト)する必要があります。

最後に、UseRequestServlet2.javaの22~23行目で、文字列と変数bookTitleを使ってブラウザに文言を出力する処理を書いています。

22: PrintWriter out = response.getWriter();
23: out.println("TITLE:" + bookTitle);

このように、サーブレット内でリクエストスコープにデータを登録し、登録されたデータを別のサーブレット内で取得することで、データを共有することができるようになります。実行結果からわかるように、最初のサーブレット内でリクエストスコープに登録した文字列を、次のサーブレットの処理でブラウザに出力することができています。


NEXT>> 2.4 日本語の表示とコンテンツタイプについて