[Servlet
] --HTML코드 출력 문제--> JSP
--스파게티 코드 문제--> JSP MVC
-> Spring MVC
-> SpringBoot
HTTP Method 중 하나로,
직접적으로 URL을 입력해 서버로부터 원하는 정보를GET
하는 요청이 GET요청이다.
http://localhost:8080/hello
이렇게 URL을 입력하면 /hello
에 매핑된 정보가 요청되는데
그 정보는 GET 매핑이 처리된 것이고, 클라이언트는 GET요청을 통해 원하는 정보를 얻게되는 것이다.
클라이언트가 URL을 통해 정보를 요청할 때 데이터를 전달하는 방법 중 하나
http://localhost:8080/hello?cnt=1&name=ykj
엔드포인트에 ?
을 붙임으로써 Query String의 시작임을 명시한다.
parameter = value
형식으로 작성한다.
여러 데이터를 전송할 때에는 &
기호를 통해 열거한다.
(cnt=10
이 Query String으로 넘겨져 10번의 문자열 출력을 확인할 수 있다.)
@WebServlet("/hello")
public class Company extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
int cnt = Integer.parseInt(request.getParameter("cnt"));
for (int i = 0; i < cnt; i++) {
out.println("Hello Servlet <br>");
}
}
}
위 코드에서
int cnt = Integer.parseInt(request.getParameter("cnt"));
for (int i = 0; i < cnt; i++) {
out.println("Hello Servlet <br>");
}
이 코드는
/hello
로 요청이 올 때 cnt
라는 parameter로 넘어오는 Query String에 대해 그 수 만큼 Hello Servlet
을 출력하는 코드이다.
/hello
로 GET 요청(request)이 들어오고 그에 같이 오는 parameter를 받으므로 request.getParameter()
형식으로 받아준다.
int cnt;
String temp = request.getParameter("cnt");
cnt = temp != null && !temp.equals("") ? Integer.parseInt(temp) : 1;
for (int i = 0; i < cnt; i++) {
out.println("Hello Servlet <br>");
}
이렇게 코드를 수정해주면 cnt
값이 제대로 넘어가지 않았을 때 발생할 수 있는 문제들을 방지해준다.
문제 발생 시, cnt=1
(?cnt
까지만 Query String이 입력됐지만 기본 값인 cnt=1
으로 인식됨을 확인할 수 있다.)
HTML form태그를 활용해 데이터를 서버로 전달해보자.
<form action="hello">
<input type="text" name="cnt"/>
<input type="submit" value="출력"/>
</form>
localhost:8080
+ <form action="hello" ->/hello
+ name="cnt" -> &cnt=3
이렇게 form태그를 통해 전달할 수 있다.
이처럼 Query String으로 완성돼 URL이 요청됨을 확인할 수 있다.
Query String이 너무 길어진다면 ex ) ?name=ykj&age=24&introduce=iamstudentofkonkuk&~~~~~~~~~~~
POST 요청을 통해 내용을 전달하면 URL이 너무 길어지는 것을 방지할 수 있다.
@WebServlet("/notice-reg")
public class NoticeReg extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
String title = request.getParameter("title");
String content = request.getParameter("content");
out.println(title);
out.println(content);
}
}
<form action="notice-reg" method="post">
<div>
<label>제목 : </label><input type="text" name="title"/>
</div>
<div>
<label>내용 : </label ><textarea name="content"/>
</div>
<input type="submit" value="출력"/>
</form>
똑같은 요청에 대한
GET 요청에 대한 응답
POST 요청에 대한 응답
이처럼 한글을 입력했을 때에는 제대로 인코딩되지 않고 있다.
그 이유는
Client (UTF-8)
---request--->WS (ISO-8859-1)
- UTF-8 인코딩 방식은 2바이트를 사용해 문자를 표현
- ISO-8859-1 인코딩 방식은 1바이트를 사용해 문자를 표현
이 차이로 인해 한글 입력시 문자가 깨지게 되는 것이다. 이를 방지하기 위해서는
request.setCharacterEncoding("UTF-8");
을 Servlet 파일에 입력해주면 된다.
@WebServlet("/notice-reg")
public class NoticeReg extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
String title = request.getParameter("title");
String content = request.getParameter("content");
out.println(title);
out.println(content);
}
}
이제는 문자가 깨지지 않고 출력됨을 확인할 수 있다.