第1章
はじめてのデザインパターン  

第2章
逆引きカタログ ロジック編

第3章
逆引きカタログ J2EE編

第4章
逆引きカタログ その他

第5章
デザインパターン適用の勘所

第5章 デザインパターン適用の勘所

Authors:Agata Toshitaka

リファクタリング前のサーブレット

図2 サンプルのクラス図(その1)
M子:
「先輩、商品情報登録の部分できましたよ(リスト1)。 サーブレットは何度もやっているので、簡単でした。」

リスト1 FileUploadServlet1.java
/**
 * ファイルアップロードサーブレット1です。
 * (リファクタリング前)
 */
public class FileUploadServlet1 extends HttpServlet {
  protected void doPost(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
	try {
@
	  // アップロードされたファイルを取得
	  FileUpload fileUpload = new FileUpload();
	  fileUpload.setSizeMax(1000000);

	  // マルチパートデータを取得
	  List fileItems = fileUpload.parseRequest(req);
// 商品コードの取得 String itemCode = null;
A
	  for (Iterator iter = fileItems.iterator(); iter.hasNext();) {
		FileItem item = (FileItem) iter.next();
		// フィールド名が"code"ならファイルからファイル処理を実行する
		if(""code".equals(item.getFieldName())) {
			itemCode = item.getString();
		}
	  }
B
	  // アップロードされたファイルの処理
	  for (Iterator iter = fileItems.iterator(); iter.hasNext();) {
		FileItem item = (FileItem) iter.next();
		// フィールド名が"file"ならファイル処理を実行する
		if ("file".equals(item.getName())) {
			String filename = item.getName();
			byte[] data = item.get();
			// ファイルが画像だった場合
			if ("item.jpg".equals(filename)) {
			  ImageDao dao = new ImageDao();
			  dao.update(itemCode, filename, data);
			// ファイルがinfo.txtだった場合
			} else if (""info.txt".equals(filename)) {
			  InfoDao dao = new InfoDao();
			  String info = new String(data, "Windows-31J");
			  dao.update(itemCode, info);
			}
		}
	  }
} catch (FileUploadException e) { throw new ServletException(e.getMessage(), e); } } }
O先輩:
「どれどれ、なるほどわかりやすくシンプルにまとまっているね。」
M子:
「でしょ。前に先輩に言われたとおり、データベースアクセスはDAOクラスにまとめたんですよ。 それから、ファイルアップロードはWebで調べてJakarta Commons FileUploadを使いました。」
O先輩:
「良く調べたね、えらい! ところで、作ってて気になったり、もっとうまく書けそうな部分ってなかった かい?」
M子:
「そうですねぇ、実はリスト1-@Aが気になっているんですよ。 フィールド名に一致するFileItemを見つけるためにループを回しているんですけど、商品コードを先に取得しないといけないんで、似たようなwhileのループが2箇所もでてきちゃっていて・・・」
O先輩:
「確かにそうだね。フィールド名からFileItemが取得できるユーティリティクラスがあったら便利だね。 これから別のサーブレットでもCommons FileUploadを使うことが決まっているし、ユーティリティクラスにまとめてくれないかな。 リスト1-@の最大ファイルサイズの設定やマルチパートデータの取得処理も、Commons FileUploadを使うときには定型的な処理になるから、これもユーティリティに入れちゃおうか。」
M子:
「ユーティリティクラスですね、わかりました。やってみます」
TOP