再看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
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 和 容器之間的關係。
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,(純粹是聯想)