본문 바로가기
JS & TS/Frontend

[Servlet] 서블릿 Servlet (개념, 계산기 예제)

by heekng 2021. 2. 27.
반응형

[Servlet] 서블릿 Servlet (개념, 계산기 예제)

서블릿은 요청(request)과 응답(response)을 직접 조작해서 데이터를 전송, 수신한다.

단순하게 설명하면, 위와 같은 형태로 요청과 응답을 한다.

목차
  1. 목차1
  2. 목차2

Servlet을 이용한 데이터 수송신

서블릿은 HttpServlet클래스를 상속받는다.

doGet()메소드와 doPost()메소드를 재정의해서 데이터 전송 방식에 따른 전송 내용을 작성한다.

Dinamic Web Project에서 서블릿 작성 위치

서블릿을 작성하는 위치는 웹 프로젝트 - Java Resources -> src폴더 속 이다.

서블릿은 또 다른 언어가 아닌 Java의 클래스 이므로 .java로 작성된다.

블로그 작성을 위해 WebContent속 폴더에 따로 작성했지만 정상적으로는 WebContent폴더 속에 바로 작성한다.

package com.servlet;

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;

/**
 * Servlet implementation class servletBlog1
 */
@WebServlet("/servletBlog1") //어노테이션으로 서블릿의 이름을 표시하며, JSP파일에서 접근하기 위한 이름이다.
public class servletBlog1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public servletBlog1() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//GET방식 코드 작성
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//POST방식 코드 작성
	}

}

 

기본적인 서블릿의 코드는 위와 같다.

@WebServlet("name")형태의 어노테이션으로 외부에서 접근하는 서블릿 이름을 작성한다.

doGet 메소드와 doPost 메소드에 데이터 송수신 소스코드를 작성한다.


Servlet에서 이용하는 메소드

외부에서 서블릿 페이지로 접근한 내용을 다룰 때에는 request객체를 이용한다.

또한 서블릿 페이지에서 다른 페이지로 정보를 보낼 때에는 response객체를 이용한다.

 

[request 또는 response].setCharactoerEncoding("[인코딩형식]") : 인코딩 형식을 설정

request.setContentType("응답할 페이지타입") : 응답할 페이지 타입 설정 / text/html; charset=UTF-8; 정도만 작성하면 된다.

request.getParameter() : 받아온 데이터에 접근

repsonse.getWriter() : PrintWriter객체를 리턴한다, PrintWriter객체를 통해 서블릿 페이지에 문서를 작성한다.


간단한 Servlet 예제 (서블릿 페이지로 이동하기)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>서블릿 테스트</title>
</head>
<body>
	<h2>서블릿 테스트하기</h2>
	<!-- submit시 servletBlog1 서블릿 페이지로 정보를 전송한다. -->
	<!-- 전송 방식을 설정하지 않으면 기본 GET방식으로 작동한다. -->
	<form action="servletBlog1"> 
		<p>이름 입력 후 버튼을 눌러 서블릿 페이지로 이름 전송</p>
		<input type="text" name="name">
		<input type="submit" value="버튼">
	</form>
</body>
</html>

package com.servlet;

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 servletBlog1
 */
@WebServlet("/servletBlog1") //어노테이션으로 서블릿의 이름을 표시하며, JSP파일에서 접근하기 위한 이름이다.
public class servletBlog1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public servletBlog1() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//GET방식 코드 작성
		//request와 response 인코딩 UTF-8로 변경
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		
		//현재 페이지 인코딩 설정
		response.setContentType("text/html; charset=UTF-8;");
		
		//key값이 name인 데이터의 value를 String name에 저장
		String name = request.getParameter("name");
		
		//reponse의 PritnWriter객체 생성
		PrintWriter out = response.getWriter();

		//write메소드 속에는 html문서를 작성한다.
		out.write("<html><body>");
		out.write("<h1>"+name+"님 이 집속하셨습니다.</h1>");
		out.write("<a href='blog1.jsp'>초기화면으로 이동</a>");
		out.write("</body></html>");
		//out.write는 버퍼를 이용하므로 close를 꼭 해줘야 출력된다.
		out.close();
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//POST방식 코드 작성
	}

}

정상적으로 작성한 문자가 전송되고 출력된다.

 


보안성을 위한 web.xml작성

위에서 작성한 내용을 보면 URL에서 초기 메인화면이 blog1.jsp임을 확인할 수 있다.

위처럼 해당 페이지의 이름이 직접적으로 노출되면 보안에 취약할 수 있다.

WebContent/WEB-INF/web.xml문서를 수정하면 원하는 키워드가 주소에 포함되었을 떄 이동하는 페이지를 매핑하여 보안성을 높일 수 있다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>blog</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
  	<!-- 찾아온 이름이 main-jsp이라면 -->
  	<servlet-name>main-jsp</servlet-name>
  	<!-- 요청한 경로 대신 blog1.jsp를 응답해준다. -->
	<jsp-file>/blog1.jsp</jsp-file>
  </servlet>
  <servlet-mapping>
  	<!-- main-jsp로 찾아간다. -->
  	<servlet-name>main-jsp</servlet-name>
  	<!-- 클라이언트가 요청한 URL에 test가 들어 있다면 -->
  	<url-pattern>/test</url-pattern>
  </servlet-mapping>
  
</web-app>

위처럼 web.xml을 수정하면 test로 URL상 blog1.jsp는 test로 출력되고, test로 이동을 원하면 blog1.jsp로 이동하게 된다.

 

반응형