src/main/java
: 자바(서블릿) 소스 폴더- src/main/
webapp
: JSP 소스 파일 / 콘텐츠 폴더(HTML, CSS, JavaScript, 이미지 등..) > 정적파일- src/main/webapp/WEB-INF : 서버 관련 설정 파일
- src/main/webapp/WEB-INF/lib : *.jar 관리 폴더
- src/main/webapp/WEB-INF/web.xml : 사이트 설정 파일
💬 배포 서술자(web.xml)
웹 애플리케이션의 환경설정 정보를 담은 파일.
WAS가 처음 구동될 때 이 파일을 읽어 설정 내용을 톰캣에 적용한다.
- 웹 서버측(사이트)에서 동적인 페이지를 자바로 구현한 서버측 프로그램
- 서버 측에서 실행. 클라이언트의 요청을 받으면 서버에서 처리한 후, 응답으로 결괏값만 보내주는 구조
- 자바 진영의 첫번째 웹 기술
- 클라이언트의 요청에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트이다.
- MVC 모델에서 컨트롤러 역할을 한다.
- 모든 메서드는 스레드로 동작된다.
- javax.servlet.http 패키지의 HttpServlet 클래스를 상속받는다.
- 동적 웹 페이지 방식에서의 '전처리' 부분을 서블릿이 담당한다.
- 서블릿은 자바 파일(.java)을 컴파일한 클래스 파일(.class) 형태이며, 이를 실행하고 관리해주는 런타임을 서블릿 컨테이너라고 한다.
- 서버에 만들어진 서블릿이 스스로 작동하는 것이 아니라, 서블릿을 관리해주는 것이 필요한데, 이러한 역할을 하는 것이 바로 서블릿 컨테이너다.
- 대표적으로 아파치 톰캣(Apahce Tomcat)이 있다.
- 통신 지원
- 클라이언트와 통신하려면 서버는 특정 포트로 소켓을 열고 I/O 스트림을 생성하는 등 복잡한 과정이 필요하다. 서블릿 컨테이너는 이 과정을 간단히 해주는 API를 제공한다.
- 생명주기 관리
- 서블릿을 인스턴스화 후 초기화하고, 요청에 맞는 적절한 메서드를 호출한다. 응답한 후에는 가비지 컬렉션을 통해 객체를 소멸시킨다.
- 멀티스레딩 관리
- 서블릿 요청들은 스레드를 생성해 처리한다. 즉, 멀티스레드 방식으로 여러 요청을 동시에 처리할 수 있다.
- 선언적인 보안 관리 및 JSP 지원
- 보안 기능을 지원하므로 별도로 구현하지 않아도 된다.
- 클라이언트 요청
- HttpServletRequest, HttpServletResponse 객체 생성
- Web.xml이 어느 서블릿에 대해 요청한 것인지 탐색
- 해당하는 서블릿에서 service() 메소드 호출
- doGet() 또는 doPost() 호출
- 동적 페이지 생성 후 ServletResponse 객체에 응답 전송
- HttpServletRequest, HttpServletResponse 객체 소멸
1. 서블릿 클래스 선언
방법1) javax.servlet.Servlet 인터페이스를 구현한다. (고비용, 복잡함)
방법2)javax.servlet.http.HttpServlet
클래스를 상속받는다. (저비용, 간편함 ) -> 주로 사용
2. doGet/doPost 메소드 선언
- 둘 중 하나 선언 or 둘 다 선언
- 클라이언트(브라우저)의 요청이 들어오면, 서버측에서 자동으로 호출되는 메소드 (콜백 메소드)
동적으로 HTML 페이지를 만드는 역할
- 메소드 작성 규칙
- 매개변수 작성
a. javax.servlet.http.HttpServletReqeust
b. javax.servlet.http.HttpServletResponse- 예외 미루기
a. java.io.IOEception : 페이지를 동적으로 만드는 작업(외부 입출력 발생)
b. javax.servlet.ServletException : 서블릿과 관련 예외 처리
3. 동적 HTML 페이지 작성 구현
- doGet/doPost 내부에서 문서를 작성하기 위한 코드를 작성한다.
- HttpServletResponse 객체의 getWriter() 메소드 호출하면 PrintWriter 객체를 반환한다.
- PrintWriter 객체의 printXXX() 메소드를 사용해서 동적으로 클라이언트 코드를 작성한다.(=BufferedWriter 역할)
- 페이지 완성 > 브라우저에게 서비스(반환)
4. 브라우저가 자바 파일(서블릿)을 호출한다.
- 자바는 웹 기술이 아니다.
- 브라우저를 통해서 자바 파일을 실행할 수 없다.
- 브라우저가 웹 상에서 자바 파일을 호출할 수 있도록
가상 주소를 생성해서 서블릿에게 매핑
을 해야 한다.- webapp > WEB-INF >
web.xml
에서 매핑<servlet> <servlet-name>HelloWorld</servlet-name> // servlet 이름 <servlet-class>jwprj.servlet.HelloServlet</servlet-class> // 서블릿 클래스가 들어있는 경로 </servlet> <servlet-mapping> <servlet-name>HelloWorld</servlet-name> // 서블릿 이름 (위와 같아야함) <url-pattern>/hello</url-pattern> // 서블릿 요청 주소 매핑 </servlet-mapping>
[ 예제 ]
// 1. 서블릿 클래스 선언
// 방법1. javax.servlet.Servlet 인터페이스를 구현한다.
// 방법2. javax.servlet.http.HttpServlet 클래스를 상속받는다.
public class Ex02 extends HttpServlet {
// 2. doGet/doPost 메소드 선언
// a. 매개변수 작성
// 1. java.servlet.http.HttpServletRequest
// 2. java.servlet.http.HttpServletResponse
// b. 예외 미루기
// 1. java.io.IOException
// 2. java.servlet.ServletException
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
// 한글 깨짐 > UTF-8
response.setCharacterEncoding("UTF-8");
// 3. 동적 HTML 페이지 작성 구현
PrintWriter writer = response.getWriter();
writer.println("<html>");
writer.println("<head>");
writer.println("<meta charset='UTF-8'>");
writer.println("</head>");
writer.println("<body>");
writer.println("<h1>서블릿</h1>");
writer.println("<p>서블릿으로 만든 동적 웹페이지입니다.</p>");
writer.println("</body>");
writer.println("</html>");
writer.close(); // 이 작업을 안하면 페이지가 안 만들어진다.
// 4. 브라우저가 자바 파일(서블릿)을 호출한다.
// 자바는 웹을 지원하지 않는다!!!
// - http://localhost:8090/ServletTest/servlet/com.test.servlet.Ex02
// - http://localhost:8090/ServletTest/aaa
// * 이클립스
// - 서블릿에서 Ctrl + F11을 누르면 이클립스가 해당 서블릿에 매핑되어 있는 가상 주소를 대신 브라우저를 통해서 호출해준다.
}
}
<!-- web.xml -->
<servlet>
<servlet-name>ex02</servlet-name>
<servlet-class>com.test.servlet.Ex02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ex02</servlet-name>
<url-pattern>/ex02.do</url-pattern>
</servlet-mapping>
참고 자료
🔗 성낙형의 JSP 자바 웹 프로그래밍