[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}
}