관리 메뉴

DeseoDeSeo

[Message System 실습] 하나의 servlet파일을 각각의 class파일로 분할 & 인터페이스 생성 본문

JSP

[Message System 실습] 하나의 servlet파일을 각각의 class파일로 분할 & 인터페이스 생성

deseodeseo 2023. 8. 31. 12:46
if( command.equals("JoinService.do")) {
//1. 회원가입 기능 구현
// 일은 JoinService클래스가 하고 다시 FrontController로 돌아옴.
// 자식클래스에서 객체를 생성하고 부모 타입으로 형 변환 => 업 캐스팅
service = new JoinService();

}else if(command.equals("LoginService.do")) {
service = new LoginService();

} else if(command.equals("LogoutService.do")){
service = new LogoutService();


} else if(command.equals("UpdateService.do")) {
//회원정보 수정 기능구현
service= new UpdateService();

}else if(command.equals("MsgSendService.do")) {
//메세지 작성 기능 구현
    service = new MsgSendService();

}else if(command.equals("MsgAllDelete.do")) {
// 메세지 전체 삭제 기능 구현
service = new MsgAllDelete();

}else if(command.equals("MsgDelete.do")) {
// 메세지 개별 삭제 기능 구현
service = new MsgDeleteService();

}

 

추상 클래스와 인터페이스
" 상속받는 클래스 or 구현하는 인터페이스 안에 있는 추상 메서드를 구현하도록 강제한다. "
인터페이스 
 : 모든 메서드가 추상 메서드.
추상클래스
 :
다른 클래스들이 공통으로 가지는 속성과 메서드를 정의하는 데 사용되며 직접적으로 인스턴스화(=  직접 객체 생성)      할 수 없는 클래스.
 < 목적 > 
상속을 통해 하위 클래스에서 공통된 메서드를 정의함 -> 유지 보수가 용이한 코드 !

 

< 인터페이스 생성 > 

package com.front;

import java.io.IOException;

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

public interface ICommand {
	//인터페이스는 틀!
	// 추상메서드는 내용,기능은 없고 이름만 있음.
	//중간에 중괄호가 있으면 실행한다는 내용?! 그래서 세미콜론으로 마무리해야함.
	public String execute( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
		
	

}

 

JoinService.java
package com.controller;

import java.io.IOException;

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

import com.front.ICommand;
import com.model.MemberDAO;
import com.model.MemberDTO;

public class JoinService implements ICommand {
	//아래는 메서드임.
	public String execute( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		System.out.println("회원가입 기능실행");
		
		String email = request.getParameter("email");
		String pw = request.getParameter("pw");
		String phone = request.getParameter("phone");
		String addr = request.getParameter("addr");

		// System.out.println(email + "/" + pw + "/" + phone + "/" + addr);
		
		MemberDTO dto = new MemberDTO(email, pw, phone, addr);
		// System.out.println(dto.toString());
		
		MemberDAO dao = new MemberDAO();
		int cnt = dao.join(dto);
		
		if(cnt > 0) {
			System.out.println("회원가입 성공");
		}else {
			System.out.println("회원가입 실패");
		}
		
		return "main.jsp";
		// frontcontroller에게 마지막으로 이동해야할 주소를 넘김.
	}

}
  • class옆에 implements Icommand 추가
  • return "main.jsp"추가

이런 식으로 클래스 파일 생성함.

MsgSendService
package com.controller;

import java.io.IOException;
import java.io.PrintWriter;

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

import com.front.ICommand;
import com.model.MessageDAO;
import com.model.MessageDTO;

public class MsgSendService implements ICommand{

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		
		System.out.println("메세지 작성 기능실행");
		
		String send_name = request.getParameter("send_name");
		String receive_email = request.getParameter("receive_email");
		String content = request.getParameter("content");
		
		MessageDTO dto = new MessageDTO(send_name, receive_email, content);
		// System.out.println(dto.toString());
		MessageDAO dao = new MessageDAO();
		int cnt = dao.insert(dto);
		
		return "main.jsp#two";
	}
	//인터페이스 사용하는 방법 : implements
	// 사용하는 이유 : execute 사용을 강제 하기 위해서. 
	

}

 

FrontController.java
package com.front;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;

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 javax.servlet.http.HttpSession;

import com.controller.JoinService;
import com.controller.LoginService;
import com.controller.LogoutService;
import com.controller.MsgAllDelete;
import com.controller.MsgDeleteService;
import com.controller.MsgSendService;
import com.controller.UpdateService;
import com.model.MemberDAO;
import com.model.MemberDTO;
import com.model.MessageDAO;
import com.model.MessageDTO;

/**
 * Servlet implementation class FrontController
 */
/* 하단은 url매핑 하는 것 */
/* 무엇으로 .do로 끝나면 여기로 옴, */
@WebServlet("*.do")
public class FrontController extends HttpServlet {
	
	// HashMap 생성
	//홈페이지의 사용자가 폭발적으로 늘어나면 객체 생성(= 새로운 데이터 생성)을 버텨낼 수 없음.
	// 갑자기 객체 생성이 많아지면 ram이 버틸 수 없어서 홈페이지가 다움됨,
    // 그래서 HashMap 사용함.
	// 누가 들어오든 객체 생성을 딱 한번만 함. ( = single ton패턴)
	// key 값에 "JoinService.do" 이게 들어감. value에는 new JoinService();이게 들어가야함.
	// value값은 icommand로 묶으면 됨,
	HashMap<String, ICommand> map = new HashMap<>();
	
	
    //alt +shift + s > override> init메서드 체크하기 
	//init : 생성하다.
	@Override
	public void init() throws ServletException {
		// TODO Auto-generated method stub
		super.init();
		//누군가에 의해서 현재 servlet에 들어오게 된다면 servlet을 실행할 수 있게 생성하는 메서드임.
		// 이 메서드는 최초에 의해서 1번만 실행됨.
		map.put("JoinService.do", new JoinService());
		map.put("LoginService.do", new LoginService());
		map.put("LogoutService.do", new LogoutService());
		map.put("JoinService.do", new JoinService());
		map.put("MsgSendService.do", new MsgSendService());
		map.put("MsgAllDelete.do", new MsgAllDelete());
		map.put("MsgDeleteService.do", new MsgDeleteService());		
	}

	private static final long serialVersionUID = 1L;
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//System.out.println("프론트 컨트롤러 실행");
		
		// 1.client가 요청한 url주소 가져오기
		String requestURI =request.getRequestURI();
		//System.out.println(requestURI);
		
		// 2. Context Path(아주 중요)( 웹 어플리케이션의 시작 주소 )
		String contextPath = request.getContextPath();
		//System.out.println(contextPath);
		
		// 3. client 요청 부분만 분리
		//  출력된 /MessageSystem/LoginService.do  여기에서 LoginService.do 이부분만 출력하기 위해서
		String command = requestURI.substring(contextPath.length()+1);
		//System.out.println(command);
		request.setCharacterEncoding("EUC-KR");

		response.sendRedirect( map.get(command).execute(request, response));
		
		//위에 있는 protected void service에 있는 request랑 보내는 거임.
		/*//인터페이스는 객체 생성 불가능하지만 인터페이스를 물려
		    ICommand service = map.get(command);
		 * String moveUrl = service.execute(request, response);
		 * response.sendRedirect(moveUrl);
		 */
		
		}
}