course 2021/JDBC\DB

servlet01 - 01, 02

코딩하는토끼 2021. 11. 29. 15:31

교재 520p

java 값 결과만 jsp 에게 전달하며, 그 후 jsp 가 최종응답 response 함

jsp(view) 는 자바코드를 받은 결과를 보여주는 역할을 함

java 는 어떤 일을 어떻게 할 지 어떤 jsp 를 선택해서 보여줄 지 무엇을 할 지 제어한다

여기서 java 가 (servlet) controller model view (mvc 패턴)

 

* 추가검색

https://mangkyu.tistory.com/14

클라이언트의 요청을 처리하고 그 결과를 반환하는, servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술

서블릿이란 자바를 사용하여 웹을 만들기 위해 필요한 기술

클라이언트가 어떤 요청을 하면 그에대한 결과를 다시 전송해주어야 하는데, 이러한 역할을 하는 자바 프로그램

예를 들어, 사용자가 로그인을 할 때 아이디, 비밀번호를 입력하고 로그인을 누르는데, 그때 서버는 클라이언트의 아이디와 비밀번호를 확인하고 다음 페이지를 띄워주어야 함. 이러한 역할을 하는 것이 바로 서블릿!

서블릿은 jsp 와 비슷한 점이 있지만, jsp 는 html 안에 자바 코드를 포함, 서블릿은 자바 코드 안에 html 포함

 

자바 폴더에 servlet 만들기

폴더 우클릭 - new - Servlet

Java package: servlet01

Class name: S01Servlet

 

servlet01

S01Servlet

처음 파일을 생성하자마자 코드 ↓

package servlet01;

import java.io.IOException;
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 S01Servlet
 */
@WebServlet("/S01Servlet")
public class S01Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public S01Servlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		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 {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

httpServlet 을 상속받고있음

public class S01Servlet extends HttpServlet

 

servlet 을 생성하기만 해도 알아서 httpServlet 을 상속받아 만들어줌

httpServlet 은 추상클래스이므로 상속받아서 구현해야함 (오버라이딩)

httpServlet 의 메소드, 필드 사용가능 (접근지정자에 따라 조금 다를 수 있음)

 

servlet 은 어떤 일을 요청받아 일을 수행하게 되는데,

어디로 요청이 와야 servlet 이 일을 할지 servlet 코드 어딘가에 명시해야 함

방법1. @WebServlet("") 어노테이션으로 붙이는 방법

요청 보내는 방식 get방식, post방식 → doGet, doPost 메소드 실행됨

 

S01Servlet 코드 다음과 같이 작성 

package servlet01;

import java.io.IOException;
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 S01Servlet
 */
@WebServlet("/servlet01/servlet01")
public class S01Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public S01Servlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		System.out.println("서블릿1번 일함");
		
	}

	/**
	 * @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);
	}
}

@WebServlet("/servlet01/servlet01") 로 작성

doGet 메소드 내용을 "서블릿1번 일함" 출력하는 걸로 바꿈

콘솔창↓

주소창↓

 

S02Servlet

package servlet01;

import java.io.IOException;
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 S02Servlet
 */
@WebServlet("/servlet01/servlet02")
public class S02Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public S02Servlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("서블릿2번 일했다!!");
	}

	/**
	 * @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);
	}

}

@WebServlet("/servlet01/servlet02") 로 작성

doGet - 서블릿2번 일했다!!

 

S03Servlet

package servlet01;

import java.io.IOException;
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 S03Servlet
 */
//@WebServlet("/S03Servlet")
public class S03Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public S03Servlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("서블릿 3번 일함@@@@");
	}

	/**
	 * @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);
	}

}

@WebServlet 노테이션 주석처리

WEB-INF > web.xml 파일 열어 3번 servlet 다음과 같이 작성

(servlet01.S03Servlet → servlet0103으로 쓰임)

	<servlet>
		<servlet-name>servlet0103</servlet-name>
		<servlet-class>servlet01.S03Servlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>servlet0103</servlet-name>
		<url-pattern>/servlet01/servlet03</url-pattern>
	</servlet-mapping>

/servlet01/servlet03 을 일하게 하려고 함

 

 

S04Servlet

package servlet01;

import java.io.IOException;
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 S04Servlet
 */
