2011년 5월 23일 월요일

The Dispatcher View pattern

7. The Dispatcher View pattern
Dispatcher View 디자인 패턴은 두 개의 서브 패턴(Front Controller 와 View Helper)을 합쳐 하나의 Micro 프레임 워크를 만든것이다.
Dispatcher View와 Service-to-Worker 디장니 패턴은 유사한 구조를 가지면서도 두 패턴은 서로 다른 참여 객체를 갖는다. ‘Dispatcher View’는 동적인 뷰가 만들어질 때까지 컨텐츠 검색을 지연하고, 반면에 ‘Service-to-Worker’ 는 컨트롤러 앞에서 컨텐츠 검색을 지연시킨다.

구조

Dispatcher View patterclass diagram

Dispatcher View pattersequence diagram

  • Service-to-Worker에서는 Controller에서 Dispatcher로 요청이 전달 되기 전에 Command 와 Helper 역할자에게 먼저 요청이 전달 되지만 Dispatcher View에서는 Dispatcher로 요청이 전달 된 다음이 된다.
  • JSP와 같은 웹 어플리케이션에서는 Service-to-Worker 패턴으로 비즈니스 요청을 처리 한 후 valueBean을 HttpServletRequest에 담아 View에게 전달 한다. 하지만 Dispatcher View는 valueBean을 view Helper 패턴을 이용하여 가져온다.
  • 두 패턴의 가장 큰 차이점이라면 “비즈니스 메서드가 어디에서 호출 되는가?” 이다.


역할
Controller :
요청을 처리하고, 요청/응답 처리를 중앙 제어하는 시작점이고, 인증, 권한 부여, 그리고 권한 위임을 담당한다.
Dispatcher :
뷰 관리와 내비게이션을 담당한다. 도, 다음 뷰에 권한을 위임한다.
View :
클라이언트에 정보를 보여준다. ‘Dispatcher View’에서 뷰는 ‘View Helper’로 데이터를 데이터 소스로부터 가져온다.
Helper :
뷰 또는 컨트롤러가 처리를 완성할 수 있도록 한다..
Value Bea:
헬퍼의 다른이름이다.
Business Service :
클라이언트가 접근하려는 서비스, 비즈니스 티어에 접근하는 시작점이다. 일반적으로 ‘비즈니스 위임’이라고 한다.

의도
Front Controller 와 View Helper 패턴을 합쳐 장점만을 가진 프레임워크를 만든다.

결론
  • 두개의 서브패턴 ‘Front Controller’와 ‘View Helper’를 합친것이다.
  • 컨트롤러, 디스패처, 뷰 그리고 뷰 헬퍼로 이루어진다.
  • 컨트롤러와 디스패처의 역할이덜 중요하다.
  • 뷰는 동적 생성 시점에 비즈니스 티어로부터 건텐츠검색과 이 데이터의 출력을 담당한다.
  • 뷰와 헬퍼 뒤에 로직과 행위를 많이 넣어 뷰를 가능한 한 복잡하게 만든다. 일반적으로 스크립릿코드나 커스텀 태그가 컨트롤러에서 완성하지 못한 일을 완성시키는 데 필요하다.


예제소스
Service-to-Worker 패턴을 사용한 예제를 Dispatcher View 패턴 으로 변경해 본다.
Class


