Download presentation
Presentation is loading. Please wait.
2
レシピを保存しよう! By 石原 和音 @CreW
3
今日の目標 WebApplication において、ファイルを用 いた入出力ができるようになる 保存することの意味がわかるようになる ストリームの使い方がわかるようになる
4
前回までの復習 しつこいけど、WEBアプリって何でし た? 人を幸せにするコンセプトをもっている
5
奥様 WEB のコンセプトを思 い出そう 奥様 WEB コンセプト 主婦の日々の料理をバラエティー豊かに オリジナル料理に注目 「オリジナルレシピ投稿掲示板」 みんなにこんな美味いオリジナル料理を食べてもらいたい(投 稿) もっと色んなオリジナルレシピが知りたいたい(閲覧)
6
現行「奥様WEB」の 深刻な 問題 自分が投稿したレシピを自分で見るだけ 過去に投稿されたレシピを見ることがで きない 実は掲示板じゃなかった!!!!
7
じゃあ、どうしよう? 投稿されたレシピを保存できるようにし よう 具体的な手段 ファイル データベース などなど 今回は「ファイル」を使って実装しま しょう
8
2つのサーブレット 役割分担 レシピを投稿する → ToukouServlet.java レシピの投稿を受け付ける 受け付けたレシピをファイルに書き込む 感謝のメッセージの HTML を出力する レシピを一覧表示する →IchiranServlet.java レシピをファイルから読み出す レシピ一覧の HTML を出力する
9
レシピって何だ? レシピ 作者の名前 投稿日時 料理の名前 内容 レシピ? 作者の名前 投稿日時 料理の名前 レシピ?
10
新・奥様WEBの構成 webapp html okusama text WEB-INF classes toukou.html ToukouServlet.java IchiranServlet.java index.html recipes.txt レシピ投稿サーブレット レシピ一覧サーブレット 投稿フォーム画面 レシピ保存ファイル 奥様WEBトップページ
11
toukou.html お名前: 料理名: 作り方
12
ToukouServlet.java: doPost() /** * レシピの投稿を受け付ける * ( 投稿には、 HTTP POST メソッドを用いる ) */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { //***** レシピの投稿を受け付ける ***** //HTTP リクエストのパラメータから、レシピ情報を取り出す String contributor = request.getParameter("contributor"); // 投稿者 String title = request.getParameter("title"); // タイトル String content = request.getParameter("content"); // レシピ内容 // 日本語コードを正しい形に変換する contributor = convertToUnicode(contributor); title = convertToUnicode(title); content = convertToUnicode(content); // 投稿された時刻を取得する String date = (new java.util.Date()).toString(); //***** 受け付けたレシピをファイルに書き込む ***** // 改行を正しい形に変換する //( 改行が含まれると、書き込んだ際、 1 行に収まらなくなってしまう ) contributor = convertReturnCode(contributor); title = convertReturnCode(title); content = convertReturnCode(content); // ファイルに書き込むためのストリームを作成する BufferedWriter writer = new BufferedWriter( new FileWriter(recipeFilePath, true) ); // この true はファイルへの追記を意味する // レシピを、 contributor, title, date, content の順で書き込む writer.write(contributor); writer.newLine(); writer.write(title); writer.newLine(); writer.write(date); writer.newLine(); writer.write(content); writer.newLine(); // ストリームを閉じる writer.close(); //***** 感謝のメッセージの HTML を出力する ***** //HTML 出力の準備をする response.setContentType("text/html; charset=EUC-JP"); // 文字化けを防止 PrintWriter out = response.getWriter(); //HTML の出力に必要な PrintWriter を作成する // 感謝の HTML を出力する out.println(" "); out.println(" ありがとうございました。 "); out.println(" "); out.println(" 投稿ありがとうございました。 "); out.println(" おいしい料理ができたら、また教えてくださいね☆ "); out.println("[ レシピ一覧画面へ ]"); out.println(" "); //HTML 出力のあとかたづけをする out.close(); } ← レシピの投稿を受け付ける ← 受け付けたレシピをファイルに書き込む ← 感謝のメッセージの HTML を出力する
13
レシピの投稿を受け付ける //***** レシピの投稿を受け付ける ***** //HTTP リクエストのパラメータから、レシピを構成する情報を取り出す String contributor = request.getParameter("contributor"); // 投稿者 String title = request.getParameter("title"); // タイトル String content = request.getParameter("content"); // レシピ内容 // 日本語コードを正しい形に変換する contributor = convertToUnicode(contributor); title = convertToUnicode(title); content = convertToUnicode(content); // 投稿された時刻を取得する String date = (new java.util.Date()).toString();
14
受け付けたレシピをファイ ルに書き込む //***** 受け付けたレシピをファイルに書き込む ***** // 改行を正しい形に変換する //( 改行コードが含まれると、書き込んだ際、 1 行に収まらなくなってしまう ) contributor = convertReturnCode(contributor); title = convertReturnCode(title); content = convertReturnCode(content); // ファイルに書き込むためのストリームを作成する BufferedWriter writer = new BufferedWriter( new FileWriter(recipeFilePath, true) ); // この true はファイルへの追記を意味する // レシピを、 contributor, title, date, content の順で書き込む writer.write(contributor); writer.newLine(); writer.write(title); writer.newLine(); writer.write(date); writer.newLine(); writer.write(content); writer.newLine(); // ストリームを閉じる writer.close(); 今日の最重要ポイント
15
ストリームとはなんやね ん? ストリームとはデータの流れである 一直線 方向がある 例えば … ( 奥様 WEB の例 ) 奥様 WEB サーブレット レシピファイル 激辛カレー \n 末
16
ストリームの分類 1. 何を? 2. どこから?/どこへ? 3. どのように?
17
1:何を? バイト列 文字列 ペイントソフト 画像ファイル 0xEF0xC20x4B0x240x8C0xD30x33 奥様 WEB サーブレット レシピファイル 激辛カレーの作
18
2:どこから?/どこへ? さまざまなものを入出力先として扱える ファイル ネットワーク キーボード ・・・・・・ <HTML>< GET tou プログラム こんにちは。 \n ファイル ネットワーク ディスプレイ ・・・・・・ 入力出力 <HTML>< GET tou エラーが起こり
19
末広涼子 \n 激辛 3:どのように? 例えば … ( バッファリングの例 ) 出力先 激辛カレー 末広良子 2002年5月23日 カレールーを3倍入れ バッファー 出力する情報 奥様 WEB サーブレット 末広涼子 \n 激辛 ー レ カ 辛 激 子 涼 広 末
20
ここで使うストリーム 今回は、 文字列 (何を?) を、 ファイルに (どこから?/どこへ?) 保存しよう。その際、 バッファリング (どのように?) を行おう。 文字列をファイルに保存する FileReader, FileWriter バッファリング機能を付加する BufferedReader, BufferedWriter
21
これで作られたストリーム // ファイルに書き込むためのストリームを作成する BufferedWriter writer = new BufferedWriter( new FileWriter(recipeFilePath, true) ); // ファイルに書き込むためのストリームを作成する FileWriter fileWriter = new FileWriter(recipeFilePath, true) ; BufferedWriter writer = new BufferedWriter(fileWriter); 文字列をファイルに書き込む ストリームを作成(追記す る) バッファー機能を付加 するストリームを作成 激辛カレー 末広良子 2002年5月23日 カレールーを3倍入れ ー レ カ 辛 激 末広涼子 \n 激辛 子 涼 広 末 奥様 WEB サーブレット 末広涼子 \n 激辛
22
受け付けたレシピをファイ ルに書き込む //***** 受け付けたレシピをファイルに書き込む ***** // 改行を正しい形に変換する //( 改行コードが含まれると、書き込んだ際、 1 行に収まらなくなってしまう ) contributor = convertReturnCode(contributor); title = convertReturnCode(title); content = convertReturnCode(content); // ファイルに書き込むためのストリームを作成する BufferedWriter writer = new BufferedWriter( new FileWriter(recipeFilePath, true) ); // この true はファイルへの追記を意味する // レシピを、 contributor, title, date, content の順で書き込む writer.write(contributor); writer.newLine(); writer.write(title); writer.newLine(); writer.write(date); writer.newLine(); writer.write(content); writer.newLine(); // ストリームを閉じる writer.close();
23
IchiranServlet.java: doGet() public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { //HTML 出力の準備をする response.setContentType("text/html;charset=Shift_JIS"); // 文字化け防止 PrintWriter out = response.getWriter(); //HTML を出力するための PrintWriter を作成する // ページの頭部分の HTML を出力する out.println(" "); out.println(" 奥様 Web : 全レシピ "); out.println(" "); out.println(" おくさま Web "); out.println(" "); // レシピ一覧の HTML を出力する BufferedReader reader = new BufferedReader(new FileReader(recipeFilePath)); // ファイルを読み込むストリームを作成する while(true) { //contributor, title, date, content の順で読み込む String contributor = reader.readLine(); if( contributor == null ) { // 読み込めなかったらファイルの終わりなので、無限ループをぬける break; } String title = reader.readLine(); String date = reader.readLine(); String content = reader.readLine(); // レシピの HTML を出力する out.print(" "+contributor+" さんオリジナル "); out.println(" 「 "+title+" 」のレシピ "); out.print("( 投稿時刻: "+ date + ") "); out.println(" " + content + " "); out.println(" "); } reader.close(); // ストリームを閉じる // ページの尻尾部分の HTML を出力する out.println(" "); //HTML 出力のあとかたづけをする out.close(); }
24
IchiranServlet.java: doGet() // レシピ一覧の HTML を出力する BufferedReader reader = new BufferedReader(new FileReader(recipeFilePath)); // ファイルを読み込むストリームを作成する while(true) { //contributor, title, date, content の順で読み込む String contributor = reader.readLine(); if( contributor == null ) { // 読み込めなかったらファイルの終わりなので、無限ループをぬける break; } String title = reader.readLine(); String date = reader.readLine(); String content = reader.readLine(); // レシピの HTML を出力する out.println(" "+contributor+" さんオリジナル "); out.println(" 「 "+title+" 」のレシピ "); out.println("( 投稿時刻: "+ date + ") "); out.println(" " + content + " "); out.println(" "); } reader.close(); // ストリームを閉じる 読み込み 出力 ストリームの作 成 ストリームを閉じる
25
ファイルに保存するとはど ういうこと? 保存ってどうすること? 書き込む+読み出す=保存 (広義) 保存する目的は?なぜ嬉しい? 書き込んだ情報を読み出して初めて嬉しい ハードディスクの空き容量が減っても嬉しくな い Linux ユーザの僕は MSWord のファイルを貰って も嬉しくない どうやったらうまく読み出せる? → どういうルールで書かれたのか知っている必要がある
26
保存のルール 呼び方 ファイルフォーマット ファイル形式 奥様 WEB でのファイルフォーマット 作成者名前 料理のタイトル 投稿日時 内容 をそれぞれ1行ずつ 末広涼子┓ 激辛カレー┓ Wed May 23 17:30:24 JST 2002 ┓ 用意するもの: たっぷりのカレー粉 赤唐辛子 … ┓ 石原和音┓ キムチグラタン┓ Wed May 23 17:34:11 JST 2002 ┓ 材料 ご飯(多少古くてもよい) チーズ … ┓ O 岩元┓ 対話システム論ラーメン┓ Wed May 23 17:36:02 JST 2002 ┓ UI 論、 TUT 、認知心理学、 KJ 法等をベースにグルワと … ┓
27
ホントにルール守られて る? while(true) { //contributor, title, date, content の順で読み込む String contributor = reader.readLine(); if( contributor == null ) { // 読み込めなかったらファイルの終わりなので、無限ループをぬける break; } String title = reader.readLine(); String date = reader.readLine(); String content = reader.readLine(); // レシピを、 contributor, title, date, content の順で書き込む writer.write(contributor); writer.newLine(); writer.write(title); writer.newLine(); writer.write(date); writer.newLine(); writer.write(content); writer.newLine();
28
実習です 重要な言葉は定義しましょう ファイル形式を決めましょう では、がんばってください!
29
Presented by CreW
30
今回やること 投稿されたレシピをファイルに保存する 投稿されたとき、レシピをファイルに書き 込む レシピを見たいとき、ファイルから読み出 す (保存する=書き込む+読み出す) Java でファイルを扱うとき、ストリーム というものを使います
31
ストリームの分類 どんなデータを? 「文字列を」 ~ Reader, ~ Writer 族を使います どこから?/どこへ? 「ファイルに」 FileReader, FileWriter どうやって バッファリング BufferedReader, BurreredWriter
32
ブラウザ投稿サーブレット 主婦が「投稿」ボタンを 押すと 一覧サーブレット レシピファイル 新・レシピの行方 主婦が一覧画面を見ると HTTP POST doPost() HTTP GET doGet() レシピを見ることができる!
33
ブラウザ奥様 WEB サーブレット 旧・レシピの行方 主婦が「投稿」ボタンを 押すと HTTP POST でレシピが投稿される doPost() × レシピの HTML がブラウザに送られる doPost() の処理が終了すれ ばサーバ側のレシピは消滅 主婦には今自分 が投稿したレシ ピが見えている
34
プログラムの構成 index.html インデックス(案内とリンク) toukou.html 投稿フォーム画面 ToukouServlet.java レシピ投稿サーブレット IchiranServlet.java レシピ一覧サーブレット recipes.txt レシピ保存ファイル
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.