1. 程式人生 > >再看Spring

再看Spring

第一次看Spring的程式碼,還是學生時候,看的模稜兩可。

現在有了實際的工作經驗,應該會另有收穫。

 

先瀏覽下Http: 

http是用TCP來傳輸資料的一種協議,請求報文和響應報文的結構都分為三部分:首行、頭部、主體。請求報文的首行是方法、URL、http版本,響應報文的首行是http版本、狀態碼、簡略描述。

響應報文的狀態碼含義:

    1xx:資訊性狀態碼 (沒有仔細瞭解),

     2xx:成功,200

     3xx:重定向相關,301重定向成功

    4xx:客戶端錯誤碼,404 找不到資源(一般是請求內容錯誤)

     5xx:伺服器錯誤,(一般是伺服器邏輯拋異常)

 

Tomcat Servlet

 8.5 api   http://tomcat.apache.org/tomcat-8.5-doc/api/index.html   http://tomcat.apache.org/tomcat-8.5-doc/servletapi/index.html

javax.servlet

  

  The javax.servlet package contains a number of classes and interfaces that describe and define the contracts between a servlet class and the runtime environment provided for an instance of such a class by a conforming servlet container.

這個包中的類描述和定義了servlet 和 容器之間的關係。

javax.servlet.http 

  The javax.servlet.http package contains a number of classes and interfaces that describe and define the contracts between a servlet class running under the HTTP protocol and the runtime environment provided for an instance of such a class by a conforming servlet container.

這個包中 是 ,Servlet 和 容器 在http協議下的實現。

 

ServletConfig  A servlet configuration object used by a servlet container to pass information to a servlet during initialization.

一個Servlet例項初始化的引數之一是ServletConfig,容器會在初始化servlet的時候把它傳進Servlet的初始化函式中(init 函式)。Servlet介面的初始化函式:public void init(ServletConfig config) throws ServletException;

ServletContext  Defines a set of methods that a servlet uses to communicate with its servlet container, for example, to get the MIME type of a file, dispatch requests, or write to a log file.

ServletContext 是 一個servlet例項執行的上下文,例項通過ServletContext來和容器互動。ServletConfig中包含一個ServletContext。ServletContext 中的內容是變化的。

ServletConfig 中 getInitParameterNames 和 getInitParameter 用來訪問 init-param標籤的內容。getServletName 用來訪問 servelt-name標籤的內容。

其實很多時候都會在程式碼中寫這樣的結構,一個大的模組需要使用很多個小的節點一起來實現功能,這些節點依賴的外部因素分為兩類:1,常亮引數 ;2,執行時的環境。在這裡分別對應了ServletConfig和ServletContext。比方說手遊中的新手引導系統,引導系統分為多個小的行為(點選、對話、拖拽等)。點選行為的具體樣式可以配置成常亮,而點選所觸發的具體事件則是根據遊戲執行時的狀態來確定的(一般通過一個引用變數來和容器互動)

 

抽象類GenericServlet 實現了 Servlet介面 和 ServletConfig介面,它的inti(ServletConfig)函式定義為:

public void init(ServletConfig config) throws ServletException {     this.config = config;     this.init(); }

繼承GenericServlet的時候可以直接重寫無參的初始化函式   init()  ,容器傳遞的ServletConfig 可以通過getServletConfig來獲得。

GenericServlet 需要重寫的抽象方法是

public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException

 

HttpServlet

HttpServlet 是Servlet針對http協議的一種實現。他繼承自GenericServlet,其實現的service方法如下:

public void service(ServletRequest req, ServletResponse res)     throws ServletException, IOException {
HttpServletRequest request; HttpServletResponse response;
try { request = (HttpServletRequest) req; response = (HttpServletResponse) res; }
catch (ClassCastException e) {
throw new ServletException("non-HTTP request or response"); }
service(request, response);
}
HttpServlet中service(HttpServletRequest , HttpServletResponse)方法的主要作用是把http請求的方法型別對映到具體的函式上。
protected void service(HttpServletRequest req, HttpServletResponse resp)     throws ServletException, IOException 
 

 GenericServlet的Init() 和HttpServlet的service(HttpServletRequest , HttpServletResponse)讓我聯想起了重構中的rename,(純粹是聯想)