servlet_14

上面那個問題呢,它發生的概率本身也很小的,因爲本身每個線程就run的很快,除非你一個線程,設置了類變量,然後等着,這個時候正好有另一個線程又設置了類變量,這樣當第一個線程再run的時候,就必然會遇到那個問題了。這種情況很少發生的,當然除非你刻意的,呵呵。所以我們一般不會管這個問題。
到這裏任務似乎已經完了,但是大家感興趣的還沒有說,就是代碼層面了。這裏大致的說說。

再回到前面那個Servlet代碼,會發現幾個特點,第一它一定要繼承HttpServlet類,第二,我們一般只需要寫好doGet和doPost裏面的代碼。第三,init方法是什麼意思。這幾個特點不搞清楚,那麼又迷茫了。

問題呢,還是回到了Servlet了。呵呵,先解決簡單的,應該已經知道,一般某個Servlet之後被實例化一次,在這次實例化的時候呢,就會先調用init方法,之後就再也不調用了。所以裏面可以放一些什麼代碼就應該清楚了,比如初始化的參數等。只不過一般都不怎麼寫這個方法,都是讓它默認的調用超類的初始化方法。super.init();這行代碼可不簡單啊,你可以結合繼承來想想,當然放到c++裏面去想更好,因爲c++是力挺繼承多態的呢。

那前面兩個問題呢?那就要問問容器和看看這個類的class文件了。從頭講吧,如果你看的書比較舊的話,應該都是說Servlet是繼承GenericServlet類,它纔是Servlet的鼻祖哦。看看幾個核心類的結構吧
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable
public abstract class HttpServlet extends GenericServlet implements Serializable
剔除Serialzable接口和 ServletConfig接口,剩下的結構是:
public abstract class GenericServlet implements Servlet
public abstract class HttpServlet extends GenericServlet
這樣就簡單了,再看看Servlet接口:
public abstract interface Servlet {
// Methods
void init(ServletConfig servletConfig) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException;
String getServletInfo();
void destroy();
}
剔除其他方法,就剩下一個關鍵的方法了service,這個方法可以算是核心的方法了。是它最先拿到請求的。(這裏的請求已經是封裝成一個ServletRequest對象了)

然後再跟蹤下這個方法,在GenericServlet類中是這樣子的:
public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException;
抽象的哦,也是不搞事的,再看看HttpServlet類中的:
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { }
同時這個類包含了doGet、doHead、doPost、doPut、doDelete、doOptions、doTrace等方法。

然後再來過一遍吧,ServletRequest一過來,就找service方法,可是你的類裏面沒有這個方法,於是找它的超類的方法,正好在HttpServlet中找到,(如果還是沒有,就繼續往上找,這個可以關注多態的知識和java類的類型數據的方法表的知識)然後就調用,由於我們的Http請求一般只是Post或Get,於是這個service方法會判斷到底是調用doGet還是doPost,會進行相應的調用,如果你不熟悉多態和java類的方法表又會暈了,HttpServlet中的service方法怎麼可以調到它的子類的方法呢?因爲這個service方法還是你的Servlet的方法,只是你沒有重載而已。java類的方法表真的很贊。於是同樣就調用了你的類的doGet或doPost方法了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章