//@WebServlet("/S04Servlet")
public class S04Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public S04Servlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("서블릿 4번 일했다!!!!!!");
	}

	/**
	 * @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);
	}

}

doGet 메소드가 일한 결과를 알 수 있게

S03Servlet 이랑 비슷

@WebServlet 주석처리, doGet 안에 "서블릿"

 

패키지명이랑 이름이 같이 들어가야 함

servlet-name 태그로 구별

	<servlet>
		<servlet-name>servlet0104</servlet-name>
		<servlet-class>servlet01.S04Servlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>servlet0104</servlet-name>
		<url-pattern>/servlet01/servlet04</url-pattern>
	</servlet-mapping>

 

 

servlet02

S01ForwardServlet

forward?

servlet 에서 다른 servlet 으로 포워딩시킬 수 있음

요청은 from 에서 받았지만 응답은 to 가 하게 됨

package servlet02;

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 S01ForwardServlet
 */
@WebServlet("/servlet02/s01")
public class S01ForwardServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public S01ForwardServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("s01 forward servlet 일함.");
		
		String path = "/01jsp/01jsp.jsp";
		RequestDispatcher dispatcher = request.getRequestDispatcher(path);
		dispatcher.forward(request, response);
	}

	/**
	 * @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);
	}

}

doGet ↓ 다음과 같이 작성됨

		System.out.println("s01 forward servlet 일함.");
		String path = "/01jsp/01jsp.jsp";
		RequestDispatcher dispatcher = request.getRequestDispatcher(path);
		dispatcher.forward(request, response);

S01ForwardServlet → 01jsp.jsp 포워딩

String path = "경로"; 에 작성된 파일로 포워딩 된다

실행하면, 페이지에 해당 파일이 실행되어 나타난다

단, 주소창에는 /servlet02/s01 으로 뜸 (servlet 코드의 @WebServlet() 에 작성된 내용) - 요청이 servlet 파일이므로

 

포워드하는 코드!

↑ 관습적 표현이므로 암기

 

S02ForwardServlet

package servlet02;

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 S02ForwardServlet
 */
@WebServlet("/servlet02/s02")
public class S02ForwardServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public S02ForwardServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String path = "/01jsp/02jsp-scriptlet.jsp";
		RequestDispatcher dispatcher = request.getRequestDispatcher(path);
		dispatcher.forward(request, response);
	}

	/**
	 * @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);
	}

}

doGet ↓ 다음과 같이 작성됨

		String path = "/01jsp/02jsp-scriptlet.jsp";
		RequestDispatcher dispatcher = request.getRequestDispatcher(path);
		dispatcher.forward(request, response);

S02ForwardServlet → 02jsp-scriptlet.jsp 포워딩

여기서도 마찬가지

 

S03ForwardServlet

jsp 파일을 webcontent 폴더 안에 만들었던 이유는 요청받기 위해서 였다

그런데 이제 jsp 가 요청받을 필요가 없기 때문에, jsp 파일을 webcontent 아래 작성하지 않아도 된다

외부에서 접근하지 못하는 폴더인 META-INF, WEB-INF 중 주로 WEB-INF 에서 사용한다

WEB-INF > view 폴더 안에 servlet02 폴더 생성, 그 안에 s03.jsp 파일 생성

s03.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<link rel="stylesheet" href="<%=request.getContextPath()%>/resource/css/icon/css/all.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">

<title>Insert title here</title>
</head>
<body>
  <!-- .container>.row>.col>h1>lorem3 -->
  <div class="container">
  	<div class="row">
  		<div class="col">
  			<h1>Lorem ipsum dolor.</h1>
  		</div>
  	</div>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
</body>
</html>

 

S03ForwardServlet.java

 

package servlet02;

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 S03ForwardServlet
 */
@WebServlet("/servlet02/s03")
public class S03ForwardServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public S03ForwardServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		String path = "/WEB-INF/view/servlet02/s03.jsp";
		RequestDispatcher dispatcher = request.getRequestDispatcher(path);
		dispatcher.forward(request, response);
	}

	/**
	 * @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);
	}

}

doGet ↓

		String path = "/WEB-INF/view/servlet02/s03.jsp";
		RequestDispatcher dispatcher = request.getRequestDispatcher(path);
		dispatcher.forward(request, response);

s03.jsp 로 포워딩

 

S04ForwardServlet

s04.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<link rel="stylesheet" href="<%= request.getContextPath() %>/resource/css/icon/css/all.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">

<title>Insert title here</title>
</head>
<body>

<h1>4번 jsp</h1>

<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
</body>
</html>

 

S04ForwardServlet.java

package servlet02;

import java.io.IOException;
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 S04ForwardServlet
 */
@WebServlet("/servlet02/s04")
public class S04ForwardServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public S04ForwardServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String path = "/WEB-INF/view/servlet02/s04.jsp";
		request.getRequestDispatcher(path).forward(request, response);
	}

	/**
	 * @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);
	}

}

 

doGet 메소드 암기하자