JSP & Servlet Applicationスコープ演習

JSP&Servlet

applicationスコープを使って、製品を登録してみよう。

実行例

実行すると以下のようにフォームが表示される。

製品名と価格を入力し、登録ボタンを押す

以下のように製品が登録される

もし、製品名、価格の両方、またはどちらかが未記入だと
「未記入の項目があります!」
と出力される。

続けてデータを入力していこう。その際、以下のように新しいデータはリストの上に表示される。

作例

1.新規動的Webプロジェクトからproductという名前でプロジェクトを作成する。

2.新規クラスからmodel.Productを以下のように作成する。

package model;

import java.io.Serializable;

public class Product implements Serializable{
	private String name;
	private String price;
	private String dateTime;
	
	public Product() {}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPrice() {
		return price;
	}

	public void setPrice(String price) {
		this.price = price;
	}

	public String getDateTime() {
		return dateTime;
	}

	public void setDateTime(String dateTime) {
		this.dateTime = dateTime;
	}

}

modelパッケージ内に、以下のようにRegisterProcuctLogicクラスを作成する。

package model;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

public class RegisterProductLogic {
	public void execute(Product p,List<Product> list) {
		Date today = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		String dateTime = sdf.format(today);
		p.setDateTime(dateTime);
		list.add(0,p);
	}
}

3.新規サーブレットcontroller.Main.javaを以下のように作成する

package controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model.Product;
import model.RegisterProductLogic;

@WebServlet("/Main")
public class Main extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		ServletContext application = this.getServletContext();
		List<Product> list = (List<Product>) application.getAttribute("list");
		if (list == null) {
			list = new ArrayList<>();
			application.setAttribute("list", list);
		}
		RequestDispatcher rd = request.getRequestDispatcher("WEB-INF/view/main.jsp");
		rd.forward(request, response);
	}
}

4.WEB-INFの中にviewフォルダを作成し、その中にmain.jspを以下のように作成する。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="model.*,java.util.*" %>
<%
List<Product> list =(List<Product>)application.getAttribute("list");
String msg = (String)request.getAttribute("msg");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% if(msg != null){ %>
<p><%=msg %></p>
<%} %>
<form action="Main" method="post">
製品名:<input type="text" name="name"><br>
価格:<input type="number" name="price"><br>
<input type="submit" value="登録">
</form>
<% if(list.size()>0){ %>
<table border="1">
<tr><th>製品名</th><th>価格</th><th>登録日</th></tr>
<% for (Product p :list){ %>
<tr>
<td><%=p.getName() %></td>
<td><%=p.getPrice() %>円</td>
<td><%=p.getDateTime() %></td>
</tr>
<%} %>
</table>
<%} %>
</body>
</html>

5.さきほど作成したサーブレットMain.javaに以下のようにdoPostメソッド部分をt追記する。

package controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model.Product;
import model.RegisterProductLogic;

@WebServlet("/Main")
public class Main extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		ServletContext application = this.getServletContext();
		List<Product> list = (List<Product>) application.getAttribute("list");
		if (list == null) {
			list = new ArrayList<>();
			application.setAttribute("list", list);
		}
		RequestDispatcher rd = request.getRequestDispatcher("WEB-INF/view/main.jsp");
		rd.forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String name = request.getParameter("name");
		String price = request.getParameter("price");
		String msg;
		if ((name != null && name.length() > 0) &&
				(price != null && price.length() > 0)) {
			msg = "1件登録しました";
			Product p = new Product();
			p.setName(name);
			p.setPrice(price);
			ServletContext application = this.getServletContext();
			List<Product> list = (List<Product>) application.getAttribute("list");
			RegisterProductLogic logic = new RegisterProductLogic();
			logic.execute(p, list);
			application.setAttribute("list", list);
		} else {
			msg = "未記入の項目があります!";
		}
		request.setAttribute("msg", msg);
		RequestDispatcher rd = request.getRequestDispatcher("WEB-INF/view/main.jsp");
		rd.forward(request, response);
	}
}

コメント

タイトルとURLをコピーしました