JSP & Servlet-11日目(CSVパース)

JSP&Servlet

株価csvファイルの読み書きを読みこんで表を作成してみよう。
●株価csvファイル

[実行例]
リクエストを投げると、以下のようなWEBページが表示される。

●●株価表の作成●●
1.エクリプス動的プロジェクトから[stockapp]を作成。
2.下から株価csvファイルをダウンロード


3.WEB-INF/の中にdataフォルダを作成し、そこにコピペでcsvファイルを貼り付ける。
4.modelパッケージを作成しその中にStock.java(Beans)を以下のように作成する。
●model.Stock.java

package model;

public class Stock implements Serializable{
	//コード,銘柄名,市場,始値,高値,安値,終値,出来高,売買代金
	private String code,name,place,open,high,low,end,amount,sales;
	public Stock(){}
	public Stock(String code, String name, String place, String open, String high, String low, String end,
			String amount, String sales) {
		this.code = code;
		this.name = name;
		this.place = place;
		this.open = open;
		this.high = high;
		this.low = low;
		this.end = end;
		this.amount = amount;
		this.sales = sales;
	}
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPlace() {
		return place;
	}
	public void setPlace(String place) {
		this.place = place;
	}
	public String getOpen() {
		return open;
	}
	public void setOpen(String open) {
		this.open = open;
	}
	public String getHigh() {
		return high;
	}
	public void setHigh(String high) {
		this.high = high;
	}
	public String getLow() {
		return low;
	}
	public void setLow(String low) {
		this.low = low;
	}
	public String getEnd() {
		return end;
	}
	public void setEnd(String end) {
		this.end = end;
	}
	public String getAmount() {
		return amount;
	}
	public void setAmount(String amount) {
		this.amount = amount;
	}
	public String getSales() {
		return sales;
	}
	public void setSales(String sales) {
		this.sales = sales;
	}
	
	
}

5.modelパッケージ内にStockParser.javaを以下のように作成
●model.StockParser.java

package model;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

public class StockParser {
	public List<Stock> getList(String path){
		List<Stock> list=new ArrayList<>();
		BufferedReader br=null;
		try {
			FileInputStream fis=new FileInputStream(path);
			InputStreamReader isr=new InputStreamReader(fis,"UTF-8");
			br=new BufferedReader(isr);
			String line;
			while((line=br.readLine()) != null){
				if(line.startsWith("コード")){
					continue;
				}
				String[] vals=line.split(",",-1);
				list.add(new Stock(vals[0], vals[1], vals[2], vals[3], vals[4], vals[5], vals[6],
				vals[7], vals[8]));
				
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally{
			if(br !=null){
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}	
		return list;
	}

}



6.controllerパッケージを作成し、その中にIndex.java(Servlet)を作成する。
●controller.Index.java

package controller;

import java.io.IOException;
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.Stock;
import model.StockParser;


@WebServlet("/index.html")
public class Index extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		ServletContext application=this.getServletContext();
		List<Stock> list=(List<Stock>)application.getAttribute("list");
		if(list==null){
			String path=application.getRealPath("/WEB-INF/data/stocks_2017-08-16.csv");
			StockParser parser=new StockParser();
			list=parser.getList(path);
			application.setAttribute("list",list);
		}
		RequestDispatcher rd=request.getRequestDispatcher("/WEB-INF/view/index.jsp");
		rd.forward(request, response);		
	}
}

7.WEB-INFの中にviewフォルダを作り、その中にindex.jspを作成する。
●index.jsp(WEB-INF/view/index.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="model.*,java.util.*"%>
  <% 
  List<Stock> list=(List<Stock>)application.getAttribute("list");
 
  %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>Insert title here</title>
</head>
<body>
<%if(list !=null && list.size() >0) {%>
<table border="1">
<tr>
<th>コード</th>
<th>銘柄名</th>
<th>市場</th>
<th>始値</th>
<th>高値</th>
<th>安値</th>
<th>終値</th>
<th>出来高</th>
<th>売買代金</th>
</tr>
<%for(Stock s:list){ %>
<tr>
<td><%=s.getCode() %></td>
<td><%=s.getName() %></td>
<td><%=s.getPlace() %></td>
<td><%=s.getOpen() %></td>
<td><%=s.getHigh() %></td>
<td><%=s.getLow() %></td>
<td><%=s.getEnd() %></td>
<td><%=s.getAmount() %></td>
<td><%=s.getSales() %></td>
</tr>
<%} %>
</table>
<%} %>

</body>
</html>

8.以下のように表示されれば成功だ。

[別解]
配列を使った解答例
〇model.Stock.java

package model;

import java.io.Serializable;

public class Stock implements Serializable{
	private String[] data;
	public Stock() {};
	public Stock(String[] data) {
		this.data=data;
	}
	public String[] getData() {
		return data;
	}
	public void setData(String[] data) {
		this.data = data;
	}


}

〇model.StockParser.java

package model;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class StockParser {
	private List<String> headers;
	public List<Stock> getList(String path){
		List<Stock> list=new ArrayList<>();
		BufferedReader br=null;
		try {
			FileInputStream fis=new FileInputStream(path);
			InputStreamReader isr=new InputStreamReader(fis,"UTF-8");
			br=new BufferedReader(isr);
			String line;
			while((line=br.readLine())!=null) {
				String[] data=line.split(",",-1);
				if(line.startsWith("コード")) {
					this.headers=Arrays.asList(data);
				}else {
					Stock stock=new Stock(data);
					list.add(stock);
				}
			}
		} catch (FileNotFoundException | UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		System.out.println(list.size());
		return list;
	}
	public List<String> getHeaders() {
		return this.headers;
	}
}

〇controller.Index.java

package controller;

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

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.Stock;
import model.StockParser;

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

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		ServletContext application=this.getServletContext();
		List<Stock> list=(List<Stock>)application.getAttribute("list");
		if(list ==null) {
			String path=application.getRealPath("/WEB-INF/data/stocks_2017-08-16.csv");
			StockParser parser=new StockParser();
			list=parser.getList(path);
			List<String> headers=parser.getHeaders();
			application.setAttribute("headers", headers);
			application.setAttribute("list", list);
		}
		request.getRequestDispatcher("/WEB-INF/view/index.jsp").forward(request, response);
	}
}

〇/WEB-INF/view/index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="model.*,java.util.*"%>
<%
List<String> headers=(List<String>)application.getAttribute("headers");
List<Stock> list=(List<Stock>)application.getAttribute("list");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>全<%=list.size() %>件</p>
<%if(list != null && list.size()>0){ %>
	<table border="1">
		<tr>
		<%for(String header:headers) {%>
			<th><%=header %></th>
		<%} %>
		<tr>
		<%for(Stock s:list){ %>
		<tr>
			<%for(String str:s.getData()){ %>
			<td><%=str %></td>
			<%} %>
		</tr>
		<%} %>
	</table>
<%} %>
</body>
</html>

コメント

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