🍁Servlet Class
Servlet Class는 서블릿 기술을 구현한 실제 클래스이다.
클라이언트(브라우저)의 요청에 따라 동적으로 웹 페이지를 생산한다.
🍂Servlet Class 작성 규칙
1. 서블릿 클래스 선언
a. javax.servlet.Servlet 인터페이스를 구현한다.
b. javax.servlet.http.HttpServlet 클래스를 상속받는다.
public class Ex01 extends HttpServlet {
}
a는 복잡하고 비용이 높지만, 구현이 자유롭다.
b는 단순하며 비용이 낮으며, 우리가 해야 할 일을 클래스로 제공하여할 일이 많이 줄어든다. 대신 이미 구현이 끝나 있는 상태이기 때문에 구현이 덜 자유롭다.
a와 b는 동급이므로 무엇을 선택하여 구현하든 상관이 없지만, 인터페이스를 구현하는 게 손이 많이 가고, b보다 월등하게 뛰어난 건 아니므로 대부분 b를 선택한다.
2. doGet/doPost 메서드 선언
이 메서드는 예약된 이름의 메서드이다.
클라이언트(브라우저)의 요청이 들어오면 자동으로 호출되기 때문에 예약된 이름으로 사용하는 것이다.
// 메서드 및 매개변수 선언, 예외 미루기
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
}
doGet/doPost 메서드는 HTML 페이지를 만드는 메서드로, 요청 메서드라고 부른다.
업무에 따라 둘 중 하나만 선언하기도 하며, 둘 다 선언하기도 한다는 특징이 있다.
📜메서드 작성 규칙
a. 매개변수
1. java.servlet.http.HttpServletRequest
2. java.servlet.http.HttpServletResponse
b. 예외 미루기
1. java.io.IOException
2. java.servlet.ServletException
3. 동적 HTML 페이지 작성 구현
PrintWriter writer = resp.getWriter();
writer.println("<html>");
writer.println("<head>");
writer.println("<meta charset='UTF-8'>");
writer.println("<style>");
writer.println("h1 { color: 'cornflowerblue'; }");
writer.println("</style>");
writer.println("</head>");
writer.println("<body>");
writer.println("<h1>Hello</h1>");
writer.println("<p>Servlet으로 페이지 생성</p>");
writer.println("</body>");
writer.println("</html>");
writer.close(); // 일종의 스트림
1. doGet/doPost 메서드의 구현부에서 HTML 페이지를 만들기 위한 자바 코드를 작성한다.
2. HttpServletResponse 객체의 getWriter() 메서드를 호출하면 PrintWriter 객체를 반환한다.
3. PrintWriter 객체의 printXXX("태그") 메서드를 사용해서 HTML 페이지를 작성하여 동적으로 웹페이지를 생성한다.
4. 페이지를 완성하여 브라우저에 반환하고 웹 페이지를 출력한다.
writer을 사용하여 구현
writer로 구현할 HTML 소스를 만들어 낸다.
자바로 코딩하여 누가 접속했느냐에 따라서 태그에 반영할 수 있다.
전체 코드
package com.test.servlet;
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 Ex01 extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
resp.setCharacterEncoding("UTF-8"); // 한글 깨짐 오류 해결
PrintWriter writer = resp.getWriter();
writer.println("<html>");
writer.println("<head>");
writer.println("<meta charset='UTF-8'>");
writer.println("<style>");
writer.println("h1 { color: 'cornflowerblue'; }");
writer.println("</style>");
writer.println("</head>");
writer.println("<body>");
writer.println("<h1>Hello</h1>");
writer.println("<p>Servlet으로 페이지 생성</p>");
writer.println("</body>");
writer.println("</html>");
writer.close();
}
}
Ctrl + F11을 누르면 어떤 서버를 통해서 호출할 것인지를 물어본다.
웹 페이지 호출
- http://localhost:8090/servlet/servlet/com.test.servlet.Ex01
Window > Web Browser > 1 Default System Web Browser로 변경하면 Default로 설정한 웹으로 페이지가 나타난다.
브라우저가 서버에 있는 자바 Ex01을 호출했다. 이때 에러가 발생하는 이유는 우리가 사용하는 자바 클래스는 웹 용이 아니어서 웹에서 실행할 수 없기 때문이다.
즉, 호출할 수 없는 상태에서 호출했기 때문에 에러가 나는 것이다.
4. 요청(실행)
자바 클래스는 URL을 통해서 실행할 수 없다. 따라서 가상 URL을 생성하여 내부적으로 자바 클래스를 호출한다.
내부적인 처리에 의해 자바 클래스를 대신 부를 수 있으며, 이러한 역할을 아파치 톰캣이 한다.
이를 톰캣 설정이라고 하며, 톰캣이 관리하는 파일 중 하나인 web.xml에서 위 작업을 하게 된다.
web.xml
web.xml은 톰캣이 하는 사이트 운영과 관련된 설정 파일이다.
Source에서 Servlet 설정을 한다.
xml의 상단부에 빨간 밑줄로 에러가 나는 경우가 있는데, 이는 에러가 아니라 버그이다.
Servlet 설정
- 가상 주소 매핑 = 가상 URL + 서블릿
자바 클래스를 호출할 수 있는 가상 URL을 생성한다.
<servlet>
<servlet-name>ex01</servlet-name>
<servlet-class>com.test.servlet.Ex01</servlet-class> <!-- 요리사 찾기 -->
</servlet>
<servlet-mapping>
<servlet-name>ex01</servlet-name>
<url-pattern>/ex01.do</url-pattern>
</servlet-mapping>
url-pattern은 무조건 슬래시로 시작하며 이 뒤에 가짜 주소를 넣으면서 사용한다.
이때 작성하는 이름에는 크게 정해진 규칙이 없으며, 이 부분에 작성되는 모든 것은 하나의 이름이다.
물론 메서드 doGet/doPost의 이름을 따와서 관습적으로 'do'를 많이 사용한다.
servlet-name이 같은 것끼리 짝꿍으로 인식하게 된다.
서블릿을 시작하면 항상 서버를 다시 시작해주어야 한다.
내부에서는 '/'가 http://localhost:8090/servlet/을 연결해주는 역할을 한다. 여기에 'ex01.do' 붙이면 http://localhost:8090/servlet/ex01.do 링크가 완성된다.
web.xml을 생성하는 방법
프로젝트를 만들 때 Generate를 체크하지 않으면 web.xml이 생성되지 않는다.
만약 web.xml을 생성하지 않았다면 Java EE tools의 Generate Deployment Descriptor Stub을 눌러 web.xml을 생성한다.