공부/Java

Servlet 제작하기

Egomi 2017. 5. 25. 11:50

서버는 크게 어플리케이션 서버와 웹 서버로 나뉘어진다.

어플리케이션 서버는 톰캣과 같이 WAS의 역할을 하는 것이고, 웹 서버는 프로젝트의 경로를 갖고 있는 서버이다.

보통은 아파치 톰캣이 웹 서버의 일부 기능을 갖고 있기 때문에 별도의 웹 서버를 이용하지 않아도 된다.

단, JAVA만을 이용할 경우이다. JSP가 아닌, PHP 같은 언어로 웹 개발을 할 경우에는 웹 서버의 기능을 할 수 없다.


JAVA의 웹 서버를 한 번 이용해보자.


1. Web.xml에 어느 서블릿을 사용할 것인지 알려주기.

 톰캣에 요청이 들어왔을 때, 어느 서블릿을 사용할 것인지 알려줘야한다. 

/WEB-INF/web.xml 을 생성하여 다음을 추가해주자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee                       
                        http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
   
   <servlet>
      <servlet-name>mean servlet</servlet-name>
      <servlet-class>MeanServlet</servlet-class>
   </servlet>
  
   <!-- 이때는 요청이 오면 요청이 오고 나서 메모리에 로드시킨다 (그래서 맨 처음 요청시에는 조금 느릴 수 있음)
   <load-on-startup>1</load-on-startup>을 쓴다면 톰캣이 로드되자마다 메모리에 모든 서블릿을 올리지만
   이는 당장 필요하지 않은 것들도 메모리에 올리기 때문에 수행성능이 좋지 않을 수 있다. -->
   
   <!-- 어떤 url요청이 오면 이 요청은 어플리케이션 서버에게 맡겨라 하는 지시서를 만들기 위한 공간 -->
   <servlet-mapping>
      <servlet-name>mean servlet</servlet-name>
      <url-pattern>/mean</url-pattern>
      <!-- /mean이라는 url요청이 오면 예외적으로 해당하는 하나의 함수만 실행시켜라/ url당 서비스함수 1개 -->
   </servlet-mapping>
   
</web-app>
cs

Servlet-Mapping은 URL 요청이 들어왔을 때, 연결해줄 Servlet을 명시해주는 것이고,

Servlet은 Java Class로 연결을 해주는 역할을 해준다.


요청을 처리할 MeanServlet이란 클래스 파일에는 HttpServlet을 상속 받아 Request객체와 Response 객체를 이용한다.

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MeanServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String d = (String) request.getParameter("data");
System.out.println(d);
String[] strD = d.split(",");
double[] data = new double[strD.length];
for(int i=0;i<strD.length;i++){
data[i] = Double.valueOf(strD[i]);
System.out.println(data[i]);
}
//double[] data=dourequest.getAttribute("data");
Statistics stat = new Statistics(data);
double result = stat.mean();
System.out.println(result);
response.getWriter().write(String.valueOf(result));
}
}



이 방법 외에도 어노테이션을 이용하여 서블릿 매핑을 해줄 수도 있다. ex) @WebServlet("/")