JSP_11_FrontController 패턴
[FrontController 패턴]
- 필요한 이유
- 파일마다 중복되는 코드 예)한글 인코딩, 세션 객체 선언
- 기능마다 파일이 만들어서 개발이 복잡함
- Servlet의 용량이 크고, 같은 기능의 반복으로 효율성 저하
→클라이언트의 다양한 요청을 한 곳으로 집중시켜 개발 및 유지보수의 효율성 극대화
[실습]
- FrontController 만들기: init, service 메소드 체크
init: 처음으로 실행되는 메소드, 초기화 메소드
2. controller로 연결하는 부분에서 파일경로에 .do 추가하기
- main에서 controller 경로 뒤에 .do 추가하기
- update에서 controller 경로 뒤에 .do 추가하기
- ShowMember에서 controller 경로 뒤에 .do 추가하기
- BoardWrite에서 controller 경로 뒤에 .do 추가하기
3. [Command] 인터페이스 만들기
-인터페이스를 상속받은 클래스들이 같은 메소드를 반드시 구현하게 하기
4. 모든 controller servlet 파일→class 파일로 변환하기
-class만들 때 interface(Command) 추가하여 상속받기
-controller에 있던 코드 복사하여 붙여넣기
-post 방식, 페이지 이동 코드 지우고 페이지 이동경로 return하기
5. web.xml 파일에서 URL mapping 값 *.do로 바꾸기
6. [FrontController]에서 요청받고 응답하기
<service> 메소드
- 어떤 요청이 들어왔는지 확인: request.getRequestURI()
- 주소에서 ContextPath 값 잘라내기: / maven_MessageSystem_board
-ContextPath 값 가져오기
- substring 메소드 사용하여 요청 값만 출력하기
(전체 주소값)
(ContextPath 값)
(substring으로 잘라낸 요청값)
<init> 메소드: HashMap으로 controller 클래스 가져오기
- HashMap: key, value 형태로 데이터 보관하는 구조
- HashMap 생성하기: HashMap<String, Command>
-key(String 요청값), value(클래스)
ex)"logincon.do", new logincon()
-controller들은 서로 다른 객체를 가지고 있으므로 하나로 묶을 수 있는 객체 필요
→controller들을 상속하는 Command interface 작성
- HashMap에 값 넣기: list.put(key, value)
<service> 메소드
- HashMap에 저장된 class 불러오기
- class에 있는 excute 메소드 호출하기
- 페이지 이동
-[JoinController]만 forward 방식으로 이동하도록 [JoinController]에서 주소값에 “forward” 추가
①[JoinController]은 forward 방식으로 페이지 이동: request.getRequestDispatcher 객체
②나머지 Con은 sendRedirect 방식으로 페이지 이동:
response.sendRedirect 객체
[오류]
개인정보 수정 시 오류→HashMap의 key값에 .do가 빠져서 실행 안됨
java.lang.NullPointerException: Cannot invoke "com.smhrd.command.Command.excute(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)" because "con" is null
'JSP&Servlet' 카테고리의 다른 글
[JSP]10. 게시판 기능 (0) | 2023.07.09 |
---|---|
[JSP]9. 회원정보 관리 (0) | 2023.07.06 |
[JSP]8. lombok (0) | 2023.06.30 |
[JSP]7. Mybatis 로 JDBC 구현하기 (0) | 2023.06.29 |
[JSP]6. Maven&Mybatis (0) | 2023.06.28 |