Home > プログラミング基礎

プログラミング基礎 Archive

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • Comments (Close): -
  • TrackBack (Close): -

Google App Engine -メール送信機能-

新人のDXです。。。

先日、Google App Engine(以下GAE)にてメール機能を持ったwebアプリケーションを作成いたしました。GAEアプリケーションの開発にはJava、Pythonの2つが利用できます。今回はJavaを用いました。

開発までの準備

GAEアプリケーション開発のための環境の準備ですが、下記サイトのスタートガイドを参考に設定してください。
・Google App Engine トップページ
http://code.google.com/intl/ja/appengine/
Google App Engine - Google Code_1275112979965

アプリケーションについて

今回作成したアプリケーションでは、入力した宛先に件名と本文送信するシンプルなものとなっています。
また、危険なメールを送られないように合言葉を設定しています。
mail sender..._1275112900990
見た目に関してはjsp、メールを送る部分に関してはjavaのservletを用いて記述しています。

jspの<form>の中身は以下のようになっています。

	<form method="post" action="/mailsender">
	 <table>
	  <tr><td>宛先: <input type="text" name="address"></td></tr>
	  <tr><td>件名: <input type="text" name="title"></td></tr>
	  <tr><td>本文:<br><textarea name="message" cols="50" rows="10"></textarea></td></tr>

		<tr><td>
		<center>
		<br><br>
		
	  <table border="1" bgcolor="#f0fff0" bordercolor="#008844">
	   <tr>
	   <td><font color="#005522">合言葉: </font><input type="password" name="pass"></td>
	   <td>
	   <input type="submit" name="send" value="送信" style="color: white; background-color: #007f91; border:double #ccffcc;">
	   </td>
	   </tr>
	  </table>
		
		</center>
		</td></tr>

	 </table>
	</form>

ここで入力された値をPOSTで送り、以下のservletのdoPostメソッドで受け取って処理します。 doPostメソッドは以下の通りです。

	public void doPost (HttpServletRequest req, HttpServletResponse resp)
	throws IOException
	{
      //送られてきた値の取得
		String address = req.getParameter("address");
		String title = req.getParameter("title");
		String message = req.getParameter("message");
		String pass = req.getParameter("pass");
		
      //宛先が入力されているか確認
		if ( address == null || address.length() == 0 ) {
			resp.getWriter().println("宛先を入力してください。");
		}
		else  {
      //合言葉があっているか確認
			if ( !pass.equals("sesame") ) {
				resp.getWriter().println("合言葉が間違っています。");
			}
			else {
	    try{

      //メールの設定(宛先・件名・本文)
      //メール送信

	    }catch(MessagingException e){
	     e.printStackTrace();
	     return;
	    }
      //送信完了メッセージの表示
			}
		}
	}

これで件名と本文だけのメールを送ることができます。


付録:Logger

アプリケーション作成中にエラーが出現し、プログラムがどこで滞っているか調べる際にLoggerクラスを利用しました。

       //作っているservletのクラスのLoggerオブジェクトを取得
	private static final Logger log = Logger.getLogger(MailsenderServlet.class.getName());

	public void doPost (HttpServletRequest req, HttpServletResponse resp)
	throws IOException, ServletException
	{
        //メール送信プログラム
        //ログを表示させたい場所で表示させたいレベルでログを指定
    
        //一般的な情報
         log.info("一般的な情報を表示します。");
        //警告
         log.warning("警告を表示します。");
        //致命的エラー
         log.severe("致命的なエラーを表示します。");
        }

・Loggerクラス
http://java.sun.com/javase/ja/6/docs/ja/api/java/util/logging/Logger.html

Loggerクラスのメッセージは、GAEのMy Applicationsのページから見たいApplicationのページへ行き、Logsを選択します。
Logs - Mailsender_1275149196343
ここでログを確認することができます。

開発途中でつまずいたときに便利ですね。

それでは。。。

アップロード基礎

バーボンです。
弊社で一部開発(企業様向けエントリーサイト、グッドデザイン通過対象公開サイト等)をさせていただいている、デザイン振興会様のイベントであるご存じグッドデザインエキスポがあと10日を切りました。 こちらで今年のグッドデザイン選考一次通過対象が見られます!
対象への応援コメントもかなり盛り上がってます。エキスポが待ち遠しい…
以上お知らせでした。

さて、アプローチの仕方が多様かつ奥の深いファイルアップローダについて調べてみました。

*ファイルアップロード処理の流れ

