교재 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 메소드 암기하자
'course 2021 > JDBC\DB' 카테고리의 다른 글
listener (0) | 2021.12.04 |
---|---|
filter (0) | 2021.12.02 |
DB - aws, sql (0) | 2021.12.02 |
servlet03 - 07, 08, 09 (0) | 2021.12.02 |
servlet02 - 03, 04, 05, 06 (0) | 2021.12.01 |