Eclipse를 이용한 Servlet Programming
Project 안에 있는 WebContent가 홈 디렉터리이다.
Project를 개발할 때 Root에 해당되는 프로젝트는 Context명을 갖지 않는게 좋다.
1
2
3
Project 우클릭 -> Web Project Settings -> Context root : / 로 변경
이때! 켜져있던 Tomcat Server 껐다가 다시 켜주기!
Annotation으로 Servlet Mapping 설정
web.xml -> web-app 에 있는 metadata-complet = “true” 에서 “false”로 변경해주기
후에 클래스 위에 Annotation 설정!
1
2
3
@WebServlet("/hi") 써주기!!
Annotation을 이용하면 협업에도 훨씬 도움이 된다!
Servlet 출력 형식 지정
Java를 예를 들어보자
1
2
3
4
OutputStream out = new OuptputStream();
for(int i=0;i<100;i++)
out.println("hi");
이런식으로 코드가 작성이 되어 있을 때
크롬 브라우저로 켰을 때와
Microsoft Edge 브라우저로 켰을 때 다르게 표시된다.
왜?
Microsoft Edge 브라우저는 html로 해석하고
크롬 브라우저는 text로 해석하기 때문이다.
이를 보면, 각 브라우저들이 컨텐츠 형식을 알려주지 않은 경우에는 자의적인 해석을 하는 것을 볼 수 있다.
1
2
3
4
PrintWriter out = rep.getWriter();
for(int i=0;i<100;i++)
out.println("hi<br >");
따라서 이렇게 코드를 치면
이번에는 Microsoft Edge 브라우저는 잘 뜨지만
크롬 브라우저는 이상하게 뜨게 된다.
따라서 출력 형식을 지정해줘야 한다!
한글과 콘텐츠 형식 출력하기
기본적으로 웹서버에서 클라이언트로 보내는 Encoding 방식은 ISO-8859-1 이다.
이런 방식은 1Byte씩 보내게 되는데, 한글은 2Byte씩 보내서 표현을 해야 한다.
(이런 방식은 ??가 뜨게 된다.)
UTF-8 은 2Byte씩 보내지만 웹 브라우저가 다른 코드로 잘못 해석한 경우
(이런 방식은 띏뗅똟 가 뜨게 된다.)
어떻게 하면 한글을 보낼 수 있을까?
1
2
3
4
5
6
7
8
9
10
11
HttpServletResponse 파라미터를 이용하자!
public class Nana extends HttpServlet{
@Override
protected void service(HttpServletRequest req,
HttpServletResponse rep) throws IOException, ServletException
{
rep.setCharacterEncoding("UTF-8"); // 사용자가 보내는 코딩 방식을 결정!
rep.setContentType("text/html; charset=UTF-8"); // 받았을 때 어떤 방식으로 해석할거냐 결정
}
}
이렇게 한글을 출력 할 수 있다.
입력(Query String)
URL에
-
http://localhost/hello
-
http://localhost/hello?cnt=3
이렇게 올 수 있다.
여기서 ?cnt=3 이 QueryString이 된다!
이 부분은 Request 입력 부분을 활용하자!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Nana extends HttpServlet{
@Override
protected void service(HttpServletRequest req,
HttpServletResponse rep) throws IOException, ServletException
{
rep.setCharacterEncoding("UTF-8"); // 사용자가 보내는 코딩 방식을 결정!
rep.setContentType("text/html; charset=UTF-8"); // 받았을 때 어떤 방식으로 해석할거냐 결정
int cnt = Integer.parseInt(req.getParameter("cnt")); // 서로 약속을 해야 한다 (서버는 cnt를 보낼 것을 알고 있어야 한다.)
// 문자열이 오니까 parseInt를 이용해 Int로 변환
for(int i=0;i<cnt;i++)
//이렇게 활용 가능
}
}
기본값도 설정해줘야 한다.
URL에 위의 코드를 적용하면
-
http://localhost/hello?cnt=3 -> “3” 이 올 것이고
-
http://localhost/hello?cnt= -> ““이 올 것이고
-
http://localhost/hello? -> null
-
http://localhost/hello -> null
가 올 수 있다.
따라서
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Nana extends HttpServlet{
@Override
protected void service(HttpServletRequest req,
HttpServletResponse rep) throws IOException, ServletException
{
rep.setCharacterEncoding("UTF-8"); // 사용자가 보내는 코딩 방식을 결정!
rep.setContentType("text/html; charset=UTF-8"); // 받았을 때 어떤 방식으로 해석할거냐 결정
String count = req.getParameter("cnt");
int cnt = 3;
if(count != null && count.equals(""))
cnt = Integer.parseInt(count); // 서로 약속을 해야 한다 (서버는 cnt를 보낼 것을 알고 있어야 한다.)
// 문자열이 오니까 parseInt를 이용해 Int로 변환
for(int i=0;i<cnt;i++)
//이렇게 활용 가능
}
}