1. 개요
이 기사에서는 Java – Servlets에서 웹 개발의 핵심 측면을 살펴볼 것입니다.
2. 서블릿과 컨테이너
간단히 말해서 서블릿은 요청을 처리하고 처리하고 응답으로 회신하는 클래스입니다.
예를 들어 서블릿을 사용하여 HTML 양식을 통해 사용자로부터 입력을 수집하고 데이터베이스에서 레코드를 쿼리하고 웹 페이지를 동적으로 생성할 수 있습니다.
서블릿은 서블릿 컨테이너 라는 다른 Java 애플리케이션의 제어를 받습니다. 웹 서버에서 실행 중인 애플리케이션이 요청 을 수신하면 서버는 요청을 서블릿 컨테이너로 전달하고 대상 서블릿으로 전달합니다.
3. 메이븐 의존성
웹 앱에서 서블릿 지원을 추가하려면 javax . servlet-api 의존성이 필요합니다.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
최신 maven 의존성은 여기 에서 찾을 수 있습니다 .
물론 앱을 배포할 서블릿 컨테이너도 구성해야 합니다. 이것은 Tomcat에서 WAR을 배포하는 방법을 시작하기에 좋은 곳 입니다.
4. 서블릿 라이프사이클
Servlet의 수명 주기를 정의하는 일련의 메서드를 살펴보겠습니다.
4.1. 초기화()
init 메소드는 한 번만 호출되도록 설계되었습니다. 서블릿의 인스턴스가 존재하지 않는 경우 웹 컨테이너는 다음을 수행합니다.
- 서블릿 클래스를 로드합니다.
- 서블릿 클래스의 인스턴스를 생성합니다.
- init 메소드 를 호출하여 초기화
init 메소드는 서블릿 이 요청을 수신하기 전에 성공적으로 완료되어야 합니다. 서블릿 컨테이너는 init 메소드가 ServletException 을 발생 시키거나 웹 서버에 의해 정의된 시간 내에 반환되지 않는 경우 서블릿을 서비스에 배치할 수 없습니다.
public void init() throws ServletException {
// Initialization code like set up database etc....
}
4.2. 서비스()
이 메소드는 서블릿의 init() 메소드가 성공적으로 완료된 후에만 호출 됩니다.
컨테이너 는 클라이언트에서 오는 요청을 처리하기 위해 service() 메서드를 호출하고 HTTP 요청 유형( GET , POST , PUT , DELETE 등)을 해석하고 doGet , doPost , doPut , doDelete 등의 메서드를 적절하게 호출합니다.
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
// ...
}
4.3. 파괴하다()
서블릿을 서비스에서 제외하기 위해 서블릿 컨테이너에 의해 호출됩니다.
이 메소드는 서블릿의 서비스 메소드 내의 모든 스레드가 종료되거나 제한 시간이 경과한 후에만 호출됩니다. 컨테이너가 이 메서드를 호출한 후에는 서블릿에서 서비스 메서드를 다시 호출하지 않습니다.
public void destroy() {
//
}
5. 서블릿 예
먼저 컨텍스트 루트 를 javax-servlets-1.0-SNAPSHOT 에서 /로 변경하려면 다음을 추가합니다.
<Context path="/" docBase="javax-servlets-1.0-SNAPSHOT"></Context>
$CATALINA_HOME\conf\server.xml 의 호스트 태그 아래 .
이제 양식을 사용하여 정보를 처리 하는 전체 예제를 설정해 보겠습니다 .
시작하려면 양식에 의해 게시된 정보를 캡처하고 RequestDispatcher 를 사용하여 결과를 반환하는 /calculateServlet 매핑으로 서블릿을 정의해 보겠습니다 .
@WebServlet(name = "FormServlet", urlPatterns = "/calculateServlet")
public class FormServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String height = request.getParameter("height");
String weight = request.getParameter("weight");
try {
double bmi = calculateBMI(
Double.parseDouble(weight),
Double.parseDouble(height));
request.setAttribute("bmi", bmi);
response.setHeader("Test", "Success");
response.setHeader("BMI", String.valueOf(bmi));
request.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(request, response);
} catch (Exception e) {
request.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(request, response);
}
}
private Double calculateBMI(Double weight, Double height) {
return weight / (height * height);
}
}
위에 표시된 것처럼 @WebServlet 어노테이션이 달린 클래스는 javax.servlet.http.HttpServlet 클래스 를 확장해야 합니다 . @WebServlet 어노테이션은 Java EE 6 이후 버전에서만 사용할 수 있다는 점에 유의해야 합니다 .
@WebServlet 어노테이션 은 배치 시 컨테이너에 의해 처리되며 해당 서블릿은 지정된 URL 패턴에서 사용 가능합니다. 어노테이션을 사용하여 URL 패턴을 정의하면 서블릿 매핑에 web.xml 이라는 XML 배포 설명자를 사용하지 않아도 됩니다.
어노테이션 없이 서블릿을 매핑하려면 기존 web.xml 을 대신 사용할 수 있습니다.
<web-app ...>
<servlet>
<servlet-name>FormServlet</servlet-name>
<servlet-class>com.root.FormServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FormServlet</servlet-name>
<url-pattern>/calculateServlet</url-pattern>
</servlet-mapping>
</web-app>
다음으로 기본 HTML 양식 을 만들어 보겠습니다 .
<form name="bmiForm" action="calculateServlet" method="POST">
<table>
<tr>
<td>Your Weight (kg) :</td>
<td><input type="text" name="weight"/></td>
</tr>
<tr>
<td>Your Height (m) :</td>
<td><input type="text" name="height"/></td>
</tr>
<th><input type="submit" value="Submit" name="find"/></th>
<th><input type="reset" value="Reset" name="reset" /></th>
</table>
<h2>${bmi}</h2>
</form>
마지막으로 모든 것이 예상대로 작동하는지 확인하기 위해 간단한 테스트도 작성해 보겠습니다.
public class FormServletLiveTest {
@Test
public void whenPostRequestUsingHttpClient_thenCorrect()
throws Exception {
HttpClient client = new DefaultHttpClient();
HttpPost method = new HttpPost(
"http://localhost:8080/calculateServlet");
List<BasicNameValuePair> nvps = new ArrayList<>();
nvps.add(new BasicNameValuePair("height", String.valueOf(2)));
nvps.add(new BasicNameValuePair("weight", String.valueOf(80)));
method.setEntity(new UrlEncodedFormEntity(nvps));
HttpResponse httpResponse = client.execute(method);
assertEquals("Success", httpResponse
.getHeaders("Test")[0].getValue());
assertEquals("20.0", httpResponse
.getHeaders("BMI")[0].getValue());
}
}
6. 서블릿, HttpServlet 및 JSP
서블릿 기술이 HTTP 프로토콜에 국한되지 않는다는 것을 이해하는 것이 중요 합니다.
실제로는 거의 항상 그렇지만 Servlet 은 일반 인터페이스이고 HttpServlet 은 doGet 및 doPost 등과 같은 HTTP 특정 지원을 추가하는 해당 인터페이스의 확장입니다 .
마지막으로 서블릿 기술은 JSP – JavaServer Pages , Spring MVC 등과 같은 다른 웹 기술의 주요 드라이버이기도 합니다 .
7. 결론
이 빠른 기사에서는 Java 웹 애플리케이션에서 서블릿의 기초를 소개했습니다.
예제 프로젝트는 GitHub 프로젝트 로 다운로드하여 그대로 실행할 수 있습니다 .