[ JSP ] Servlet 생성하기

duck-ach·2022년 10월 6일
1

JSP

목록 보기
2/14

JSP

  • JSP(Java Server Pages)란 HTML 코드에 JAVA 코드를 넣어 동적 웹 페이지를 생성하는 웹 애플리케이션(WAS) 도구이다.
  • JSP가 실행되면 자바 서블릿(Servlet)으로 변환되며 웹 애플리케이션 서버에서 동작되면서 필요한 기능을 수행하고, 그렇게 생성된 데이터를 웹페이지와 함께 클라이언트로 응답한다.

웹 애플리케이션(Web Application)

  • 웹 애플리케이션은 웹에서 실행되는 응용 프로그램이며, 인터넷을 통한 은행업무, 인터넷 쇼핑 등 인터넷에서 하는 여러 서비스를 총칭한다.
  • 사용자가 필요한 요청(Request)를 하고 서버에서는 요청한 데이터를 응답한다.

자바 서블릿(Java Servlet)

  • 자바 서블릿(Java Servlet)이란, 클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바 클래스이다.
  • 서버 쪽에서 실행하며, 일반 자바 클래스와 달리 단독적으로 실행되지 못하고 톰캣(Tomcat)과 같은 JSP/Servlet 컨테이너에서 실행이 된다. (main() 메소드 없이도 실행)
  • 웹 화면을 만드는 자바 클래스이다.
  • JSP/Servlet Container(Tomcat)에 의해서 실행된다.
  • 서블릿을 실행하면 웹 브라우저가 실행된다.

Servlet 동작 과정

정적 웹페이지(Static Web Page)

  • 서버(웹 서버, Web Server)에 미리 저장된 파일(HTML파일, 이미지, JavaScript파일 등)이 그대로 전달되는 웹 페이지
  • 사용자는 서버에 저장된 데이터가 변경되지 않는 한 고정된 웹 페이지를 보게 된다.

동적 웹페이지(Dynamic Web Page)

  • 서버(웹 서버, Web Server)에 있는 데이터들을 스크립트에 의해 가공처리한 후 생성되어 전달되는 웹 페이지
  • 서버는 사용자의 요청(Request)을 해석하여 데이터를 가공한 후 생성되는 웹 페이지를 보낸다.
  • 사용자는 상황, 시간, 요청 등에 따라 달라지는 웹 페이지를 보게 된다.

JSP 실행 브라우저 설정하기

이클립스 상단의 [Window] - [Web Browser] - [Chrome]으로 설정해 주는게 좋다.

이클립스에서 프로젝트 만들기

보통 프로젝트는 하나만 만든다. 그리고 각 모듈을 한 프로젝트안에 넣는다.

만약 01_Servlet이라는 프로젝트를 생성하게 되면, 주소가 이렇게 된다.

그렇게 생성된 프로젝트의
💁🏻‍♀️src/main/java폴더에는 JAVA 언어를 작성하고,
💁🏻‍♀️일반 src폴더에는 HTML, CSS, Javascript와 같은 언어들을 작성하게 된다.

HTML 파일 만들기

일반 src폴더는 webapp폴더가 root이다.
webapp폴더에 HTML 파일을 생성하면 된다.

아래와같이 [Run As]-[Run on Server]로 실행하면 된다.

결과

자바 Servlet 클래스 만들기

  1. 클래스 이름을 설정해준다.

  2. URL mapping은 Servlet을 생성할 때만 설정할 수 있다.

  3. init, service, doGet, doPost를 체크해준다.

일반적으로는 아래와 같이 doGet, doPost만 체크하면된다.

(GET, POST가 돌아가는 방식을 이해하기 위해 init과 service를 함께 체크해준다.)

체크를하게되면 아래와같이 메소드들을 생성해준다.

JAVA Servlet의 URL주소(아주중요)

Servlet파일을 생성했을 때 주소가 설정 되는데 다음과 같은 구성으로 이루어져있다.

  • 같은 Host : 같은 Tomcat을 사용
  • 같은 Context Path : 같은 Project
  • 같은 URLMapping : 같은 Servlet이다.

만약, HelloServlet이라는 Servlet을 생성한 후, 실행을 하면, 아래와 같이 웹 주소가 뜬다.

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() 메소드가 호출

init 메소드

public void init(ServletConfig config) throws ServletException {
	System.out.println("init");
}

service 메소드

서비스

  • 클라이언트의 요청마다 매번 호출
  • GET 방식의 요청은 doGet() 메소드 호출, POST 방식의 요청은 doPost() 메소드 호출

Service 메소드

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	}

doGet 메소드

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를 지정하는 방법, open()를 지정하는 방법
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());
	}

doPost 메소드

POST방식의 요청을 처리

요청 메소드가 GET인 경우

  • ajax의 type을 POST로 설정해 뒀을 때
$.ajax({
'type' : 'POST',
'url' : '/01_Servlet/HelloServlet', 
 });
  • form method="POST" action=""
<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방식으로 처리를 해달라고 부탁을 하는 것과 같다.

서비스를 만들었을 경우 doGet메소드와 doPOST메소드 호출하기

@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;
	}
}
profile
자몽 허니 블랙티와 아메리카노 사이 그 어딘가

0개의 댓글