Servlet

Let's Just Go·2022년 6월 4일
0

JSP

목록 보기
9/12

Servlet

Servlet 개념

  • Servlet
    • 웹 요청과 응답의 흐름을 메서드 호출로 다룰 수 있게 해줌
    • Servlet은 MVC패턴의 컨트롤러의 역할을 하며 웹 브라우저의 요청과 전체적인 흐름을 제어

  • 컨트롤러 흐름 제어 처리
    1. 웹 브라우저가 전송한 HTTP 요청을 받아서 요청 방식에 맞게 doGet(), doPost() 호출
    2. 웹 브라우저가 어떤 기능을 요청했는지 분석
    3. 모델을 사용하여 요청한 기능 수행
    4. 모델에서 전달받은 결과물을 알맞게 가공한 후 request나 session의 setAttribute() 메서드를 이용해 결과물을 속성에 저장
    5. 저장된 결과물을 view인 jsp에서 사용하며 웹 브라우저에 결과를 전송할 JSP페이지를 선택한 후 JSP로 forwarding 하거나 redirecting

  • web.xml
    • class도 페이지에서 인식할 수 있도록 가상 url Mapping

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
        <display-name>MyWeb</display-name>
        <welcome-file-list>
          <welcome-file>index.html</welcome-file>
          <welcome-file>index.htm</welcome-file>
          <welcome-file>index.jsp</welcome-file>
          <welcome-file>default.html</welcome-file>
          <welcome-file>default.htm</welcome-file>
          <welcome-file>default.jsp</welcome-file>
        </welcome-file-list>
        
        <servlet>
        	<servlet-name>basic</servlet-name>
        	<servlet-class>kr.co.jsp.servlet_basic.ServletBasic</servlet-class>
        </servlet>
        <!-- servlet 경로와 원하는 이름을 지정  -->
        
      	<servlet-mapping>
        	<servlet-name>basic</servlet-name>
        	<url-pattern>/basic</url-pattern>
        </servlet-mapping>
      
      </web-app>

  • test.jsp
    • 값을 보내줄 수 있는 form 제작

      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>Insert title here</title>
      </head>
      <body>
      	<form action="/MyWeb/basic" method = "post">
      		# 아이디 : <input type = "text" name = "account"><br>
      		<input type = "submit" value = "서블릿페이지 열어보기">
      	</form>
      	<%-- class에 값을 이동하기를 원한다면 web.xml에서 가상의 url지정 --%>
      </body>
      </html>

  • ServletBasic
    • 기존에 jsp에서 작성한 내용을 메서드에 작성하여 class에서도 controller의 역할을 할 수 있는 것을 확인

    • Client에서 요청이 들어오게 되면 servlet객체가 생성되는 것을 확인

    • HttpServlet 클래스를 상속하며 주요 메서드로는 init(), doGet(), doPost(), destroy() 등이 존재

      package kr.co.jsp.servlet_basic;
      
      import java.io.IOException;
      
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import javax.servlet.http.HttpSession;
      
      import kr.co.jsp.user.model.UserDAO;
      import kr.co.jsp.user.model.UserVO;
      
      /*
       - 서블릿이란 웹 페이지를 자바 언어로만 구성하는 기법 
       즉, jsp파일을 자바 언어로만 구성
       tomact을 사용해서 jsp 파일을 자동으로 class로 변환했다면 이제는 직접 클래스를 생성해서 클래스로 요청을 처리 
       */
      public class ServletBasic extends HttpServlet{
      	//# servlet 클래스를 만드는 방법
      	 // 1. HttpServlet 클래스 상속  
      	 // 2. 생성자 선언(선택)
      	 
      	public ServletBasic() {
      		System.out.println("페이지에 요청이 들어옴");
      		System.out.println("서블릿 객체 생성!");
      		// 요청이 들어오면 객체가 생성되는 것을 확인하기 위해 사용
      	}
      	
      	// 3. HttpServlet이 제공하는 상속 메서드를 오버라이딩
      	// init(), doGet(), doPost(), destroy()... 
      	
      	@Override
      	public void init() throws ServletException {
      		/*
      		 - 페이지 요청이 들어왔을 때 처음 실행할 로직을 작성 
      		 - init()은 컨테이너(서버 프로그램)에 의해 서블릿 객체가 생성될 때 
      		 최초 1회 자동으로 호출
      		 - 객체의 생성자와 비슷한 역할을 수행 
      		 */
      		System.out.println("init 메서드 호출 ");
      	}
      	
      	
      	@Override
      	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      		// http 통신 중 get 요청이 발생했을 때 자동으로 호출되는 메서드 
      		// 매개값으로 내장객체인 request와 response가 전달되므로 객체의 메서드를 통해 파라미터 값을 가져오거나 페이지 이동 가능
      		
      		System.out.println("doGet메서드가 호출");
      	}
      	
      	@Override
      	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      		// http 통신 중 post 요청이 발생했을 때 자동으로 호출되는 메서드
      		// doget과 마찬가지로 내장객체인 request와 response를 매개값으로 받음
      		System.out.println("doPost 메서드가 호출");
      		String account = request.getParameter("account");
      		// 사용자에게 입력받은 값을 가져옴 
      		
      		UserVO vo = UserDAO.getInstance().getUserInfo(account);
      		// 입력받은 값을 바탕으로 유저 정보 찾아오는 메서드를 통해 유저 객체 찾아옴 
      		
      		// 자바클래스에서 세션을 사용하는 방법 
      		HttpSession session =  request.getSession();
      		session.setAttribute("user", vo);
      		// session을 user라는 이름으로 UserVO객체 값을 넣음
      		
      		response.sendRedirect("servlet/info.jsp");
      		// 해당 페이지로 이동
      	}
      	
      	@Override
      	public void destroy() {
      		// 서블릿 객체가 소멸될 때 호출되는 메서드 (객체 소멸 시 1회 자동으로 호출)
      		System.out.println("destroy 메서드가 호출");
      	}
      }

  • info.jsp
    • doPost메서드에서 session에 저장한 결과물을 가지고 와서 화면에 출력

    • JSP는 view의 역할을 수행

      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>Insert title here</title>
      </head>
      <body>
      
      	<p>
      		# 아이디 : ${ sessionScope.user.id}<br>
      		# 이름 : ${ sessionScope.user.name}<br>
      		# 이메일 : ${ sessionScope.user.email}<br>
      		# 주소 : ${ sessionScope.user.address}<br>
      	</p>
      
      </body>
      </html>

