- JSP(Java Server Pages)란 HTML 코드에 JAVA 코드를 넣어 동적 웹 페이지를 생성하는 웹 애플리케이션(WAS) 도구이다.
- JSP가 실행되면 자바 서블릿(Servlet)으로 변환되며 웹 애플리케이션 서버에서 동작되면서 필요한 기능을 수행하고, 그렇게 생성된 데이터를 웹페이지와 함께 클라이언트로 응답한다.
- 웹 애플리케이션은 웹에서 실행되는 응용 프로그램이며, 인터넷을 통한 은행업무, 인터넷 쇼핑 등 인터넷에서 하는 여러 서비스를 총칭한다.
- 사용자가 필요한 요청(Request)를 하고 서버에서는 요청한 데이터를 응답한다.
- 자바 서블릿(Java Servlet)이란, 클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바 클래스이다.
- 서버 쪽에서 실행하며, 일반 자바 클래스와 달리 단독적으로 실행되지 못하고 톰캣(Tomcat)과 같은 JSP/Servlet 컨테이너에서 실행이 된다. (
main()
메소드 없이도 실행)- 웹 화면을 만드는 자바 클래스이다.
- JSP/Servlet Container(Tomcat)에 의해서 실행된다.
- 서블릿을 실행하면 웹 브라우저가 실행된다.
이클립스 상단의 [Window] - [Web Browser] - [Chrome]으로 설정해 주는게 좋다.
보통 프로젝트는 하나만 만든다. 그리고 각 모듈을 한 프로젝트안에 넣는다.
만약 01_Servlet
이라는 프로젝트를 생성하게 되면, 주소가 이렇게 된다.
그렇게 생성된 프로젝트의
💁🏻♀️src/main/java
폴더에는 JAVA 언어를 작성하고,
💁🏻♀️일반 src
폴더에는 HTML, CSS, Javascript와 같은 언어들을 작성하게 된다.
일반 src
폴더는 webapp
폴더가 root이다.
webapp
폴더에 HTML 파일을 생성하면 된다.
아래와같이 [Run As]-[Run on Server]로 실행하면 된다.
결과
클래스 이름을 설정해준다.
URL mapping은 Servlet을 생성할 때만 설정할 수 있다.
init, service, doGet, doPost를 체크해준다.
일반적으로는 아래와 같이 doGet, doPost만 체크하면된다.
(GET, POST가 돌아가는 방식을 이해하기 위해 init과 service를 함께 체크해준다.)
체크를하게되면 아래와같이 메소드들을 생성해준다.
Servlet파일을 생성했을 때 주소가 설정 되는데 다음과 같은 구성으로 이루어져있다.
- 같은 Host : 같은 Tomcat을 사용
- 같은 Context Path : 같은 Project
- 같은 URLMapping : 같은 Servlet이다.
만약, HelloServlet
이라는 Servlet을 생성한 후, 실행을 하면, 아래와 같이 웹 주소가 뜬다.
package ex01;
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("/HelloServlet")
public class HelloServlet extends HttpServlet { // Servlet은 HttpServlet을 상속받는다.
public HelloServlet() {
super();
}
public void init(ServletConfig config) throws ServletException {
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("Served at: ").append(request.getContextPath());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
- 가장 먼저 호출
- 생성자 호출 뒤 init() 메소드가 호출
public HelloServlet() {
super();
}
초기화
- 각종 초기화 정보 실행
- 서블릿 환경 설정 처리
- init() 메소드 호출 뒤 init() 메소드가 호출
init 메소드
public void init(ServletConfig config) throws ServletException {
System.out.println("init");
}
서비스
- 클라이언트의 요청마다 매번 호출
- GET 방식의 요청은 doGet() 메소드 호출, POST 방식의 요청은 doPost() 메소드 호출
Service 메소드
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
GET방식의 요청을 처리
요청 메소드가 GET인 경우
ajax
의 type을 GET으로 설정해 뒀을 때$.ajax({
'type' : 'GET',
'url' : '/01_Servlet/HelloServlet',
});
<a href="">
a태그와 href속성<a href="http://localhost:9090/01_Servlet/HelloServlet">링크</a>
<form method="GET">
또는 <form>
location.href='http://localhost:9090/01_Servlet/HelloServlet',
open('http://localhost:9090/01_Servlet/HelloServlet')
doGet 메소드
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("Served at: ").append(request.getContextPath());
}
POST방식의 요청을 처리
요청 메소드가 GET인 경우
ajax
의 type을 POST로 설정해 뒀을 때$.ajax({
'type' : 'POST',
'url' : '/01_Servlet/HelloServlet',
});
<form method="POST action="http://localhost:9090/01_Servlet/HelloServlet">
doPost 메소드
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 요청과 응답 정보를 doGet() 메소드로 넘겨 버림
doGet(request, response); // doGet을 호출하는 코드
}
Post메소드의 코드를 살펴보면 doGet메소드를 호출하는 코드이다. Post방식으로 처리를 해달라고 부탁을 하는 것과 같다.
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet { // Servlet은 HttpServlet을 상속받는다.
public HelloServlet() {
super();
}
public void init(ServletConfig config) throws ServletException {
System.out.println("init");
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("서비스");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("Served at: ").append(request.getContextPath());
System.out.println("doGet");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
System.out.println("doPOST");
}
}
위 코드를 실행하면 아래와 같이 출력된다.
즉, Service 메소드를 생성하면
doGet
메소드와doPost
메소드를 자동으로 실행해주지 않는다.
보통은 Service메소드를 생성하지 않고 자동으로 실행시킨다고 한다.
만약에 만약에 호출하고 싶다면 서비스 메소드 내부에 아래와 같이 작성해주면 된다.
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("서비스");
// service 메소드가 존재하는 경우 doGET()/doPOST()가 자동으로 호출되지 않기 때문에
// 코드를 직접 작성
// 요청 메소드 확인
switch(request.getMethod()) {
case "GET" :
doGet(request, response); // doGET메소드 호출
break;
case "POST" :
doPost(request, response);
break;
}
}