서브렛의 라이프 사이클, 작동 방법 및 요청 응답 프로세스
4960 단어 실습하다.
서브렛의 라이프 사이클은 4단계로 나뉜다. 실례화 -->초기화 -->실행 처리 -->폐기 (1)실례화 --new: 서버가 처음 접근했을 때 서브렛 용기를 불러오고 한 번만 불러온다.(2) 초기화 - init: 서브렛 컨테이너를 만든 후 서브렛 대상을 초기화하는 데 사용되는 init () 초기화 방법을 사용합니다. 서버가 실행되는 동안 몇 개의 클라이언트가 접근해도 init () 방법을 실행하지 않습니다.
초기화 방법은 상속된 GenericServlet이라는 추상 클래스에서 볼 수 있습니다.
public void init() throws ServletException {
}
이 메서드는 서브렛 클래스에서 상속 호출되어야 합니다.
public void init() throws ServletException {
super.init();
}
(3) 실행 처리 - 서비스 () 방법: HttpServlet의 추상적인 클래스는doGet (),doPost () 등 방법을 제공합니다.Request 요청을 보내는 방법과 일치합니다.
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_get_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(405, msg);
} else {
resp.sendError(400, msg);
}
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_post_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(405, msg);
} else {
resp.sendError(400, msg);
}
}
(4) 삭제-destroy: 서버가 닫히거나 다시 시작할 때 서브렛은destroy 방법을 사용해서 삭제합니다. 서브렛 용기를 스팸 파일로 표시하고 GC를 회수 처리합니다.GenericServlet 추상 클래스를 호출하는 Destroy 메서드를 작성했습니다.
@Override
public void destroy() {
super.destroy();
}
2. 서브렛의 작업 원리
1. 먼저 서브렛이 고객의 요청을 수신하고 응답하는 과정을 간단하게 설명한다. 고객이 요청을 보내면 서브렛은 서비스 () 방법을 호출하여 요청에 응답하는 것이다. 원본 코드를 통해 알 수 있듯이 서비스 () 방법에서 요청의 방식이 일치한다.doGet,doPost 등 방법을 선택한 다음에 대응하는 방법에 들어가서 논리층을 호출하는 방법으로 고객에 대한 응답을 실현한다.서브렛 인터페이스와Generic 서브렛에는 DoGet (),doPost () 등 방법이 없습니다. Http서브렛에서는 이러한 방법을 정의했지만 error 정보를 되돌려줍니다. 따라서 서브렛을 정의할 때마다 DoGet이나doPost 등 방법을 실현해야 합니다.
2. 모든 사용자 정의 서브렛은 서브렛의 인터페이스를 실현해야 한다. 서브렛 인터페이스에서 다섯 가지 방법을 정의했는데 그 중에서 비교적 중요한 세 가지 방법은 서브렛의 생명 주기와 관련된다. 각각 위에서 언급한 init(), 서비스(), destroy() 방법이다.GenericServlet은 어떠한 프로토콜에 특정되지 않은 일반적인 서브렛으로 서브렛 인터페이스를 실현합니다.Http서브렛은Generic서브렛에 계승되기 때문에 Http서브렛도 서브렛 인터페이스를 실현했다.그러므로 서브렛을 정의할 때는 Http서브렛을 상속하기만 하면 됩니다.
package javax.servlet;
import java.io.IOException;
public interface Servlet {
void init(ServletConfig var1) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
String getServletInfo();
void destroy();
}
3. 서브렛 인터페이스와GenericServlet은 어떠한 프로토콜에도 특정되지 않고 HttpServlet은 HTTP 프로토콜에 특정된 클래스이기 때문에 HttpServlet에서 서비스() 방법을 실현하고 요청 서브렛Request, 서브렛Response를 HttpRequest와 HttpResponse로 강하게 전환시킨다.위의 세 가지 참조: 서브렛의 작동 원리
4, 또한 서브렛은 단일 모드이고 스레드가 안전하지 않기 때문에 서비스 () 방법에서 전역 변수를 조작하지 마십시오.그러나 실제로는 전역 변수를 대체하기 위해session과 응용 프로그램을 사용할 수 있지만 서버 부하만 늘어날 뿐이다.
3. 서브렛이 요청을 처리하는 과정