[웹] - Servlet(1)

yeom yaloo·2023년 12월 20일
0

FISA

목록 보기
24/61
post-thumbnail

Servlet

[HttpServlet]

0. HttpServlet?

  • http 통신을 지원하는 자바 기반의 웹 개발 지원 클래스이다.
  • 서블릿을 사용하고자하면 HttpServlet 상속이 필수다.
  • 네트워크 관련 코드 개발이 불필요하다 HttpServlet이 이를 해결해주기 때문이다.
  • 클라이언트에게 서비스하고자 하는 로직 개발만 집중해서 할수 있다.

1. HttpServletRequest

  • 정해진 메서드의 인자(=parameter)로 선언이 필수다.
  • 접속한 클라이언트의 요청 정보 및 ip 등을 확인 가능하게 해주는 객체이다.
  • 로그인

2. HttpServletRespone

  • 정해진메서드의 인자 선언 필수
  • 접속한 클라이언트에게만 응답하는 객체이다.

[핵심 API]

1. javax.servlet.http.HttpServlet

  1. get 방식 요청만 처리하는 메서드이다.
    doGet()
    ㅤ- 호출이 불가하고 클라이언트 요청시 감지한 servlet container(server) 내부의 처리 로직이 이미 구현되어 있음
    ㅤ- 그 로직상에서 해당 클라이언트 요청 감지후 자동 호출
  2. 클라이언트가 전송하는 데이터 반환 메서드
    ㅤ- String getParameter()
    ㅤ- input tag의 name 속성명

2. javax.servlet.http.HttpServletReequest

  1. 요청 데이터의 인코딩 설정
    ㅤ- 데이터를 추출하기 전에 인코딩 설정은 필수
  2. 클라이언트가 전송하는 데이터 반환 메서드
    ㅤ- String getParameter("input tag name 속성명");
    ㅤ- input tag는 클라이언트가 서버에 전송하는 데이터의 고유 이름
  3. getRequestDispatcher()
    ㅤ- forward 방식으로 web page 이동
  4. setAttribute(key, value)
    ㅤ- 요청 객체에 데이터 저장
  5. getAttribute(key)
    ㅤ- 요청 객체로 부터 저장된 데이터 반환

3. javax.servlet.http.HttpServletRespone

  1. 클라이언트에게 응답하는 포맷 설정 메서드
    ㅤ- setContentType("형식;인코딩");
    ㅤ- mime type 인터넷 상 데이터 포맷
    ㅤㅤ- 표현 스펙이 정해져있다.
  2. 클라이언트에게 한글 응답 처리 기능의 객체를 생성
    ㅤ- PrintWriter getWriter()
    ㅤ- 2byte씩 문자 처리 출력 객체이다.

[Servlet 객체 생성 시점]

1. Servlet 객체 생성 시점

  • 이미 서버에 바이트코드로는 존재한다.(war)
  • 최초 클라이언트가 호출 시 한 번만 바이트 코드를 로딩해서 객체를 생성한다.

2. HttpServletRequest & HttpServletResponse 생성 시점

  • 클라이언트 접속 시 해당 클라이언트만을 위한 객체들을 생성한다. -> 메서드 종료시 자동 소멸된다.

[Get, Post]

1. Get

  • 보안은 고려하지 않고 적은 데이터를 서버에 전송할 때 Get 방식을 권장한다.

2. Post

  • 보안을 고려하고 대량의 데이터를 전송해야할 때 Post 방식을 권장한다.
  • method="post"로 요청할 때 필수적으로 요청 방식을 명시해야 post 방식을 사용하게 된다.

3. doGet(), doPost(), service()

  • doGet(): get 방식만 자동 처리하는 특화된 메서드
  • doPost(): post 방식만 자동 처리하는 특화된 메서드
  • service(): get과 post 방식 둘다 처리하는 메서드

4. default 방식?

  • method="post" 코드가 없는 것들의 방식은 모두 get으로 호출되는 것을 확인할 수 있다.
  • 이 말은 다시 말해서 http의 요청 방식의 기본값이 get 방식인 것을 알수 있다.

[Servlet API을 이용한 이동 방식]

1. servlet 간의 이동시 사용

2. 종류

2-1.포워딩

  • url은 고정되어 있고 web page만 변경된다.
  • 주로 보안을 고려하거나 인증이 필요한 폐쇄형 서비스 화면에 적합하다.
  • servlet간에 이동시 요청 객체와 응답 객체

2-2. 리다이렉트

  • 이동시마다 url이 변경된다.
  • 주로 개방형 서비스 화면에 적합하다.

[forward VS Redirect]

1. forward 방식


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;


@WebServlet("/one")
public class ServletOne extends HttpServlet {
       

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("servlet One doGet()");
		porcess(request,response);
		
	}


	/* html -> servletOne -> servletTwo 순으로 이동
	 * servletOne -> servletTwo 이동
	 * 
	 * 방식 1 - forward 방식으로 이동
	 * 		   요청, 응답은 공유
	 * 		   요청 객체에 새로운 데이터 저장래서 servletTwo에서 사용
	 * 
	 * */
	//get방식은 post 방식 요청 공통된 로직은 사용자 정의 메서드로 구현한다.
	//사용자 정의 메서드는 명시적인 호출로 구현한다.
	protected void porcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setAttribute("eduName", "uri fisa");
		
		//forward servletTwo으로 이동
		//클라이언트에서 들어온 요청을 jsp, servlet으로 원하는 자원으로 보내는 역할을 수행한다. 
		request.getRequestDispatcher("two").forward(request, response);

	}

}
package step01;

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;

/**
 * Servlet implementation class ServletTwo
 */
@WebServlet("/two")
public class ServletTwo extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			
		System.out.println("servletTwo doGet()");
		process(request, response);
		
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("servletTwo doPost()");		
		process(request, response);
	}
	private void process(HttpServletRequest request, HttpServletResponse response) throws IOException {

		
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		out.println("two");
		
		out.println("h1");
		out.println("<font color ='red'>");
		out.println(request.getAttribute("eduName"));
		out.println("</font>");
		
	}

}
  • 포워드 방식은 one servlet에서 -> two servlet으로 이동하는데 이때 서블릿은 One Two로 나눠져 있지만 이는 사실 하나라고 봐도 무방하다.
  • 같은 요청을 넘겨 받아 사용하고 있기 때문에 setAttribute에 넣어준 값을 이용해 클라이언트에게 응답을 내려줄 수 있다

2. redirect


package step01;

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;


@WebServlet("/one")
public class ServletOne extends HttpServlet {
       

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("servlet One doGet()");
		porcess(request,response);
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("servletOne doPost()");
		porcess(request,response);
	}
	
	
	//사용자 정의 메서드는 명시적인 호출로 구현한다.
	protected void porcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setAttribute("eduName", "uri fisa");
		
		//forward servletTwo으로 이동
		//클라이언트에서 들어온 요청을 jsp, servlet으로 원하는 자원으로 보내는 역할을 수행한다. 
		//step02 - redirect로 servletTwo로 이동
		response.sendRedirect("two");
	
	}

}
  • redirect는 one servlet에서 two servlet으로 요청을 보내는 건 맞지만 이때 바로 보내는 것이 아니다.
  • 클라이언트가 서버에게 보낸 최초의 요청을 서버에서는 다시 클라이언트에게 보내 two servlet으로 보내라고 다시 보낸다.
  • 그럼 다시 클라이언트는 two servlet으로 해당 요청을 다시 보낸다.
profile
즐겁고 괴로운 개발😎

0개의 댓글