libro
www.tuyano.com
Google App Engine for Java(GAE/J)プログラミング入門

Google Cloud Storageを利用する (4/5)

作成:2012-06-10 11:17
更新:2012-06-10 11:28

■テキストファイルの読み書きを行う

では、テキストファイルアクセスの基本が一通りわかったところで、実際の利用例を挙げておきましょう。

下に、helo.jspMyGaeAppServlet.javaのソースコードを掲載しておきました。これは、JSPベースで作られた投稿&内容表示ページと、そこから呼び出されるサーブレットで構成されています。helo.jspにアクセスすると、タイトルとコンテンツの内容を入力するフォームが表示されます。ここで適当に書いて送信すると、その内容をCloud Storageの「my_cloud_data」という名前のバケットに「sample.txt」という名前で保存します。

保存された内容は、helo.jspにアクセスした際にサーブレット経由でロードされ、画面に表示されます。さまざまにテキストを送信して、値が保存されていることを確認しましょう。また、動作が確認できたら、Cloud Storage Managerでバケットの中身を確認してみてください。「sample.txt」というファイルができているはずです。

ここでは、MyGaeAppServletdoGetでファイルからのロードを、doPostでファイルへのセーブをそれそれ行うようにしています。helo.jspのフォームをPOST送信したら、その内容が保存されるというわけです。またhelo.jspでは、<jsp:include>を使ってMyGaeAppServletサーブレットを埋め込むことで、doGetで出力される内容を埋め込んで表示させています。

注意点としては、まずファイルをロードする際、openReadChanneltry内で実行しています。openReadChannelは、指定したファイルが見つからなかった場合、FileNotFoundExceptionが発生します。これを処理する必要があります。

保存については、GSFileOptionsBuilderでファイルの設定情報を作成する際、メソッド類がすべてメソッドチェーンを使って続けて記述されていますね。この書き方は多用されるので覚えておくとよいでしょう。

また、MimeタイプはsetMimeType("text/html")としていますね。テキストデータですので、HTMLに指定しておきました。HTMLでないなら、"text/plain"でもよいでしょう。

アクセス権の設定は、setAcl("public_read")と設定しています。これは一般に読み込みを許可するという設定です。アクセス権には以下のようなものが用意されています。
project_private
private
public_read
public_read_write
authenticated_read
bucket_owner_read
bucket-owner_full_control
とりあえず「非公開ならprivate、外部から読めてもいいならpublic_read」と覚えておくとよいでしょう。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※helo.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
		pageEncoding="utf-8"%>
<%@ page import="java.util.ArrayList" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Sample jsp</title>
<style>
h1{
	font-size: 16pt;
	background: #AAFFAA;
	padding: 5px;
}
table tr td {
	background: #DDFFDD;
	padding: 2px;
}
pre {
	background: #EEFFFF;
	padding: 5px;
}
</style>
</head>
<body>
	<h1>Hello App Engine!</h1>
	<hr>
	<pre id="msg"><jsp:include page="/mygaeapp"/></pre>
	<hr>
	<form method="post" action="/mygaeapp">
	<table>
		<tr>
			<td>タイトル</td>
			<td><input type="text" id="title" name="title"
				size="40"></td>
		</tr>
		<tr>
			<td>コンテンツ</td>
			<td><textarea id="content" name="content"
				cols="40" rows="5"></textarea></td>
		</tr>
		<tr>
			<td></td>
			<td>
				<input type="submit" value="送信する">
			</td>
		</tr>
	</table>
	</form>
	<hr>
</body>
</html>



※MyGaeAppServletクラス

package com.tuyano.libro.mygaeapp;

import java.io.*;
import java.nio.channels.Channels;

import javax.servlet.http.*;

import com.google.appengine.api.files.*;
import com.google.appengine.api.files.GSFileOptions.GSFileOptionsBuilder;

@SuppressWarnings("serial")
public class MyGaeAppServlet extends HttpServlet {
	public static final String BUCKETNAME = "my_cloud_data"; // バケット名
	public static final String FILENAME = "sample.txt"; // ファイル名

	public void doGet(HttpServletRequest request, 
			HttpServletResponse response)
			throws IOException {
		response.setContentType("text/plain");
		request.setCharacterEncoding("utf8");
		response.setCharacterEncoding("utf8");
		PrintWriter out = response.getWriter();
		String filename = "/gs/" + BUCKETNAME + "/" + FILENAME;
		FileService fileService = FileServiceFactory.getFileService();
		AppEngineFile readableFile = new AppEngineFile(filename);
		FileReadChannel readChannel = null;
		try {
			readChannel  = fileService.openReadChannel(
					readableFile, true);
			BufferedReader reader = new BufferedReader(
					Channels.newReader(readChannel, "UTF8"));
			String line = null;
			while((line = reader.readLine()) != null){
				out.println(line);
			}
		} catch(FileNotFoundException e){
			out.println("no file...");
		} finally {
			try {
				readChannel.close();
			} catch(Exception ex){}
		}
	}

	public void doPost(HttpServletRequest request, 
			HttpServletResponse response)
			throws IOException {
		response.setContentType("text/plain");
		request.setCharacterEncoding("utf8");
		response.setCharacterEncoding("utf8");
		String title = request.getParameter("title");
		String content = request.getParameter("content");
		FileService fileService = FileServiceFactory.getFileService();
		GSFileOptionsBuilder optionsBuilder = new GSFileOptionsBuilder()
				.setBucket(BUCKETNAME)
				.setKey(FILENAME)
				.setMimeType("text/html")
				.setAcl("public_read");
		AppEngineFile file = fileService
				.createNewGSFile(optionsBuilder.build());
		FileWriteChannel writeChannel = fileService.openWriteChannel(file, true);
		PrintWriter ch_out = new PrintWriter(Channels
				.newWriter(writeChannel, "UTF8"));
		ch_out.println(title);
		ch_out.println();
		ch_out.println(content);
		ch_out.close();
		writeChannel.closeFinally();
		response.sendRedirect("/helo.jsp");
	}

}

※関連コンテンツ

「Google App Engine for Java(GAE/J)プログラミング入門」に戻る