소스
package dispatcherView;
import java.util.ArrayList;
public class businessService {
private static ArrayList array = new ArrayList();
public businessService() {
}
public static valueBean[] getMailList() {
valueBean[] values = new valueBean[array.size()];
array.toArray(values);
returvalues;
}
public static void addMail(valueBeavalue) {
array.add(value);
}
public static void delMail(valueBeavalue) {
for(int i=0; i<array.size(); i++) {
if(((valueBean)array.get(i)).getName().equals(value.getName()))
array.remove(i);
}
}
}
package dispatcherView;
import javax.servlet.http.HttpServletRequest;
public class AccountingHelper {
private static valueBean[] getMailList() {
returbusinessService.getMailList();
}
private static valueBean[] addMail(valueBeavalue) {
businessService.addMail(value);
returgetMailList();
}
private static valueBean[] delMail(valueBeavalue) {
businessService.delMail(value);
returgetMailList();
}
public static valueBean[] exec(valueBeavalue) {
if(value.getDelegate() == null)
returgetMailList();
else if(value.getDelegate().equals("add"))
returaddMail(value);
else if(value.getDelegate().equals("remove"))
returdelMail(value);
else
returnull;
}
}
package dispatcherView;
import java.io.Serializable;
public class valueBeaimplements Serializable {
private String name;
private String email;
private int age;
private String delegate;
public String getName() {
returname;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
returemail;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
returage;
}
public void setAge(int age) {
this.age = age;
}
public String getDelegate() {
returdelegate;
}
public void setDelegate(String delegate) {
this.delegate = delegate;
}
}
package dispatcherView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestHelper {
private HttpServletRequest request = null;
private HttpServletResponse response = null;
public RequestHelper() {
}
public static String getDispatcherURL(HttpServletRequest request) {
if(getRequestURL(request).equals("/accountDetail"))
retur"/view.jsp";
else if(getRequestURL(request).equals("/accountAdd"))
retur"/view.jsp";
else if(getRequestURL(request).equals("/accountRemove"))
retur"/view.jsp";
else
returnull;
}
public static String getRequestURL(HttpServletRequest request) {
returrequest
.getServletPath()
.substring(request.getServletPath().lastIndexOf("/"),
request.getServletPath().lastIndexOf("."));
}
}
package dispatcherView;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.PrintWriter;
import java.io.IOException;
public class Controller extends HttpServlet {
private static final String CONTENT_TYPE = "text/html; charset=EUC-KR";
public void init(ServletConfig config) throws ServletExceptio{
super.init(config);
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOExceptio{
doProxy(request, response);
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOExceptio{
doProxy(request, response);
}
protected void doProxy(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOExceptio{
dispatch(request, response, RequestHelper.getDispatcherURL(request));
}
protected void dispatch(HttpServletRequest request,
HttpServletResponse response,
String page)
throws ServletException, IOExceptio{
RequestDispatcher dispatcher =
getServletContext().getRequestDispatcher(page);
dispatcher.forward(request, response);
}
}
view.jsp
<%@ page contentType="text/html;charset=EUC-KR"%>
<%@ page import="dispatcherView.*"%>
<jsp:useBeaid="valueObject" class="dispatcherView.valueBean" scope="request"/>
<jsp:setProperty name="valueObject" property="*"/>
<%
valueBean[] va = AccountingHelper.exec(valueObject);
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Dispatcher View Pattern</title>
<SCRIPT>
functioreCall(mode) {
var ff = document.form;
form.delegate.value=mode;
if(mode == 'add')
ff.actio= '<%=request.getContextPath()%>/accountAdd.ctr';
else
ff.actio= '<%=request.getContextPath()%>/accountRemove.ctr';
ff.method = 'post';
ff.submit();
}
</SCRIPT>
</head>
<body>
<P>
<STRONG><FONT size="6">Dispatcher View Pattern</FONT></STRONG>
</P>
<hr/>
<P>
Total Num(<%=va != null ? va.length : 0%>)
<BR/>
<STRONG>Mail List</STRONG>
</P>
<table cellspacing="2" cellpadding="3" border="1" width="100%">
<tr>
<td bgcolor="#cccccc">
<DIV align="center">Name</DIV>
</td>
<td bgcolor="#cccccc">
<DIV align="center">EMail</DIV>
</td>
<td bgcolor="#cccccc">
<DIV align="center">Age</DIV>
</td>
</tr>
<%
if(va != null) {
for( int i = 0; i < va.length; i++ ) {%>
<tr>
<td>
<DIV align="left"><%=va[i].getName()%></DIV>
</td>
<td>
<DIV align="left"><%=va[i].getEmail()%></DIV>
</td>
<td>
<DIV align="left"><%=va[i].getAge()%></DIV>
</td>
</tr>
<%
}
}
%>
</table>
<P>&nbsp;</P>
<P>
<STRONG>Insert &amp; Delete</STRONG>
</P>
<form name="form">
<input type="HIDDEN" name="delegate">
<table cellspacing="3" cellpadding="2" border="1" width="100%">
<tr>
<td width="15%">Name</td>
<td width="85%">
<input type="text" name="name"/>
</td>
</tr>
<tr>
<td width="15%">EMail</td>
<td width="85%">
<input type="text" name="email"/>
</td>
</tr>
<tr>
<td width="15%">Age</td>
<td width="85%">
<input type="text" name="age"/>
</td>
</tr>
<tr>
<td width="15%">&nbsp;</td>
<td width="85%">
<input type="BUTTON" name="addMail" value="Add Mail" omclick="reCall('add');">
<input type="BUTTON" name="delMail" value="Del Mail" omclick="reCall('remove');">
</td>
</tr>
</table>
</form>
<P>&nbsp;</P>
</body>
</html>

댓글 없음:

댓글 쓰기

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...