Presentation is loading. Please wait.

Presentation is loading. Please wait.

レシピを保存しよう! By 石原 今日の目標  WebApplication において、ファイルを用 いた入出力ができるようになる 保存することの意味がわかるようになる ストリームの使い方がわかるようになる.

Similar presentations


Presentation on theme: "レシピを保存しよう! By 石原 今日の目標  WebApplication において、ファイルを用 いた入出力ができるようになる 保存することの意味がわかるようになる ストリームの使い方がわかるようになる."— Presentation transcript:

1

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 レシピ保存ファイル


Download ppt "レシピを保存しよう! By 石原 今日の目標  WebApplication において、ファイルを用 いた入出力ができるようになる 保存することの意味がわかるようになる ストリームの使い方がわかるようになる."

Similar presentations


Ads by Google