본문 바로가기

컴퓨터 프로그래밍/servlet

servlet API 관계도

이 서블릿이라는 기술은 tomcat, server side, was(web application server), container에서 실행되는 기술입니다. 자바 기반으로 만들어져 있습니다. A라는 이름의 servlet을 만들기 위해서 처음부터 만드려면 상당한 시간이 걸립니다. 시간을 줄이기 위해서 재사용 하는 방법을 이용하면 시간을 절약 할 수 있습니다. 재사용하는 것은 상속을 이용합니다. 서블릿을 만들때는 상속을 받으면 되는데, 이에 대한 것이 javax.servlet pacakge에 있습니다. 이를 만들기 위해 가장 센터가 되는 것은 GenericServlet 클래스입니다. genericServlet 은 부모가 두개 입니다. 두개의 interface는 servlet과 servletConfig입니다. 둘중 servlet 스러운 기능은 servlet으로 부터 가져옵니다. servletConfig에는 좀 더 advanced한 was와 관련된 또는 연관된 기능을 가져옵니다.

A라는 servlet을 만드려면, extends GenericServlet{을 통해서 만듭니다. 이렇게 되면 Servlet과 ServletConfig 기능을 다 가져오게 됩니다.

1. Servlet

 getServletConfig: getServletConfig를 반환합니다. 

init: ServletConfig를 set 하는 역할을 합니다. 인자값으로 servletConfig 객체를 받습니다. 

ServletConfig를 servlet을 가집니다. association 관계가 있습니다. 이 둘을 관계를 지어주는 것이 getServletConfig와 init입니다. 

 

2. ServletConfig

ServletContext()경우 주입의 통로는 없습니다. 이를 통해서 ServletContext와 관계를 규정지어줍니다. (한빛 미디어 책에 나와있긴 합니다.)

- 다시 genericServlet으로 갑니다. 

- 부모로 부터 물려 받은 기능이 아닌것은 log입니다. 별로 쓸일 없습니다. 

- init은 오버로딩이 되었습니다. 인자값 없는거 편리하게 사용하면 됩니다. 

- service를 사용하면 됩니다. 중요합니다. **** 

 

정리: Generic serlet을 상속 받고, service()매소드를 오버라이딩 하면 servlet을 만들 수 있습니다. 

그렇다면, service는 왜 오버라이딩 해야되나요?

- input type이 submit이 누르면, form 에 입력된 모든 값을 가지고 sevlet으로 갑니다. 요청(버튼)이 들어가면 servlet으로 가는데, servlet에 있는 service로 들어갑니다. service안에서 form에 입력된 값을 받으면 됩니다. 응수하는 메소드입니다. 모든 요청을 받는 역할을 합니다. service에서 요청을 받으면 어떤 요청이 왔는지 알아야 합니다. 어떻게 알수 있을 까요? service의 ServletRequest와 ServletResponse라는 도시락통 두개를 통해서 알수 있습니다. service에 가기 전에 ServletRequest와 ServletResponse라는 정보를 담는 객체에 넣어 줍니다. 

- ServletRequest(클라이언트의 요청 정보)와 ServletResponse(요청을 수행한 후 응답)두개의 인터페이스의 association이 생깁니다. service()가 둘을 가지고(hasing 관계) 있습니다. 

ServletConfig, ServletContext, ServletRequest, ServletResponse가 필요합니다.

 

HTTPServlet

다만, GenericServlet의 경우 프로토콜 독립적입니다. 이의 자식인 HTTPServlet은 HTTP종속적인 반면에 HTTP 특이적인 기능들이 많습니다. HTTP만의 파워풀하고 정교한 작업이 가능하려면 프로토콜 종속적인 HTTPServlet을 상속 받아서 구현하는 것이 좋습니다. 세션, 쿠키 사용등 프로그램을 정교하게 만들기 위한 정보를 받을 수 있습니다. 

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="encore">
search word:<input type ="text" name="word">
<input type = "submit" value="send">
</form>
</body>
</html>
package servlet.first;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class WordEncoreServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/*
		 * 1. 폼의 값을 받습니다. 
		 * 2. 받은 값을 수정합니다. 
		 * 3. 다시 웹브라우저로 전송하고 출력합니다. 
		 * 
		 */
		String wName=request.getParameter("word");
		wName = wName+".......update Server Side";
		
		PrintWriter out = response.getWriter();
		out.println("<html><body>");
		out.println("<h2>Client sends data.<br>");
		out.println(wName+"</h2></body></html>");
		out.close();
	
	}

}
<servlet>
    <description></description>
    <display-name>WordEncoreServlet</display-name>
    <servlet-name>WordEncoreServlet</servlet-name>
    <servlet-class>servlet.first.WordEncoreServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>WordEncoreServlet</servlet-name>
    <url-pattern>/encore</url-pattern>
  </servlet-mapping>

WEB-INF를 기준으로 정적인 문서와 동적인 문서가 나뉘게 됩니다. 

'컴퓨터 프로그래밍 > servlet' 카테고리의 다른 글

get과 post  (0) 2020.06.02
CGI(Common gateway interface) 기술  (0) 2020.06.01
web server와 WAS  (0) 2020.06.01
servlet과 XML  (0) 2020.06.01
eclipse-apache tomcat server 연동  (0) 2020.06.01