2017年12月3日 星期日

JSP-Servlet (4) - Container

Container:
  • Tomcat就是一個實作Container的範例
  • Container開機的時候,載入你寫的Servlet class並初始化
  • 當Apache(Web Server)收到針對動態網頁的request時,將會交由負責此servlet的Container處理
  • Container會將HttpServletRequest object & HttpServletResponse object交給Servlet thread
  • 呼叫執行Servlet的service()內doGet()或是doPost()的method(基於HTTP Request的method)
- HTTP server是用來服務HTTP
- Apache Tomcat是用來deploy Java Servlet, JSP。當Java project build成為WAR檔,就可以直接將此檔丟到Tomcat以便deploy。是用來服務Servlet&JSP Server

使用Container的五大項優點(因為以下的事項,更能夠集中精神專注於商業邏輯的開發)
  1. 與Web Server溝通取得request(因此不需要實作Listener, stream, ServerSocket...)
  2. 控制Servlet的生命週期,initialization, call method,... 適時的將instance GB。透過Container 則不需要擔心資源管理
  3. 當多個request進入時,Container會自行建立thread來處理此請求,當此servlet執行為service() method時,thread就會結束。但synchronize的事情還是得自己處理
  4. 可調整web.xml來設定哪些群組能夠讀取哪些網頁,是否需要login機制,welcome html page等寫在內,可以不透過修改Java程式達到這些目的
  5. 能夠將JSP轉成真實的Java檔案
Container處理HTTP request steps
  1. 使用者點擊非靜態網頁的超連結
  2. container收到後,建立HttpServletRequest object & HttpServletResponse object
  3. 根據web.xml之URL及真實Servlet位置對應找出此Servlet後,會將上述object交由Servlet thread
  4. 呼叫Servlet內的service(),且根據request method,service()執行呼叫doGet()或是doPost()
  5. thread產生的動態頁面,將會放入 HttpServletResponse object
  6. 因container保有此HttpServletResponse object的reference,所以能夠將此response轉換成HTTP response,接著刪除HttpServletRequest object & HttpServletResponse object
以下Servlet範例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.*;
import javax.servlet.http.*;
public class Ch1Servlet extends HttpServlet{
 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  PrintWriter writer = resp.getWriter();
  Date today = new Date();
  writer.println("<html>"+
  "<body>" + "<h1 align=center>HF's Chapter Servlet</h1>"
    + "<br>" + today + "</body>" + "</html>");
 }
}

  • Line 7: Servlet將會extends HttpServlet
  • Line 9: Servlet會收到container建立的HttpServletRequest req, HttpServletResponse resp
  • Line 10: 可使用resp內的getWriter()取得將HTML寫到回應object上的PrintWriter




service()是由GenericServlet繼承來的

沒有留言:

張貼留言