[Spring]Servlet(HttpServletRequest,HttpServletResponse)개념 및 예제
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가지
- GET - 쿼리 파라미터
- POST - HTML의 FORM 사용
- 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} }
댓글을 사용할 수 없습니다.