Servlet객체 생성 방법

Servlet객체를 생성하려면 클래스를 만들고 만든 클래스에 HttpServlet를 상속을 받는다.
그 후 @WebServlet를 등록한다.

@WebServlet(name="servletTest", urlPatterns="/test")
// name = 서블릿 이름
// urlPatterns = URI주소
public ServletTest extends HttpServlet{

}

* HttpServlet 상속을 받으면 HttpServletRequest와 HttpServletResponse를 사용할 수 있다.

HttpServletRequest의 역할

  • Http 요청 메시지를 개발자가 편하게 파싱 할 수 있도록 도와주고 결과를 HttpServletRequest객체에 담아서 제공한다.

예) HTTP 요청 메시지

시작라인 GET /test HTTP/1.1
헤더라인 Host : localhost:9090
Content-Type : application/x-www-form-urlencoded
공백라인  
body부분  

사용 방법

/* 시작라인 */
System.out.println(request.getMethod()); //  http 메서드 반환 => GET

System.out.println(request.getProtocal()); //  프로토콜 반환 => HTTP/1.1

System.out.println(request.getScheme()); // 스키마 반환 => http

System.out.println(request.getRequestURL()); // URL 반환 =>http://localst:9090/test

System.out.println(request.getRequestURI()); // URI 반환 => /test

System.out.println(request.getQueryString()); // 쿼리파라미터 반환
// 쿼리 파라미터 예) localhost:9090/test?username=hoestory
// => username=hoestory를 반환

System.out.println(request.isSecure()); // https 사용유무

/* 헤더 라인 */

System.out.println(request.getServerName()); // 서버 이름 반환(Host) => localhost

System.out.println(request.getServerPort()); // 서버 포트번호 반환 => 9090

System.out.println(request.getContentType()); // ContentType반한 => null

System.out.println(request.getCharacterEncoding()); // CharacterEncoding 반환 => UTF-8

System.out.println(request.getContentLength()); // 내용크기 반환

HTTP 요청 데이터

  • HTTP 요청 메시지를 클라이언트에서 서버로 데이터를 전달하는 방법 3가지
  1. GET - 쿼리 파라미터
  2. POST - HTML의 FORM 사용
  3. HTTP message body에 데이터를 직접 담아서 요청

GET -쿼리 파라미터

  • url? 파라미터명1 = 파라미터 값 & 파라미터명 2 & 파라미터 값 예) localhost:9090/test? name=hoestory&age=24
    (파라미터가 여러 개 있을 경우 &를 사용)
  • HTTP 메서드인 GET은 message body 없이 URL의 쿼리 파라미터에 데이터를 포함해서 전달을 한다.

POST - HTML의 FORM

  • HTML의 FORM를 통해 데이터를 서버로 요청했을 경우 content-type는 application/x-www.form-unlencoded이다.
  • 메시지 바디에 GET과 같은 방법인 쿼리 파라미터 형식으로 전달한다.

쿼리 파라미터 조회

// localhost:9090/test?name=hoestory&age=24

@Override
protected void service(HttpServletRequest request, HttpServletResponse response)\
                            thorws ServletException, IOException{

    // request.getParameter("파라미터명");
    String name = request.getParameter("name"); // hoestory

    // age는 정수형인데 왜 반환타입이 String일까?
    // => 쿼리 파라미터로 들어온거는 다 문자열로 취급
    String age = request.getParameter("age"); // 24

    // 만약 age를 숫자로 받고 싶으면 형변환을 해주면된다.
    // int age = Integer.parseInt(request.getParameter("age"));

    // 전체 파라미터 조회 방법 => request.getParameterNames()
    request.getParameterNames().asIterator().forEachRemaining(paramName -> 
                    System.out.println(paramName + "=" request.getParameter(paramName)));
      // => name=hoestory \n age=24

      // 만약 파라미터가 name=hoestory&age=24&name=jeong 일경우 => request.getParameterValues("파라미터명")
      String[] names = request.getParameterValues("name");
      for(String name : names) {
          System.out.println("name = " + name);
        // name = hoestory
        // name = jeong
    }  

}

