-
JSP피피티 06강 컨트롤러의 이해JSP 피피티 2020. 8. 20. 19:32
JSP와 Servlet의 비교
장점 단점 JSP HTML 태그의 처리가 서블릿보다 간결하다.
out.print안해도 되니까JAVA 코드와 HTML 코드가 서로 섞여 유지보수에 좋지 않다. (스파게티코드) Servlet 순수 Java 코드로만 작성되기 때문에 코드의 유지보수에 유리한다. HTML 태그를 문자열로 묶어 출력해야 하기 때문에 많은 노력이 필요하다. Controller 사용하기
- 프로그램의 소스는 서블릿에서 담당하고, 화면에 HTML을 출력하기 위한 기능은 JSP로 이관시켜 프로그램의 로직(JAVA)과 화면의 뷰(HTML)를 분리하는 처리방법
- 순수 JSP파일만으로 작성되는 방식을 Model1(혹은 Page Controller),
- Servlet과 JSP로 나누어 구현되는 방식을 Model2(혹은 Server Controller)라 한다.
MVC란??
더보기MVC패턴이란?
Model , View , Controller 의 합성어로 소프트웨어 공학에서 사용되는 소프트웨어 디자인 패턴입니다.
Model : 백그라운드에서 동작하는 로직을 처리합니다.
View : 사용자가 보게 될 결과 화면을 출력합니다.
Controller : 사용자의 입력처리와 흐름 제어를 담당합니다.
MVC패턴에는 모델1방식과 모델2방식이 있는데 특히 모델 2 구조 기반의 MVC패턴 구현은 JSP 개발자라면 무조건 알고 있어야 할 개발 방식입니다. JSP 웹사이트 구조는 크게 모델1 방식과 모델2 방식으로 나뉩니다. 간단하게 분류하자면 JSP에서 출력과 로직을 전부 처리하느냐(모델1) JSP에서 출력만 처리하느냐(모델2)로 분류할 수 있습니다.
Model1방식
모델1 구조는 사용자의 요청을 JSP가 전부 다 처리합니다. 웹브라우저 사용자의 요청을 받은 JSP는 자바빈이나 서비스 클래스를 사용하여 웹브라우저가 요청한 작업을 처리하고 그 결과를 출력해줍니다.
Model2방식
모델 2 구조는 모델 1구조와 달리 웹브라우저 사용자의 요청을 서블릿이 받습니다. 서블릿은 웹브라우저의 요청을 받아 View로 보여줄것인지 Model로 보내줄것인지 정하여 전송해줍니다. 여기서 View페이지는 사용자에게 보여주는 역할만 담당하고 실질적인 기능의 부분은 Model에서 담당합니다. 모델2 방식의 경우 실질적으로 보여지는 HTML과 JAVA 소스를 분리 해놓았기 때문에 모델1방식에 비해 개발을 확장시키기도 쉽고 유지보수하기도 쉽습니다. (코딩을 좀 더 깔끔하게 할 수 있습니다.)
MVC 패턴이라면 웹 개발자라면 반드시 알아야 하는 패턴입니다. MVC패턴은 스윙과 같은 컴포넌트뿐만이 아니라 웹어플리케이션 개발 영역에서도 보편적으로 사용하고 있습니다. 다음 포스팅에서는 MVC2 패턴으로 구현하는 회원가입과 게시판의 예제를 통해 MVC2패턴이 어떻게 돌아가는지 공부해보도록 하겠습니다.
그래서 지금 Model2 방식을 공부하는건데 MVC패턴에서 Model이 빈즈만을 뜻하는게 아니구나 싶었다. 암튼
SimpleMVC.java
package study.jsp.model2.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; /** * Servlet implementation class SimpleMVC */ @WebServlet("/simple_mvc.do") public class SimpleMVC extends HttpServlet { /** * 객체 직렬화 아이디 --> 이클립스가 생성한 값을 사용하게 된다. * */ private static final long serialVersionUID = -7951411265730259992L; /** * @see HttpServlet#HttpServlet() */ public SimpleMVC() { super(); // TODO Auto-generated constructor stub } /**dsdsads * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 브라우저에 전달되는 컨텐츠의 형식 지정 response.setContentType("text/html; charset=utf-8"); //브라우저로부터 전달받는 파라미터의 인코딩 형식지정 request.setCharacterEncoding("utf-8"); //현재 서블릿의 요청을 JSP에게 전달하는 객체 생성. // -->Dispatcher 전달자라는 의미 RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/views/simple_mvc.jsp"); //현재 서블릿의 프로그램 흐름을 "/WEB-INF/views/simple_mvc.jsp" 페이지에게 넘긴다. dispatcher.forward(request, response); //response.getWriter().append("Served at: ").append(request.getContextPath()); //response.getWriter()<<응답을 출력할겁니다. //우리 프로젝트 model2↑ } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
일단 MVC패턴에서 Model2 방식을 공부하는 거니까 @WebServlet("/simple_mvc.do")에 접속을 하면 사용자가 url로 요청 한거니까 SimpleMVC.java코드에서 doGet( )이 실행된다. 그래서 위에서 부터 실행을 한다음에 Model2니까 사용자에게 보내줄 응답으로 dispatcher로 포워드 > simple_mvc.jsp(View) 출력.
simple_mvc.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page trimDirectiveWhitespaces="true" %> <!doctype html> <html> <head> <meta charset="UTF-8" /> <title>SimpleMVC</title> </head> <body> <h1>여기는 SimpleMVC에 의해서 로드되는 simple_mvc.jsp 입니다.</h1> <h2>Get data 전송하기</h2> <a href='sub.do?num1=100&num2=200'>go to sub.do</a> <h2>Post data 전송하기</h2> <form method='post' action='sub.do'> <input type='text' name='user_name'/> <button type='submit'>send data</button> </form> </body> </html>
별거 없는 화면. 이 화면에서 'go to sub.do'를 누르면 a태그 href속성에 표시된 주소로 이동 근데 url 주소니까 @WebServlet("/sub.do")에서 doGet( )실행
Sub.java
package study.jsp.model2.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; /** * Servlet implementation class Sub */ @WebServlet("/sub.do") public class Sub extends HttpServlet { /** * */ private static final long serialVersionUID = 2597879657454404329L; /** * @see HttpServlet#HttpServlet() */ public Sub() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 브라우저에 전달되는 컨텐츠의 형식 지정 response.setContentType("text/html; charset=utf-8"); // 브라우저로부터 전달받는 파라미터의 인코딩 형식 지정 request.setCharacterEncoding("utf-8"); //파라미터 받기 String num1_str = request.getParameter("num1"); String num2_str = request.getParameter("num2"); //연산을 통한 새로운 데이터 생성하기 int num1 = Integer.parseInt(num1_str); int num2 = Integer.parseInt(num2_str); int num3 = num1+num2; //JSP에게 전달할 변수 값들을 request 객체에 추가 request.setAttribute("num1", num1); request.setAttribute("num2", num2); request.setAttribute("num3", num3); //프로그램 흐름을 "/WEB-INF/views/sub_get.jsp"에게 넘긴다. String view = "/WEB-INF/views/sub_get.jsp"; RequestDispatcher dispatcher = request.getRequestDispatcher(view); //현재의 서블릿을 view에 전달하는 객체 생성 dispatcher.forward(request, response); response.getWriter().append("Served at: ").append(request.getContextPath()); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //브라우저에 전달되는 컨텐츠의 형식 지정 response.setContentType("text/html; charset=utf-8"); //브라우저로부터 전달받는 파라미터의 인코딩 형식 지정 request.setCharacterEncoding("utf-8"); //POST 파라미터 받기 String user_name = request.getParameter("user_name"); //JSP에게 전달할 변수값들을 request 객체에 추가 request.setAttribute("user_name", user_name); //프로그램의 흐름을 "/WEB-INF/views/sub_post.jsp"; String view = "/WEB-INF/views/sub_post.jsp"; RequestDispatcher dispatcher = request.getRequestDispatcher(view); dispatcher.forward(request, response); doGet(request, response); } }
simple_mvc.jsp페이지에서 a태그에 있던 href 파라미터값들을 다 처리를 해가지고 sub_get.jsp로 보내서 결과를 출력
(request는 웹 브라우저의 요청 정보를 저장하고 있는 객체)
sub_get.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page trimDirectiveWhitespaces="true" %> <% //request 객체에 포함된 num1, num2, num3 값을 꺼낸다. //이 값들은 Servlet에서 이 JSP페이지로 forward 되기전에 request 객체에 추가된다. int num1=(Integer) request.getAttribute("num1"); int num2=(Integer) request.getAttribute("num2"); int num3=(Integer) request.getAttribute("num3"); %> <!doctype html> <html> <head> <meta charset="utf-8" /> <title>SimpeMVC</title> </head> <body> <h1><%=num1%>+<%=num2%>=<%=num3%></h1> </body> </html>
근데 이 값들은 servlet에서 이 JSP페이지로 forward 되기전에 request 객체에 추가된다는 말이 뭔소리일까??
암튼 다음 simple_mvc.jsp에서 input태그에 값을 입력하고 전송 눌렀을때 form에 post방식으로 처리하라고 했고 action은 Sub.do 니까 Sub.java에서 doPost()로 값 처리 sub_post.jsp에서 값 출력한다.
sub_post.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page trimDirectiveWhitespaces="true" %> <% //request 객체에 포함된 user_name 값을 꺼낸다. //이 값들은 Servlet에서 이 JSP페이지로 forward 되기전에 request 객체에 추가된다. String user_name=(String) request.getAttribute("user_name"); %> <!doctype html> <html> <head> <meta charset="UTF-8" /> <title>SimpleMVC</title> </head> <body> <h1><%=user_name%>님 안녕하세요.</h1> </body> </html>
MVC패턴에서 model2 방식을 공부해 봤는데 일단 클라이언트가 url창에 무언가를 입력하고 엔터를 치면 이 행위 자체가 request인거 같다. url로 requst 했으니까 Sublet에서 doGet( )메서드로 request를 처리하고 dispatcher를 이용해 사용자에게 VIEW(jsp) 하는거 같음. 아직 Model은 자바 빈즈로만 알고 있었는데 앞으로 빈즈말고 하는 역할이 더 있는거 가틈.
'JSP 피피티' 카테고리의 다른 글
JSP 피피티 06강 컨트롤러 추상화 (0) 2020.08.21 JSP 피피티 06강 JSTL (0) 2020.08.21 JSP피피티 06강 서블릿(Servlet) (0) 2020.08.20 Maven, lombok과 model객체 getter,setter오류 (2) 2020.08.20 JSP피피티 05강 Get/Post 방식의 상태유지(정규표현식) (0) 2020.08.20