본문 바로가기

WebStudy/MVC2기반 Shopping mall

Step 6 - Controller, Service, Forward 만들기

착한 친구 Forward를 먼저 만들어 보자.

Service 에서 명령을 수행하고 결과 값을 포워딩 해야하는데

그때 나를 도와주는 착한 친구다.

 

forward클래스는 redirect 여부와 포워딩할 페이지의 위치를 가지고 있다.

 

class name : ServiceForward

package : net.member.service

 

public class ServiceForward {
 private boolean isRedirect = false;
 private String path = null;
 
 public boolean isRedirect(){
  return isRedirect;
 }
 public String getPath(){
  return path;
 }
 public void setPath(String path){
  this.path = path;
  
 }
 public void setRedirect(boolean is){
  isRedirect = is;
 }
}

 

 

 

 

MVC 에서 M : 모듈(영어 철자가...) 에 해당하는 Service 를 만들어보자.

Action 으로 이름 짓는 책도 있고 Service 로 하는 책도 있는데

뭐가 맞는지는 모르겠다.

 

나는 Service 로 만든다. 우왕~!

 

일단 모든 Service는 execute()매소드를 가져야 한다.

그런데 내가 까먹을 수도있으니까 interface를 만들어서 execute() 추상매소드를 만들고

 

모든 Service 클래스는 Service interface 를 구현 해야하기로 하자.

 

interface name : Service

package : net.member.service

 

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface Service {
 public ServiceForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception;
}

 

 

 

이제 /memberSample.me 명령어를 처리해 줄 Sampleservice 클래스를 만들자.

 

class name : SampleService

implements : Service

package : net.member.service

 


import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.member.db.DAOInter;
import net.member.db.MemberDAO;
import net.member.db.MemberDTO;

 

public class SampleService implements Service {

 @Override
 public ServiceForward execute(HttpServletRequest request,
   HttpServletResponse response) throws Exception {

  
  ServiceForward forward = new ServiceForward();
  DAOInter dao = MemberDAO.instanceOf();
  ArrayList<MemberDTO> list = dao.sampleTest();
  
  request.setAttribute("member", list);
  

  forward.setPath("./member/test.jsp");


  return forward;
 }

}

 

 

 

MVC 에서 C에 해당하는 controller 를 만들어 보자.

(연습하는 입장에서 손으로 일일이 쳐봐야 겠지만 귀찮으니까 servlet 으로 생성하자.

servlet name : MemberController

package : net.member.controller

 

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.member.service.SampleService;
import net.member.service.Service;
import net.member.service.ServiceForward;


@WebServlet("*.me")
public class MemberController extends HttpServlet {
 private static final long serialVersionUID = 1L;

    public MemberController() {
        super();
        // TODO Auto-generated constructor stub
    }


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

//get방식과 post방식 모두를 처리하기 위한 doProcess() 매소드 
  try {
   doProcess(request, response);
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }


 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  //get방식과 post방식 모두를 처리하기 위한 doProcess() 매소드 
  try {
   doProcess(request, response);
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

 }

// get 과 post 방식 모두를 처리하기 위한 doProcess() 매소드

 private void doProcess(HttpServletRequest request,
   HttpServletResponse response) throws Exception {
 //주소창에 입력된 전체 URI(주소)를 가져온다

  String RequestRUI = request.getRequestURI();

 

 //주소창에 입력된 전체 URI(주소)에서 project name 까지만 가져온다.

//ex : http://localhost:8080/PROJECTNAME
  String contextPath = request.getContextPath();

 

//주소에서 poject name 이후의 부분만 따로 잘라낸다.
  String command = RequestRUI.substring(contextPath.length());

 

//redirect의 여부와 어떤 경로로 보낼것인가를 처리해줄 ServiceForward
  ServiceForward forward = null;
  Service service = null;
  

 

// test를 하기 위한 command 처리 구문.
  if(command.equals("/memberSample.me")){
   service = new SampleService();
   forward = service.execute(request, response);
   forward.setPath("./member/test.jsp");
  }

  

//view 파트로 요청에 대한 결과를 보내준다.
  if(forward != null){
   if(forward.isRedirect()){
    response.sendRedirect(forward.getPath());
   }else {
    RequestDispatcher dispatcher = request.getRequestDispatcher(forward.getPath());
    dispatcher.forward(request, response);
   }
  }
 }
 
}