Spring-MVC入門-第一篇-DispatcherServlet淺談
springMVC框架作為JavaWeb開發中的主流框架,每一個java程式設計師都多多少少對它耳熟。作為一個Web開發程式設計師,我同樣也對這個框架充滿著強烈的好奇心。
於是試著學習一下這個框架, 剛學的時候嘗試翻譯Spring官方文件,但是發現90%的時間都花在翻譯上去了,學習的效果差強人意。於是買了一些書,通過看書結合例項操作,感覺進步很快。 最近再寫幾篇部落格,對自己所知道的使用方法和原理進行總結歸納,會更加容易看到自己的不足之處,督促自己學習更多的知識。
之前總是聽說SpringMVC是怎麼怎麼方便,如何如何好用。用的時候配置幾個配置檔案,引入幾個jar包,好像感覺也確實挺方便的,但是具體方便在那裡其實並不知道。
就像有人說小汽車很快,比騎自行車快。然後你的代步工具也都是汽車,從來沒騎過自行車。但汽車到底比自行車快在那裡其實不清楚,因為自己從沒騎過自行車。不知道自行車的速度,不知道自行車的執行原理,至於汽車相比較自行車升級了那些部件,那就更加不知道了。
對於Spring也同樣如此,於是,我知道我該自己寫一個Web應用了。
自定義Servlet:
開啟MyEclipse.........=。=
1.配置web.xml
注:web.xml雖然是用在javaWeb專案中,但是實際上讀取這個配置的是專案所在的Tomcat容器。<servlet> <!--Servlet名稱--> <servlet-name>DispatcherServlet</servlet-name> <!--Servlet名稱所對映的類--> <servlet-class>appx01.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <!--發生請求時,所呼叫的Servle--> <servlet-name>DispatcherServlet</servlet-name> <!-- 對映的請求字尾 --> <url-pattern>*.action</url-pattern> </servlet-mapping>
配置詳解:
<servlet> 功能是配置一個名為DispatcherServlet的Servlet(伺服器端的java小程式。用來接收、處理客戶端請求,返回響應。)
<servlet-mapping>標籤,主要是告訴tomcat,在遇到以.action結尾的請求時,直接交給名為名為DispatcherServlet的Servlet去處理。(=。=有點繞)
2.編寫簡單DispatcherServlet
DispatcherServlet 又可以翻譯成前置控制器。顧名思義,就是放在前面的一個控制程式,意味著這個程式 會優先處理請求。如果不去細究底層原理,單單從web上來看的話,確實也是如此。因此暫且先這麼理解,
會更加容易理解之後的一些概念。
概念講完,現在接著第一步。先新建一個名為DispatcherServlet的類,並繼承HttpServlet,一個自定義的
Servlet就這樣寫好了。當然這肯定是遠遠不夠的,先還需對請求進行處理,此時,只要重寫 doGet和doPost方法,並在方法中
處理相應的請求即可。
注:這兩種方法分別對應瀏覽器的GET和POST請求,對於這兩種請求方式區別以後可以再探討探討。
程式碼如下
package appx01.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import appx01.controller.Controller;
import appx01.controller.impl.InputController;
import appx01.controller.impl.SaveControllerImpl;
public class DispatcherServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.process(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.process(req, resp);
}
private void process(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
String url = req.getRequestURI(); //第一部分
int index = url.lastIndexOf("/");
String action = url.substring(index+1);
String returnPath = new String();
Controller controller = null; //第二部分
if("product_save.action".equals(action)){
controller = new SaveControllerImpl();
}else{
controller = new InputController();
}
returnPath = controller.handleRquest(req, resp);
RequestDispatcher rd = req.getRequestDispatcher(returnPath); //第三部分
rd.forward(req, resp);
}
}
現在對這注解的三部分進行詳解
第一部分:主要功能是對請求URL解析出具體的請求字串,方便後續的處理,這裡有一個方法值得注意一下
req.getRequestURI(),這個方法返回的不是全量URL地址。返回的是URL的一部分,並且POST請求和GET請求返回
的長度有區別。
第二部分:根據解析出的請求,新建不同的物件,在handleRquest方法中對請求執行相應的處理邏輯,例如直接返回的轉發頁面(地址),或者在request請求中設定相應的屬性再返回需要轉發的目標。這一步操作是模擬簡單的web請求,具體的執行在SaveController和InputController中,有興趣的可以Q我,發源碼給你參考一下。
第三部分:請求的轉發。request物件獲取RequestDispatcher,中間傳參returnPath是你想要轉發的資源。對於RequestDispatcher的作用簡單介紹就是一個路徑資源的包裝器。只要你給定相應的路徑,這個物件就會把這個路徑(或者稱之為資源)給包裝起來。之後你就可以選擇將請求給轉發到這個資源(forward方法),或者包含在response中(include方法)。
到目前為止,一個DIY的迷你前置控制器(DispatcherServlet)就誕生了。麻雀雖小,但是該有的功能也有,通過這個mini的MVC也大概瞭解到MVC的工作模式,對於後續的SpringMVC的學習以及SpringMVC的優缺點會打下一個基礎。