servlet design pattern

Post on 22-May-2015

441 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

builder pattern

TRANSCRIPT

Design Pattern Apply For Servlet/JSP servlet으로 배우는 디자인 패턴

#1 builder Pattern

Target Audience

디자인패턴 공부할 때는 콘솔에 HelloWorld만 찍어봤는데

웹은 어떻게 하나요??

세미나를 들어도 스터디를 해도 적용이 안되요.

저녁에는 디자인패턴 책보고 회사에선 c+v 하고 있어요.

Pre require expreience

experience with using on java based application

knowledge of web

Servlet의 기본 메소드들

doGet, doPost

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

System.out.println("doPost 메소드 호출");

response.setCharacterEncoding("UTF-8");

request.setCharacterEncoding("UTF-8");

PrintWriter writer = response.getWriter();

//contenTtype을 정의한다.

response.setContentType("text/html");

String name = request.getParameter("nameTxt");

String email = request.getParameter("emailTxt");

writer.println("<html>");

writer.println("<head><title>hello servlet3 </title> </head>");

writer.println("<body>");

writer.println( "전달받은 이름은 " + name + "이고" + "<br/>" + "email주소는" + email +"입니다." );

writer.println("</body>" );

writer.println( "<html>" );

}

xml을 달라고하면? excel을 달라고하면? 이게 라이브러리 문제인가? 왜 이 서블릿은 post요청이 왔을 때 늘 html로 보여줘야 하나? printWriter를 반복해서 양식(HTML)을 만들고 있다. 와이파이 되요? rest webservice 되요? 시대에..

Builder Pattern이란?

생성관점

앞서 보았던 html생성하던 코드는 내용(전달받은 내용:입니다.)

을 찍기에는 꽤나 복잡하다. 그리고 printWriter가 순차적으로

실행되어야 한다.

이렇게 객체 생성 시에 복잡하고 얽혀있는 관계들을 단순하게

분리해 낸 것을 builder pattern이라고 한다.

Builder Pattern Diagram

+BuildPart()

+GetProduct()

ConcreteBuilder

+BuildPart()

+GetProduct()

AbstractBuilder

+Build()

Director

Client

Product

Requests build

Uses

Creates

Uses

1

1

1

*

1

1

1

1

각 클래스의 역할

Builder는 실제로 문서의 요소들을 만드는 역할을 한다.

Director는 builder를 선택해서 최종적인 문서를 완성한다.

기존 코드 분석

html 생성

Header 생성

body 생성

body안에 내용삽입

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

System.out.println("doPost 메소드 호출");

response.setCharacterEncoding("UTF-8");

request.setCharacterEncoding("UTF-8");

PrintWriter writer = response.getWriter();

//contenTtype을 정의한다.

response.setContentType("text/html");

String name = request.getParameter("nameTxt");

String email = request.getParameter("emailTxt");

writer.println("<html>");

writer.println("<head><title>hello servlet3 </title> </head>");

writer.println("<body>");

writer.println( "전달받은 이름은 " + name + "이고" + "<br/>" + "email주소는" + email +"입니다." );

writer.println("</body>" );

writer.println( "<html>" );

}

Builder 클래스 작성

html 생성

Header 생성

body 생성

body안에 내용삽입

Html builder 클래스 작성

XmlBuilder 클래스 작성

Director 클래스 작성

Director 클래스는 builder 클래스에서

정의한 메소드들을 이용해서 실제 문서를 만드는 역할을 한다.

builder들은 공통된 메소드들을 가지고 있어서 실제로 builder가 어떤 타입의 문서를 만드는지는 director가 알 필요가 없다.

servlet에서 사용하기 때문에 여기서는 편의상 close메소드를 이용해서 문자열을 반환하기로 했다.

Director 클래스 리펙토링1

문서를 생성하는 construct안에 요소를 생성하는 메소드의 파라메터 하드코딩 제거

public String construct(String type, String header, String data){ builder = factory.createBuilder(type); builder.makeRoot( type ); builder.makeHeader( header ); builder.makeBody( data ); return builder.close(); } }

Director 클래스 리펙토링2

builder는 추상클래스라 직접적인 인스턴스 생성이 안됨

안되는데 왜 생성자에서 전달받고 있나. factory한테 넘기자

private Builder builder;

BuilderFactory factory;

public Director() {

factory = new BuilderFactory();

} 이제 director는 builder타입 인자 안 받고 그냥 딱 생성하는

걸로

factory클래스 추가

나의 type별 builder 생성을 서블릿에게 알리지 말라.

public Builder createBuilder(String type){

Builder builder = null;

if( type.equals("html") )

{

builder = new HTMLBuilder();

}

else if( type.equals("xml") )

{

builder = new XMLBuilder();

}

return builder;

}

기존 서블릿

파라메터에서 타입을 받아서 처리하자.

기존 서블릿 if문과의 이별

쫌 이제 우리 그만 좀 헤어지자.

PrintWriter out = resp.getWriter();

String type = req.getParameter("docType") == null ? "html" : req.getParameter("docType");

Director director = new Director();

out.println(director.construct(type, "builder pattern servlet", “content 1234"));

실행결과

html

xml

https://www.facebook.com/thecodinglive

top related