ざっと以下のような感じです。が、それぞれの過程で奥が深いです。
①入力画面でファイル選択ボタンでファイルを選択、送信(multipartリクエスト)。
②アプリケーション側でmultipartリクエストを受信
③文字コードの指定、ファイル取得
④アップロード先にファイルを出力 今回は①に的を絞り調べてみました。

*multipart形式とは

MIME(Multipurpose Internet Mail Extension)型の1つ。MIMEなので初めはメールに使用するものだったのですが、現在はHTTPリクエストでもMIMEが援用されています。
multipartは本文をコンテンツのContent-Type毎に区切り文字(boundary)で分割することで複数のコンテンツを扱えるものです。
以下のようなフォームでファイルを扱います。

multipartのサブタイプ(form-dataに相当する部分)はメールやセキュリティに使うものなどでいろいろありますが、ファイルのアップロードでmultipartを使用する場合は、enctype(MIMEの指定)="multipart/form-data"とします。これはメールでのmultipart/mixedとほぼ同じです。また、enctypeのデフォルトは「enctype=application/x-www-form-unlencoded(属性なし)」です。

アップロードされたファイルのソースはこのようになっています。

Content-Type: multipart/form-data; boundary=--ppabsP
---ppabsP

Content-Disposition: form-data; name="name"
Burbon //名前
---ppabsP

Content-Disposition: form-data; name="file"; filename="file.txt"Content-Type: text/plain
This is a sample file... //テキストファイル
---ppabsP

【Content-Type】コンテントがどのようなデータであるかを明記する方法を規定。
【Content-Disposition】コンテントをどのように表示すべきかという処理の仕方を規定。

Java コレクションについて些細な事

どうもーガッツでございます。
やっと巨人が勝ちました。今日はクルーンいい結果で良かったです!
それと甲子園ではすごい試合になってまして、非常に面白い内容だったみたいです。
去年行ってないので今年は1回ぐらい野球見に行きたいものです。

これで2回目のエントリーなります。
今回はJavaのコレクションについて少し書いていこうと思います。

コレクションを扱う際に気をつける点

気をつけなければいけない点として、コレクションのデータの格納は実際のデータを コピーするのではなく、そのデータへの参照を作成することでデータを格納しているという点です。
(コレクションに限ったことではないですが)
参照渡しなので当り前なのですが、プログラムの別の部分がそのコレクションデータへの参照を持っている可能性があるということを、自分は忘れてしまってハマったことがありましたので・・・。

もう一点

顧客が購入した商品を表示する。という場合に次のクラスを用意して 考えてみます。


Customerクラス

public class Customer implements Serializable
{
	private String name;
	
	private Set<Purchase>purchaseList;
	
	public String getName() {
		return name;
	}

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

	public void SetPurchaseList(Set<Purchase> purchaseList)
	{
		this.purchaseList = purchaseList;
	}
	
	public Set<Purchase> getPurshaseList()
	{
		return purchaseList;
	}
}


Reportクラス

public class Report {
	public static void makeReport(Customer customer)
	{
		if (customer == null) {
			throw new NullPointerException();
		}
		
		// 顧客名の表示
		System.out.println("購入者:" + customer.getName());
		
		Set<Purchase> purchaseList = customer.getPurshaseList();
		
		// 購入商品の表示
		System.out.println("購入商品:");
		if (purchaseList != null) {
			for (Purchase purchase : purchaseList)
			{
				System.out.println(purchase.getName());
			}
		}
		
		// 購入数の表示
		System.out.println("購入数:");
		if (purchaseList != null) {
			System.out.println(purchaseList.size());
		}
		else {
			System.out.println(0);
		}
	}
}


ReportクラスのmakeReportメソッドは顧客の購入商品を表示する役割がありますが、 購入商品のリスト(purchaseList)に対して常にnullかどうかチェックを行っていて、少し冗長になってしまっています。CustomerクラスのpurchaseListが初期化されていない可能性があるため、nullチェックを行わなければならなくなっています。

この場合、Customerクラスの5行目を

private Set<Purchase> purchaseList;
↓
private Set<Purchase> purchaseList = new HashSet<Purchase>();
とすることで、makeReportメソッドでのpurchaseListのnullチェックはいらなくなります。(CustomerクラスのsetPurchaseListでnullがセットされないことが前提ですが。)

こんな感じで、コレクションはデータがない場合には空をセットしておいたほうがいい場合もあるのではと思いました。


というわけで以上です。

Home > プログラミング基礎

Recent Comments
Recent Trackback
Search
Meta
Links
Feeds

Page Top

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。