感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

MVCパターンの実装例。

スポンサーリンク

ビューを記述するのはJSPがふさわしい。
ビューにサーブレットを使用すると、変更するたびにコンパイルとデプロイをし直す必要があるため、保守管理が大変になる。

最初の画面

<!DOCTYPE html>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-31J">
<html>
<head>
<title>登録</title>
</head>
<body>
  <form action="pettern/ListController" method="get">
        名前:<input type="text" name="name"><br>
        一言:<input type="text" name="message"><br>
   <input type="submit" value="メッセージをBeanに格納!" ><br>
  </form>
</body>
</html>

このユーザの入力画面から、コントローラーがユーザの入力を処理する。
JSPからパラメータを受け取ってBeanに格納するコントローラのコード。

package pettern;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ListController extends HttpServlet {
	public static final String NAME_PARAM =  "name";
	public static final String MESSAGE_PARAM = "message";
	public static final String NAMEBEAN_ATTR = "namebean";
	
	public void init(ServletConfig config) 
	throws  ServletException {
		super.init(config);
	}
	
	public void destroy() {
	}
	
	protected void doGet(HttpServletRequest request,
							HttpServletResponse response)
	throws ServletException, IOException {
		
		System.out.println("コントローラーがGETしました");
		String name = request.getParameter("name");
		String message = request.getParameter("message");
		
		NameBean nb = NameBeanFactory.newInstance();
		
		nb.setName(name);
		nb.setMessage(message);
		
		request.setAttribute(NAMEBEAN_ATTR,nb);
		
		boolean result = nb.doSubscribe();
		
		String nextPage = "/success.jsp";
		if (!result) nextPage = "/failure.jsp";
		
		RequestDispatcher dispatcher =
				getServletContext().getRequestDispatcher(nextPage);
		dispatcher.forward(request, response);
	
	}
	

}

モデルはデータの抽象表現であり、ここではユーザの入力データを格納する。
ModelとしてのBeanのコード。
まずはインターフェース。

package pettern;

public interface NameBean {
	public String getName();
	public void setName(String name);
	
	public String getMessage();
	public void setMessage(String message);
	
	public boolean doSubscribe();
	
	public String getErrorString();
}

で、インターフェースの実装。

package pettern;

import java.util.ArrayList;
import java.util.List;

public class NameBeanImpl implements NameBean {
	private final String ERROR_MESSAGE = "申し訳ありません。エラーです";
	private String name = null;
	private String message = null;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	
	public boolean doSubscribe() {
		if("".equals(message)) {
			return false;
		}
		return true;
	}

	@Override
	public String getErrorString() {
		return ERROR_MESSAGE;
	}
	

}

とりあえず、メッセージが入ってなかったらエラーにした。

NameBeanImplインスタンスを作る工場としてFactoryクラスを作った。

package pettern;

public class NameBeanFactory {
	private static NameBeanImpl nameBean = new NameBeanImpl();
	
	public static NameBeanImpl newInstance() {
		return nameBean;
	}
}

staticメソッド、staticフィールドなので、NameBeanFactoryはインスタンス化しなくても
NameBeanFactory.getInstance()
というように使える。

で、コントローラーによって、返すJSPの振り分けを行う。
振り分けを行なっているのはListControllerの以下の部分。

		boolean result = nb.doSubscribe();
		
		String nextPage = "/success.jsp";
		if (!result) nextPage = "/failure.jsp";

結果を表示するビューとしてのJSP。
success.jsp

<%@page contentType="text/html; charset=Windows-31J" %>
<jsp:useBean id="nameBean" scope="request" class="pettern.NameBeanImpl" />
<html>
<head>
<title>結果</title>
</head>
<body>
<br>
<br>
<jsp:getProperty name="nameBean" property="name" />さん&nbsp;&nbsp;

メッセージは以下の通りですね。
<jsp:getProperty name="nameBean" property="message" />

</body>
</html>

failuer.jsp

<%@page contentType="text/html; charset=Windows-31J"%>
<jsp:useBean id="namebean" scope="request" class="pettern.NameBeanImpl" />
<html>
<head>
<title>
結果
</title>
</head>
<body>
<br>
<br>
<jsp:getProperty name="namebean" property="name" />さん&nbsp;&nbsp;
<br>
<br>
メッセージは以下の通りで、何も入っていませんね。
<br>
<jsp:getProperty name="namebean" property="message"/>
エラーの原因について。<br>
<jsp:getProperty name="namebean" property="errorString" />
</body>
</html>

結果は、メッセージが入っていたらこのようにブラウザに表示される。

mizkyさん   メッセージは以下の通りですね。 you are smart

名前にmizkyといれて、メッセージにyou are smartと入れた。

メッセージを入れないとこう表示される。

mizlyさん   

メッセージは以下の通りで、何も入っていませんね。 
エラーの原因について。
申し訳ありません。エラーです

このようにユーザから受け取ったパラメータをコントローラが振り分けて、
モデルにデータを詰め込み、
適切なビューを返すようにして、MVCパターンは実装される。


もっと詳しく勉強したい人は、J2EEデザインパターンの3章を読むといいです。

J2EEデザインパターン

J2EEデザインパターン

  • 作者: William Crawford,Jonathan Kaplan,福龍興業,佐藤直生,木下哲也
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2004/03
  • メディア: 単行本
  • 購入: 1人 クリック: 18回
  • この商品を含むブログ (17件) を見る