URI Pattern

  • URL-Pattern
    • 디렉토리 패턴
    • 확장자 패턴
      • 확장자 형태로 서버의 해당 컴포넌트를 찾아서 실행하는 구조
      • ex) http://localhost:8181/cr/Hello.do → *.do 서블릿
      • @WebServlet(”*.do”) 요렇게 작성하면 .do로 끝나는 모든 요청은 .do가 있는 곳을 가서 요청을 처리
      • 만약 목록 출력을 하는 곳의 이름이 list이면 list.do로 바꿔주면 됨
      • 확장자만 지켜준다면 하나의 컨트롤러로 여러 요청을 처리할 수 있음

  • 확장자 패턴
    • @Webservlet(”value”)을 통해서 web.xml에 등록하지 않아도 value 안에 넣으면 자동으로 원하는 값이 mapping됨
    • FrontController.java
      package kr.co.jsp.servlet_basic;
      
      import java.io.IOException;
      import javax.servlet.ServletConfig;
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      
      @WebServlet("*.do")
      // annotation(그냥 기능이 있는 주석이라고 생각)
      // web.xml에서 등록했던 것을 자동으로 해주는 기능
      public class FrontController extends HttpServlet {
      	private static final long serialVersionUID = 1L;
      
          public FrontController() {
              super();
              // TODO Auto-generated constructor stub
          }
      
      	public void init(ServletConfig config) throws ServletException {
      		// TODO Auto-generated method stub
      	}
      
      	public void destroy() {
      		// TODO Auto-generated method stub
      	}
      
      	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      		System.out.println("doget메서드 호출");
      		System.out.println("요청 URL : " + request.getRequestURI());
      		
      		String uri = request.getRequestURI();
      		String conPath = request.getContextPath();
      		// 현재의 contextroot인 /MyWeb이 옴
      		uri = uri.substring(conPath.length()+1, uri.lastIndexOf("."));
      		// /MyWeb/write.do에서 write만 골라내기 위해서 작성 
      
      		
      		
      		if (uri.equals("/MyWeb/write.do")) {
      			System.out.println("글 작성 요청이 들어옴 ");
      		}
      		else if (uri.equals("/MyWeb/list.do")) {
      			System.out.println("글 목록 요청이 들어옴");
      		}
      	}
      	// 이렇게 uri를 통해서 하나의 컨트롤러에서 요청을 구분할 수 있음
      
      	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      		// TODO Auto-generated method stub
      		doGet(request, response);
      	}
      
      }

profile
안녕하세요! 공부한 내용을 기록하는 공간입니다.

0개의 댓글