ServletからJSPにデータを引き渡すサンプルプログラムを作りました。プログラムは Servlet、JSP、および、データの入れ物となるBeanで構成します(サンプルソースは最後に記載しておきます)。引き渡すデータは商品番号と商品名と値段です。
実行環境
・ubuntu 20.04 LTS
・Tomcat 9.0.65
・OpenJDK 1.8
・JSTL 1.2.5
まずはBeanです。BeanはJavaBeansの仕様に沿って作成します。
- publicで引数なしのコンストラクタがある(コンストラクタを定義しない場合はコンパイラが引数なしのコンストラクタを自動で生成します)。
- privateなフィールドと、そのフィールドに値を設定するメソッド(セッター)と取得するメソッド(ゲッター)がある。
- シリアライズが可能である(Serializableインターフェースを実装している)。
Shohin というクラス名でBeanを作成しました。フィールドに number(商品番号)、product(商品名)、price(値段)を持っています。
Servletです。Fwsample1 というクラス名で作成しました。Servletの中で、商品番号「1」、商品名「apple」、値段「200(円)」を設定して fwsample1.jsp にデータを引き渡しています。
JSPです。fwsample1.jsp ではBeanから number(商品番号)、product(商品名)、price(値段) を取得して表示します。
JSPでBeanからの値の取得にはEL式(Expression Language)を使っています。EL式は ${ 〜 }で記載したものです。
実行結果です。
ServletからJSPに引き渡すデータ(Bean)は1つとは限らないので、Beanが複数あった場合のサンプルも載せておきます。Servletでデータベースから複数行を取得して、JSPに引き渡す場合に利用できます。
Servletです。Fwsample2 というクラス名で作成しました。Beanをリストに格納してから fwsample2.jsp にデータを引き渡しています。
JSPです。fwsample2.jsp ではJSTL(JSP Standard Tag Library)の繰り返し処理(<c:forEach>タグ)を使ってリストからBeanを取り出して表示しています。JSPで繰り返し処理や条件分岐を行う場合は、<% Javaの処理 %> のように記述する必要がありますが、JSTLを使うことによりタグでその処理ができるようになります。
JSTLを利用するにはJSTLのJARファイルを入手する必要があります。Tomcatのタグライブラリのダウンロードページから取得します。JARファイル(Standard-1.2.5の場合)には Impl、Spec、EL、Compat があるので、これらのJARファイルをダウンロードします。
ダウンロードしたJARファイルは Tomcatのwebapps配下のアプリケーションフォルダにある WEB-INF/lib フォルダに格納します(libフォルダがない場合は作成します)。
実行結果です。
ここで使用したサンプルプログラムのソースを記載しておきます。
Shohin.java
package bean;
public class Shohin implements java.io.Serializable {
private int number;
private String product;
private int price;
public int getNumber() {
return number;
}
public String getProduct() {
return product;
}
public int getPrice() {
return price;
}
public void setNumber(int number) {
this.number=number;
}
public void setProduct(String product) {
this.product=product;
}
public void setPrice(int price) {
this.price=price;
}
}
Fwsample1.java
package sample3;
import bean.Shohin;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
@WebServlet(urlPatterns={"/sample3/fwsample1"})
public class Fwsample1 extends HttpServlet
{
public void doGet (
HttpServletRequest request, HttpServletResponse response
) throws ServletException, IOException
{
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
try {
//beanに格納
Shohin s = new Shohin();
s.setNumber(1);
s.setProduct("apple");
s.setPrice(200);
//JSPに引き渡し
request.setAttribute("shohin", s);
request.getRequestDispatcher("fwsample1.jsp")
.forward(request, response);
}
catch ( Exception e ) {
out.println("エラーが発生しました<br>");
e.printStackTrace( out );
}
}
}
fwsample1.jsp
<%@page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>fwsample1.jsp</title>
</head>
<body>
${shohin.number}:${shohin.product}:${shohin.price}
</body>
</html>
Fwsample2.java
package sample3;
import bean.Shohin;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
import java.util.*;
@WebServlet(urlPatterns={"/sample3/fwsample2"})
public class Fwsample2 extends HttpServlet
{
public void doGet (
HttpServletRequest request, HttpServletResponse response
) throws ServletException, IOException
{
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
try {
List<Shohin> list = new ArrayList<>();
//リストに格納
Shohin s1 = new Shohin();
s1.setNumber(1);
s1.setProduct("apple");
s1.setPrice(200);
list.add(s1);
Shohin s2 = new Shohin();
s2.setNumber(2);
s2.setProduct("orange");
s2.setPrice(150);
list.add(s2);
//JSPに引き渡し
request.setAttribute("list", list);
request.getRequestDispatcher("fwsample2.jsp")
.forward(request, response);
}
catch ( Exception e ) {
out.println("エラーが発生しました<br>");
e.printStackTrace( out );
}
}
}
fwsample2.jsp
<%@page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>fwsample2.jsp</title>
</head>
<body>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:forEach var="p" items="${list}">
${p.number}:${p.product}:${p.price}<br>
</c:forEach>
</body>
</html>
なお、ここで記載した内容は以下の書籍を参考にさせてもらいました。ServletとJSPの基礎が学べます。
この書籍の良い所(個人的な感想ではあります)は、Eclipseを使わずに説明をしてくれているためJavaEE仕様が理解できることです。Eclipseは便利なのですがその便利さゆえにJavaEEの仕様をEclipse側で吸収してしまい、本質的なところが省略されてしまっているように思えます。
この書籍ではEclipseなしでJavaをコンパイル、そしてTomcatに配置して、Servlet、および、JSPを動かしています。基礎的な内容であるため実際の現場ですぐ役立つわけではないですが、初心者で本質を知りたい方にはとても良い書籍だと思います。書籍の付録にはEclipseを使った場合も書かれているので、Eclipseを否定しているわけではありません。