HTTP message body에 데이터를 담아서 요청

  • 주로 HTTP API에서 주로 사용한다.
  • JSON, XML, TEXT로 데이터를 입력한다. 주로 JSON 사용
  • HTTP 메서드에서는 POST, PUT, PATCH 방식으로 요청
    (POST, PUT, PATCH에 대한 거는 https://hoestory.tistory.com/6 에들어가서 확인)

JSON 형식

{
    "name" : "hoestory",
    "age" : 24
}

HTTP 메시지 바디의 데이터 받아서 사용하기

@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
                                thorws ServletException, IOException{

            //메시지 바디의 내용을 바이트코드로 받아오기
            ServletInputStream inputStream = request.getInputStream();
            // 스프링에서 제공하는 StreamUtils를 사용하여 문자열로 받기
            // StandardCharsets.UTF_8 => 한글 안깨지게 하기 위한 코드

            String message = StreamUtils를.copyToString(inputStream, StandardCharsets.UTF_8);

           // message body : 서블릿

           System.out.println("message = " + message) // message = 서블릿
}

HTTP 요청 데이터를 JSON형식으로 API 메시지 바디로부터 받기

@Getter
@Setter
class JsonData {
    private String name;
    private int age;
}

// message body => { "name":"hoestory", "age":24}
// content-type : application/json



@WebServlet(name="requestBodyJson" urlPatterns="/test-json")
public class RequestBodyJson extends HttpServlet {

        // JSON 방식을 자바 객체로 변경해주는 Jackson 라이브러리
        private ObjectMapper objectMapper = new ObjectMapper();

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

                ServletInputStream inputStream = request.getInputStream();
                String jsonBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

                JsonData jsonData = objectMapper.readValue(jsonBody, JsonData.class);

                System.out.println(jsonData.getName()); // hoestory
                System.out.println(jsonData.getAge()); // 24
        }

HttpServletResponse의 역할

  • HTTP 응답 코드를 지정해주고 헤더와 바디를 생성한다.

 

HttpServletResponse 헤더 설정하는 법

@Override
protected void service(HttpServletRequest reqeust, HttpServletResponse response)
			thorws ServletException, IOException{
            // 상태
            response.setStauts(200); // 성공
            // or
            response.setStatus(HttpServletResponse.SC_OK);
            
            // 응답 헤더
            response.setHeader("Content-Type", "text/html;charset=utf-8");
            
            // or
            
            response.setHeader("Content-Type", "text/plain;charset=utf-8");
            
            // 캐시 설정
          	response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
            
            // 캐시 안남게 하는 설정
            response.setHeader("Pragma", "no-cache");
            
            // 사용자 임의 설정
            response.setHeader("hoestory-header","good");
            
            // 리다이렉트 상태코드 3xx
            response.sendRedirect(redirect할 경로);

 

HTTP 응답 JSON 형식으로 반환

@Getter
@Setter
class JsonData {
    private String name;
    private int age;
}

// Json형식을 자바 객체로 변환해주는 Jackson 라이브러리
private ObjectMapper objectMapper = new ObjectMapper();

@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
					throws ServletException, IOException{
		// json형식으로 응답을 보낼려면 content-type이 application/json이여야함
        response.setHeader("content-type","application/json");
        // 한글안깨지게 하기 위함
        response.setCharacterEncoding("utf-8");
        
        JsonData jsonData = new JsonData();
        jsonData.setName("hoestory");
        jsonData.setAge(24);
        
        //자바 객체로 json형태로 변경해주는메소드 => writeValueAsString()
        String jsonResult = objectMapper.writeValueAsString(jsonData);
        // => {"name":"hoestory","age":24}
        
}