'Command'에 해당되는 글 1건

  1. 2009.09.03 스터디 09/05(JSP&Servlet Model, MVC) by 대절님

//웹어플리케이션 모델 : 많은 개발자들이 사용하는 표준화 된 아키텍쳐

-웹어플리케이션 개발시 적용 디자인패턴
FrontController패턴
Command패턴
Service Locator패턴
Fast Lane Reader패턴
MVC패턴

//Model 1 Architecture
모든 클라이언트 요청과 응답을 JSP가 담당하는 구조

클라이언트 <-> JSP(View, Controller) <=> Model <-> DB

장점 : 단순한 페이지 작성으로 쉽게 구현가능, 중소형 프로젝트에 적합
단점 : 웹 애플리케이션이 복잡해지면 유지보수 문제가 발생

//Model 2 Architecture(MVC design pattern)
클라이언트의 요청처리와 응답처리, 비지니스 로직처리하는 부분을 모듈화시킨 구조

클라이언트 -> 서블릿(Controller) <-> Model <-> DB
           <- JSP(View)

장점 : 처리작업의 분리로 인해 유지보수와 확장이 용이
       개발자와 디자이너의 역활과 책임구분이 명확
       컴포넌트의 재사용성이 높아짐
단점 : MVC구조에 대한 이해가 필요하며 개발자의 높은 skill이 요구됨

-Controller : 서블릿이 Controller역활을 담당
              클라이언트의 요청 분석, 필요한 Model호출, 처리결과를 보여주기위한 JSP선택
-View : JSP가 View역활담당
-Model : DB연동과 같은 비지니스 로직 처리

예제) 목록보기, 글쓰기

클라이언트 -> BoardFrontController(서블릿) <-> Command(list, write) <->BoardDAO <-> DB
           <- list.jsp, write.jsp

*boardForntController.java
public class BoardFrontController extends HttpServlet{
  public void doGet(HttpServletRequest request, HttpServletResponse response){
    doProcess(request, response);
  }
  public void doPost(HttpServletRequest request, HttpServletResponse response){
    doProcess(request, response);
  }
  public void doProcess(HttpServletRequest request, HttpServletResponse response){
    sout('콘트롤러 호출');
    //목록보기
    ListCommand command = new ListCommand();
    command.execute(request, response);

    RequestDispatcher dis = request.getRequestDispatcher('list.jsp');
    dis.forward(request, response);
  }
}

*web.xml
<web-app>
  <servlet>
    <servlet-name>aaa</servlet-name>
    <servlet-class>test.web.BoardFrontController</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>aaa</servlet-name>
    <url-pattern>/board</url-pattern>
  </servlet-mapping>
</web-app>


*ListCommand.java
public class ListCommand{
  public void execute(HttpServletRequest request, HttpServletResponse response){
    sout('ListCommand호출');
    BoardDAO dao = new BoardDAO();
    ArrayList list = dao.list();
    request.setAttribute('list', list);        //scope를 이용 Model과 View사이 데이터 공유 요청했을때 내용을 보여주는것 request가 적당
  }
}


*BoardDAO.java
public class BoardDAO{
  private DataSource dataFactory;
  public BoardDAO(){
    Context ctx = new InitialContext();
    dataFactory = (DataSource)ctx.lookup('java:comp/env/jdbc/Oracle9i');
  }
  public ArrayList list(){
    ArrayList list = new ArrayList();
    connection con = dataFactory.getConnection();
    Statement stmt = con.createStatement();
    String query = 'SELECT * FROM board';
    ResultSet rs = stmt.executeQuery(query);
    while(rs.next()){
      String num = Integer.toString(rs.getInt('num'));
      String author = rs.getString('author');
      String title = rs.getString('title');
      String email = rs.getString('email');
      Timestamp writeday = rs.getTimestamp('writeday');
      BoaredTO data = new BoardTO();
      data.setNum(num);
      data.setAuthor(author);
      data.setTitle(title);
      data.setEmail(email);
      data.setWriteday(writeday);
        list.add(data);
    }
    rs.close();
    stmt.close();
    con.close();
  }
  return list; 
}


*list.jsp
<%@ page contentType='text/html; charset=euc-kr'%>
<%@page import = 'java.util.ArrayList'%>
<%@page import = 'test.web.BoardTO'%>
<%@page import = 'java.sql.Timestamp'%>
<%
  ArrayList list =(ArrayList)request.getAttribute('list');
%>

<html>
  <body>
    <table>
      <tr>
        <td>번호</td>
        <td>제목</td>
        <td>작성자</td>
        <td>이메일</td>
        <td>날짜</td>
      </tr>
<%
    for(int i = 0; i <list.size(); i ++){
      BoardTO data = (BoardTO)list.get(i);
      String num = data.getNum();
      String title = data.getTitle();
      String author = data.getAuthor();
      String email = data.getEmail();
      Timestamp writeday = data.getWriteday();
%>
    <tr>
      <td><%=num%></td>
      <td><%=title%></td>
      <td><%=author%></td>
      <td><%=email%></td>
      <td><%=writeday%></td>
    </td>

 

//Command 패턴
사용자가 어떤 요청을 했는지를 판단하기 위한 가장 쉬운방법, 명령어로 사용자의 요청을 판단
요청 파라미터를 이용 사용자의 요청을 서블릿으로 넘긴다.

예) Command패턴 & writeCommand 추가
*BoardFrontController
public void doProcess(HttpRequest request, HttpServletResponse){
  String action = request.getParameter('action');
  String nextPage = '';
  if(action.equals('list')){
    ListCommand command = new ListCommand();
    command.execute(request, response);
    nextPage = 'list.jsp';
  }
  if(action.equals('write.ui')){
    nextPage = 'write.jsp';
  }
  if(action.equals('write.do')){
    WriteCommand command = new WriteCommand();
    command.execute(request, response);
    nextPage = 'board?action=list";
  }
  RequestDispatcher dis = request.getRequestDispatcher(nextPage);
  dis.forward(request, response);
}


*list.jsp에 글쓰기 링크 작성 </table>태그 끝에 <a href = 'webapp/board?action=write.ui'>글쓰기</ai>

*wirte.ui
action = write.do
글쓰는 폼

*WriteCommand{
public class WriteCommand{
  public void execute(HttpServletRequest request, HttpServletResponse response){
    String author = request.getParameter('author');
    String email = request.getParameter('email');
    String title = request.getParameter('title');
    String content = request.getParameter('content');
    String passwd = request.getParameter('passwd');
 
    BoardTO data = new BoardTO();
    data.setAuthor(author);
    data.setEmail(email);
    data.setTitle(title);
    data.setContent(content);
    data.setPasswd(passwd);
   
    BoardDAO dao = new BoardDAO();
    data.setNum(dao.getNewPrimaryKey());
    data.write(data);
  }
}

*BoardDAO 에 write추가
  public String makeField(String str){
    return""+str+"";
  }
  public void write(BoardTO data) {
    Connection con = null;
    Statement stmt = null;
    con = dataFactory.getConnection();
    stmt = con.createStatement();
    String query = 'INSERT INTO board(num, author, email, title);
    query += data.getNum() + ",";
    query += makeField(data.getAuthor())+",";
    query += makeField(data.getEmail())+",";
    query += makeField(data.getTitle())+",";
    query += makeField(data.getContent())+",";
    query += makeField(data.getPasswd())+",";
    query += data.getNum() + ")";
    stmt.executeUpdate(query);
    stmt.close();
    con.close();
  }

 


 

저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by 대절님
TAG ,

댓글을 달아 주세요



티스토리 툴바