수업 내용/[JSP] JSP

[JSP] 03. 서블릿 (servlet)

프롯 2023. 5. 17. 18:35

서블릿은 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양을 말한다. 자바 서블릿은 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종이다.

 

서블릿 실행
호스트 이름:포트번호/프로젝트이름/서블릿
호스트이름:포트번호/ContextPath/URLMapping
URLMapping의 기본 값은 서블릿 이름이다.
서블릿 이름 = 본명, URLMapping = 별명 (본명과 별명은 같을 수 있다! 보통 별명을 쓴다!)

ex) localhost:8080/chapter03_servlet/Ex01_servlet

 

문법은 자바와 거의 유사하다.

자동완성으로 클래스 선언해주는거 잊지 말것

 

역할 : 서버에서 실행되다가 브라우저에서 요청을 받으면 해당 작업을 수행하고 결과를 브라우저로 전송 

브라우저 요청 (input) => 서블렛 => 브라우저 출력 (output) 

위와 같은 순서로 작동한다.

서블렛 단계에서 요청을 처리할 수도 있고, input/output 단계에서 스크립트로 요청을 수행할 수도 있다.

공부하다 보면 명확해 질거 같다

 

 

package org.joonzis.ex;

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("/Ex01_servlet")
public class Ex01_servlet extends HttpServlet {
	// Serializable 인터페이스를 구현하게 되면 노란색 warning 발생
	// 직렬화에서 사용하는 고유 아이디로, 선언하지 않으면 JVM에서 자동 생성 및 대입
	// 그래서 선언하지 않아도 동작에 문제 없다.
	private static final long serialVersionUID = 1L;
       

	//생성자
	//셍상지 호출 뒤 -> init()
    public Ex01_servlet() {
        super();
        System.out.println("생성자 호출");
    }

    //init() 메소드
    //servlet 생성 후 한번만 호출
    //초기화 용도로 사용
    //init() 메소드 호출 뒤 > service() 메소드가 자동 호출
    public void init(ServletConfig config) throws ServletException{
    	System.out.println("init() 호출");
    }

    //Service() 메소드
    //1. 매개변수1 - : 요청 정보(브라우저 > 서버)
    //2. 매개변수2 - : 응답 정보 (서버 > 브라우저)
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
    	System.out.println("service() 호출");
    	
    	//사용자 요청 정보(request)를 분석하여 get 방식이면 doGet()을 호출
    	//post 방식이면 doPost() 메소드를 호출
    	
    	//<form method="post">
    	//<form method="POST"> 대소문자 구분 없이 처리
    	System.out.println(req.getMethod());
    	if(req.getMethod().equalsIgnoreCase("get")) {
    		doGet(req, resp);
    	}
    	else {
    		doPost(req, resp);
    	}
    }
    
    // method를 지정하지 않거나, <form method="get">인 경우 호출되는 메소드
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

    // <form method="post"> 인 경우 호출되는 메소드
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

전송하는 데이터 보안 여부에 따라 get, post 방식 함수를 호출한다.

(해당 코드에서는 차이 없다.)

 

코드 진행 순서

 

 

 

웹 상에서의 출력

package org.joonzis.ex;

import java.io.IOException;
import java.io.PrintWriter;

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("/Ex03_servlet")
public class Ex03_servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

    public Ex03_servlet() {
        super();
    }


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 실제 코드가 작성되는 곳
		
		//================항상 인코딩 먼저============================
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		//=========================================================
		
		
		PrintWriter out = response.getWriter(); //웹 브라우저에 출력하기 위한 객체
		
		//웹 브라우저에 출력하는 메소드 print()
		
		out.print("<html>");
		out.print("<head>");
		out.print("<title>");
		out.print("나의 첫 서블릿 페이지");
		out.print("</title>");
		out.print("</head>");
		out.print("<body>");
		out.print("<h1>나의 첫 서블릿 본문 내용</h1>");
		out.print("</body>");		
		out.print("</html>");
		
		
		
		
		
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

위와 같이 이클립스 콘솔이 아닌 웹 상에서 출력이 가능하다.

 

 

 

서블렛 사용해서 데이터 받고 출력

 

form 태그로 데이터를 입력받고

action 태그로 이동시킬 서블렛을 선언한다.

<%@ 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>
<script type="text/javascript">

</script>
</head>
<body>
	<!-- pagemove : #Ex09_servlet 의 mapping 값 -->
	<form action ="/chapter03_servlet/Ex09_servlet">
		<h1>로그인</h1>
		<p>아이디 <input type="text" name="id"></p>
		<p>비밀번호 <input type="password" name="pw"></p>
		
		<button onclick="submit();">로그인</button>
	</form>

</body>
</html>