MVC패턴
M - model:DAO(DB접근로직)
V - view : JSP(사용자에게 보여질 모양)
C - controller : servlet(접속 주소 관리)
전체 적인 컴포넌트 설계
1. 접속
2. 주소 분석
3. 다오 실행
4. 데이터 리턴
5. 포워딩
MVC의 컨트롤러 : 서블릿(포워딩만함)
모델 2 구조에서 서블릿은 MVC패턴의 컨트롤러 역할을 합니다. 서블릿은 웹 브라우저의 요청과 웹 어플리케이션의 전체적인 흐름을 제어합니다.
컨트롤러의 흐름 제어 처리 로직
MVC의 뷰: JSP(화면)
모델 2 구조에서 JSP는 뷰 역할을 담당합니다. 뷰 역할을 하는 JSP는 컨트롤러에서 request 객체나 session객체에 저장된 데이터를 사용하여 웹 브라우저에 알맞을 화면을 출력합니다.
뷰 역할을 하는 JSP는 웹 브라우저가 요청한 결과를 보여주는 프레젠테이션의 역할을 할 뿐만 아니라 웹 브라우저의 요청을 컨트롤러에 전달해주는 매개체가 되기도합니다.
즉, 뷰 역할을 하는 JSP는 웹 브라우저가 지속적으로 컨트롤러에 요청을 보낼 수 있는 링크나 폼을 제공해서 웹 브라우저가 업무 흐름에 따라 컨트롤러에게 알맞은 요청을 보낼 수 있도록 합니다.
MVC의 모델(다오)
컨트롤러는 서블릿을 통해 구현하고 뷰는 JSP를 통해서 구현하는데 모델은 명확하게 어떤 것을 통해서 구현한다는 규칙은 없습니다. 단지 비즈니스 로직을 처리해주면 모델이 될 수 있습니다.
컨트롤러의 서블릿이 웹 브라우저의 요청을 분석하여 알맞은 모델을 호출하면서부터 모델의 기능이 시작됩니다. 모델은 컨트롤러가 요청한 작업을 처리한 후 알맞은 결과를 컨트롤러에게 전달하는데, 이때 처리한 결과값을 저장하는 객체로 보통 자바빈을 사용합니다.
컨트롤러는 서블릿 통해 구현
뷰는 jsp통해 구현
모델은 클래스파일로 구현
kr.co.ict.servlet - FrontController서블릿을 생성해줍니다.
주소는 *.do , post,get만 선택합니다.
src/main/java - kr.co.ict.servlet.service 패키지를 생성합니다.
서비스를 처리할수 있는 인터페이스를 생성
kr.co.ict.servlet.service - 우클릭 - interface - IBoardService 생성
다형성 원리를 이용해 프론트컨트롤러가 수행할 명령들을 하나의 타입으로 실행할 수 있도록 도와줍니다.
kr.co.ict.servlet.service - BoardListService 클래스 생성
Add unimplemented methods를 눌러주면 됩니다.
ㄴ아이보드서비스 타입으로 보드리스트서비스를 호출할수 있다.
boardListServlet로가서 바인딩까지 복사해와서 붙여줍니다.
(포워딩은 컨틀롤러에서 처리할꺼기 때문)
FrontController
맨 밑에다가
private void doRequest()- 요청처리
doGet이랑 doPost가 doRequest를 호출
doRequest부분으로 와서(공용메서드)
post방식도 처리하게 될 수 있으므로 인코딩 설정해줍니다.
doRequest로 통일해서 처리 할려면
프론트 컨트롤러는 여러 주소 요청을 처리하기 때문에 uri부터 받아옵니다.
포워딩할 .jsp파일의 경로를 미리 저장해둘 변수
다형성을 이용해 요청주소에 따른 처리해줄 서비스
ㄴ.do로 접속하면 여기로 들어옴
sv = new BoardListService(); 서비스를 만들어주고
execute(request, response)해주고
ui = "/board/boardlist.jsp; 포워딩 주소를 ui에 저장해준다.
ㄴ 타입이 다름에도 불구하고 ,아이보드서비스를 구현한게 보드리스트 서비스이기 때문에 다용성원리로 인해 아이보드서비스 변수에는 뭐든지 다 넣을수 있다.
위쪽 if~else문을 다 호출한 다음 실제로 포워딩 실행해준다.
/boardList.do로 치면
리스트로 잘 이동된다.
ㄴ 뭘로 접속했던지간에 .do로 끝났기 때문에 프론트컨트롤러랑 매칭이됨
그러면 정해진 주소 이외의 주소로 접속햇을떄 메인페이지로 보내주는 포워딩 구문은
ui="/"; 입니다
========문제========
1.BoardDetailServlet을 커맨드 패턴화 시켜보겠습니다.
서비스 클래스를 생성하고 내부 메서드를 옮겨주세여.
-> kr.co.ict.servlet.service - BoardDetailService 클래스를 생성
implements 해주고
BoardDetailServlet에서 바인딩까지 복사
FrontController
else if를 넣어서 추가 해주면 된다.
확인해보면
주소창에 /boarddetail?board_num=1 입력하면 그 창으로 가지는걸 확인 가능