Dev/Servlet&JSP

Servlet & JSP 기초 와 실습(MVC 2)

OK-가자 2021. 10. 8. 15:56

Model 2 아키텍처

  • –주로 복잡한 요구사항을 처리하는 웹 애플리케이션에서 MVC(Model-View-Controller pattern) 패턴을 사용한다. MVC 패턴은 코딩과 유지보수를 쉽게 하고, Model 2 아키텍처라고도 불린다.
  • –MVC 패턴에서의 모델(model)은 자바빈즈로 구성되고, 뷰(view)는 JSP, 그리고 컨트롤러(controller)는 서블릿으로 구성된다.
  • –DAO 클래스와 같은 데이터 클래스의 메소드는 데이터 저장소의 데이터를 조회하거나 저장하는데 사용된다.
  • –MVC 패턴을 사용할 때는 가능한 한 각 레이어를 독립적으로 구성해야 한다. 그래야만 하나의 레이어를 수정하더라도 다른 레이어에 미치는 영향을 최소화 할 수 있다.

이론

요청 리다이렉트

– 문법

response.sendRedirect("url");

– 사용 예

response.sendRedirect("http://www.naver.com");

response.sendRedirect("/guestbook?a\=deletefrom&id\=10");
  • 요청 디스패치 (Forward) vs 리다이렉트
  1. RequestDispatcher 객체의 forward 메소드는 동일 서버의 다른 자원(JSP, 서블릿 등)에게 제어를 넘긴다. 동일한 서버에서 요청이 처리되고, 지정된 자원에서 request 객체와 response 객체에 접근한다.
  2. ServletContext 객체의 getReqestDispatcher 메소드를 사용해서 RequestDispatcher 객체를 얻는다.
  3. ServletContext 객체를 얻기 위해서는 HttpServlet 클래스의 getReqestDispatcher 메소드를 사용한다.
  4. 다른 서버의 자원에 제어를 넘길 때는 response 객체의 sendRedirect 메소드를 사용한다.
  5. sendRedirect 메소드를 사용하면 지정된 자원에서 request 객체와 response 객체에 접근할 수 없다.
  • 공통점
    • 둘 다 다른 페이지를 호출하는 방법으로 사용된다.
  • 차이점
    • 유저는 하나 이상의 페이지가 연관 된 것을 알 수 없다.
  • 포워드  -  새로운 페이지는 이전 페이지에서 처리하던 것과 같은 요청을 처리하게 하고 응답하여 브라우저는 하나 이상의 페이지가 연관 된 것을 알 수 없다.
  • 리다렉트 -  첫번째 페이지는 브라우저에게 새로운 페이지로 다시 요청해야 한다는  내용의 응답을 보낸다.  브라우저는 이 응답을 받으면 즉시 새로운 페이지로 다시 요청을 보낸다.
 ex)

   응답코드 :  302, 301

   location : 새 페이지 URL

                     

   서블릿 또는 jsp코드에서 실제사용)

   response.sendRedirect( url )

                        


실습

emaillist02

먼저

Dao와 Vo는 똑같은거 쓰겠다.

하지만 하나 바뀐게 있다.

emaillist01 패키지들
emaillist02 패키지들

보면 controller가 추가된 것 을 볼수있다.

그림으로 먼저 그려보고 머리속에서 그려지도록 해야한다.

Controller 를 서블릿으로 쓰는게 model1 정말 많이 다르게 보인다...

 

컨트롤러는 클라이언트에서 받아오는 리퀘스트를 들을 요청에 맞게 알맞은 URL로 보내주거나 포워딩 하거나, 응답한다.

코드로 한번 살펴보자

// EmaillistController.java (servlet)

public class EmaillistController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// post 방식으로 전달받는 파라미터 값의 엔코딩 처리
		request.setCharacterEncoding("utf-8");

		String action = request.getParameter("a");

		if ("form".equals(action)) {
			// 3. view로 포워딩
			RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/form.jsp");
			rd.forward(request, response);
		} else if ("add".equals(action)) {
			String firstName = request.getParameter("fn");
			String lastName = request.getParameter("ln");
			String email = request.getParameter("email");

			EmaillistVo vo = new EmaillistVo();
			vo.setFirstName(firstName);
			vo.setLastName(lastName);
			vo.setEmail(email);
			new EmaillistDao().insert(vo);
			// 2 redirect 응답
			response.sendRedirect(request.getContextPath() + "/el");
		} else if ("delete".equals(action)) {
			String firstName = request.getParameter("fn");
			String lastName = request.getParameter("ln");
			String email = request.getParameter("email");

			EmaillistVo vo = new EmaillistVo();
			vo.setFirstName(firstName);
			vo.setLastName(lastName);
			vo.setEmail(email);
			new EmaillistDao().insert(vo);

			// 2 redirect 응답
			response.sendRedirect(request.getContextPath() + "/el");

		} else {
			/* default request(action) */

			// 1. 요청처리
			List<EmaillistVo> list = new EmaillistDao().findAll();

			// 2. request범위에 데이터(객체) 저장
			request.setAttribute("list", list);

			// 3. view로 포워딩
			RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/index.jsp");
			rd.forward(request, response);
		}

	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response); // Post를 구분 안하고 처리 하겠다.
	}

}

위의 코드를 보면 일딴 모든 리스트를 request에 객체를 저장하고

담아서 인덱스에 보내주고

index.jsp는 그걸 받아서 보여준다.

간단하다.

 

자그럼 index.jsp 에서 form태그를 이용해 요청하면 어떻게 될까?

 

/add 인지 /delete 인지 확인후 알맞은 DAO를 실행한다.

 

정말 쉽다.

 

model 1과 다른건 단지 컨트롤러가 있냐 없냐의 차이다.

큰 차이지만 별거 없다.

 

코드를 모두 올리기에는 복잡하니

 

mvc 1 로 만든 emaillist01

https://github.com/stpn94/servlet-practices/tree/master/emaillist01

 

mvc 2 로 만든 emaillist02

https://github.com/stpn94/servlet-practices/tree/master/emaillist02

 

코드를 둘다 켜서 뭐가 다른지 확이하면서 잘 이해하길 바란다.

 

참고로 xml 설정이나 의존설정은 생략했다.

하지만 설정코드는 복사붙여넣기하고 혼자 이해하는게 더 잘 습득될꺼같으니 이만 설명은 마치겠다.

 

++++++++++++++++++++

++++++++++++++++++++

 

 

'Dev > Servlet&JSP' 카테고리의 다른 글

Servlet & JSP 기초 알아가기 2  (0) 2021.10.12
Servlet & JSP 기초 와 실습(MVC 1)  (0) 2021.10.08
Servlet & JSP 기초 알아가기 1  (0) 2021.10.07