[Back-End] Servlet

unzinzanda·2023년 3월 23일
0

Back-end

목록 보기
1/4
post-thumbnail

Web Architecture

Web Architecture

  • web browser : data를 발생시킴.(GET / POST)
  • page 이동 방법
    - url 입력
    - link
    - form : GET / POST
    → form에 POST를 입력하지 않는 나머지는 전부 GET 방식

eclipse setting

eclipse encoding 설정

  • window 메뉴의 preferences에서 encoding 검색 후 UTF-8로 설정.

Dynamic Web project 생성

  1. New >> Dynamic Web Project 선택.
  2. project name 설정 후 target runtime 선택.
  3. context root와 content directory 확인(변경 가능)
    - Dynamic web module의 버전이 3.0 이상이면 체크 박스에 체크 해제

project 구조


Servlet

Servlet

  • 자바에서 사용하여 웹 페이지를 동적으로 생성하는 서버 측 프로그램 혹은 사양.
  • 자바 서블릿은 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종.
  • JSP와 비슷한 점이 있지만 JSP는 HTML 문서 안에 Java 코드를 포함하고 있는 반면, 서블릿은 자바 코드 안에 HTML을 포함하고 있다는 차이점이 있음.

Servlet 동작 흐름

Servlet API

Servlet 사용

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	// 추가해야 한글 출력이 깨지지 않음.
		response.setContentType("text/html;charset=utf-8");
		
		// printWriter을 통해 서버에서 html 출력
		PrintWriter out = response.getWriter();
		
		out.println("<html>");
		out.println("	<body>");
		out.println("		Hello Servlet !!!");
		out.println("		안녕 서블릿 !!!");
		out.println("	</body>");
		out.println("</html>");
	}

}
  • 일반적으로 웹에선 HttpServlet을 상속받아 사용.
  • HttpServlet을 extends하면 기존의 GenericServlet을 사용했을 때보다 메소드를 더 세분화하여 구현 가능. (나누어진 메소드 중 적어도 하나를 구현하면 사용 가능)
  • url mapping : servlet의 이름, 주소에 url mapping을 적어 servlet에 접근.
    servlet 파일을 생성할 때나 파일 내에서 변경 가능.
  • 서버에선 html을 출력할 수 없으므로 응답으로 보내서 출력을 해줄 출력 객체가 필요
    → PrintWriter
  • 위 코드의 출력 결과

Servlet Life-cycle

Servlet Life-Cycle

  • Servlet class는 javaSE에서의 class와는 다르게 main method가 없음.
  • 즉, 객체의 생성부터 사용(method call)의 주체가 사용자가 아닌 Servlet Container에게 있음.
  • Client가 요청(request)을 하게 되면 Servlet Container는 Servlet 객체를 생성(최초 1회)하고 초기화(최초 1회)하며 요청에 대한 처리(요청 시 마다 반복)를 하게 됨.
  • 또한 Servlet 객체가 필요 없게 되면 제거하는 일까지 Container가 담당.

Servlet Life-Cycle의 주요 method

예시

@WebServlet("/life")
public class LifeCycle extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public LifeCycle() {
        super();
        System.out.println("Constructor call!!");
    }

	@Override
	public void destroy() {
		super.destroy();
		System.out.println("destroy call!!");  
	}

	@Override
	public void init() throws ServletException {
		super.init();
		System.out.println("init call!!");
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("service call!!");
	}
}

  • 출력 결과에서 볼 수 있듯이 constructor와 init은 처음 페이지에 들어갔을 때만 호출되고 이후 다시 그 페이지를 들어갈 때는 service만 호출.
  • destroy는 servlet 파일을 변경하고 저장하는 등의 일로 인해 reload될 때 호출.


Servlet Parameter 처리

Parameter 전송 방식

GET에서의 URL

GET 메소드 예시

  • parameter.html 일부
// 입력 받은 값을 servlet에게 전달
<script>
      document.querySelector("#btn-send").addEventListener("click", function () {
        if (!document.querySelector("#username").value) {
          alert("이름 입력!!");
          return;
        } else if (!document.querySelector("#userpwd").value) {
          alert("비밀번호 입력!!");
          return;
        } else {
          let form = document.querySelector("#form-param");
			// form을 전송하면 /basic/param 서블릿이 받음
            // /basic : url mapping, 현재 프로젝트의 WebContent까지의 경로 의미
          form.setAttribute("action", "/basic/param");
          form.submit();
        }
      });
</script>
  • servlet의 GET method
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	// 넘어오는 값을 처리 -> request
	// getParameter(name) : 값을 가져옴.
	String username = request.getParameter("username");
	String userpwd = request.getParameter("userpwd");
	String fruit[] = request.getParameterValues("fruit");
		
	response.setContentType("text/html;charset=utf-8");
	PrintWriter out = response.getWriter();
	out.println("<html>");
	out.println("	<body>");
	out.println("		Hello Servlet !!!");
	out.println("		안녕 서블릿 !!!");
	out.println(username + " 님 비번은 " + userpwd + "이고 좋아하는 과일은 " + Arrays.toString(fruit) + "입니다." );
	out.println("	</body>");
	out.println("</html>");
}
  • getParameter() : 값 하나를 얻어옴.
  • getParameterValues : 값을 여러 개 가져옴.

  • servlet POST method
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	// POST에서는 이거 해줘야 한글 안 깨짐
	request.setCharacterEncoding("utf-8");

	// doGet호출하여 출력
	doGet(request, response);
}
profile
안녕하세요 :)

0개의 댓글