您好,登錄后才能下訂單哦!
在web.xml中可以對同一個Servlet配置多個對外訪問路徑,并如果在web.xml中配置的信息服務器會自動加載部署,而如果是在Servlet中進行程序代碼的修改,則每次都要重新部署。
首先,在使用MyEclipse創建Servlet后,會根據所創建的Servlet進行到web.xml文件的映射,如下圖所示:
經過這個映射之后,在web.xml文件中就自動生成了這個Servlet的配置信息:
當然,我們可以在web.xml文件中把這個Servlet繼續添加一條對外訪問路徑,使得這個Servlet可以從不同路徑進行訪問,現在我們在服務器開啟的情況下,為這個Servlet添加一個新的對外訪問路徑好了:
紅框部分是新添加的,這時候服務器在Console窗口會自動提示已經重新部署,是的,只要在web.xml中修改的都無需關閉服務器就可以被服務器重新更新加載部署:
那么我們試試新的訪問地址:
可以訪問!!
細節二:在web.xml中為Servlet配置對外訪問路徑的<url-pattern>可以使用“*”作為通配符,但是這種只能有兩種格式:
一種格式是整個內容只能有“*.擴展名” ,如<url-pattern>*.html<url-pattern>,而如果寫成這樣<url-pattern>abc/*.html<url-pattern>就是錯誤的。尤其是<url-pattern>/*.html<url-pattern>也是錯誤的,不能有“/”,一定要注意。例:
在瀏覽器可以在通配符位置隨便輸入:
這樣造成了一種偽靜態的現象,我們以為是訪問一個靜態的頁面,其實卻是一個動態web資源。
另一種格式是以正斜線“/”開頭,加自定義路徑,以“/*”結尾,如<url-pattern>/abc/*<url-pattern>。這時候連擴展名都任意了。例:
在瀏覽器的地址欄內可以在通配符位置隨便輸入,擴展名都不需要:
細節三:由細節二導出的多個Servlet資源的映射路徑如果使用了通配符,就可能發生沖突,那么這時候服務器將會以哪個Servlet資源作為響應呢?我們看一下下面的問題,就能明白了:
細節四: 在Servlet的整個生命周期內,Servlet的init()方法只會被調用一次。而對于Servlet的每次訪問請求,Servlet都會調用service()方法一次。并對于每次的請求訪問,Servlet都會創建一個新的HttpServletRequest請求對象和新的HttpServletResponse響應對象。當然在每次請求訪問完成之后,這些請求對象和響應對象會立馬被銷毀,等待下次請求再重新創建,這樣就能給服務器減小壓力(非并發情況下)。
細節五:之前談到的Servlet在服務器部署后,都是只在第一次對該Servlet訪問時才由服務器創建Servlet的實例對象,而如果在web.xml中在某個<servlet>標簽下配置<load-on-startup>標簽,則該Servlet會在服務器啟動后就創建實例對象,并執行Servlet的初始化init()方法。<load-on-startup>的內容為一個正整數值。該值越小,代表在服務器啟動后優先創建Servlet對象并執行初始化方法。
細節六:如果某個Servlet的映射路徑僅僅為一個正斜線“/”,那么這個Servlet就稱為當前web應用的默認Servlet。凡是在web.xml文件中找不到匹配的<servlet-mapping>標簽的URL,它們的訪問請求都是交個默認Servlet來處理,也就是說默認Servlet用于處理所有其他Servlet都不處理的訪問請求。
例如我現在創建兩個Servlet,其中一個有自定義的對外映射路徑,而另一個設置成了默認Servlet:
要想訪問SecondServlet就必須按照其對應的路徑在瀏覽器地址欄中鍵入:
而對于默認Servlet,則是在web應用名后隨便輸:
(如果不輸則會顯示的是已有的首頁index.jsp,為什么呢,請看下面細節六)
細節六(重要) :如果我們在自己開發的Servlet中沒有配置默認Servlet,而是直接訪問我們web工程下的一個靜態web資源的話(如果有),那么我們將能從瀏覽器中看到這個web資源,記住:請求任何web資源都是以某個Servlet來響應回傳數據的,那么既然我們沒有配置默認Servlet的話,為什么能訪問到這個資源呢?換句話說,是哪個Servlet將我們需要的資源響應給我們看的?答案就是Tomcat服務器的默認Servlet!!!Tomcat服務器的默認Servlet在Tomcat的【conf】目錄下的web.xml文件中設置了映射路徑:
從Tomcat的web.xml文件中可以看出,其默認Servlet在服務器啟動就創建實例對象,并且是最早創建的,對外路徑已經設置了默認格式。而這個默認Servlet會管理每個自定義創建的Servlet工程,如果我們沒有在自己的web工程中創建默認Servlet,那么要訪問自己web工程中的某個資源時,Tomcat的默認Servlet會幫我們將該資源封裝成響應對象傳回客戶端。
例如,我在我的web工程下創建一個1.html頁面:
而我去瀏覽器訪問這個頁面:
對于這個URL,Tomcat服務器首先去配對我的Servlet是否有對應的映射路徑,如果沒有,并且如果我沒有在自己的web工程中設置默認Servlet,那么Tomcat的默認Servlet就在我的web應用下搜尋HTTP請求的資源,找到并封裝成響應對象返回給客戶端。如果Tomcat的默認Servlet找不著所需的資源,那它依然會響應客戶端,只是客戶端看到的是一些提示找不著該資源,如404提示。另外,根據這個過程,我們在開發自己的Servlet時,建議不要將自己的某個Servlet映射成默認Servlet為好。
接下來,討論一個首頁的問題。除了我們訪問web應用中某個特定資源(在瀏覽器地址上最后鍵入一個文件名),還會是在鍵入web應用名之后就發送HTTP請求了,這時候我們看到的也是一個頁面,通常稱為“首頁”,而這個首頁,也是由默認Servlet來響應的。
例如我使用MyEclipse創建一個web應用時就會默認幫我創建一個“index.jsp”文件:
而我在該web應用中沒有創建任何Servlet,或者即使創建Servlet也映射到某個特定的對外URL上,那么我在瀏覽器輸入主機地址+web應用名依然能看到這個index.jsp:
由前面所說,這個頁面肯定是由Tomcat服務器的默認Servlet傳回給客戶端的,那么Tomcat服務器為什么是傳回這個資源呢,而不是別的資源呢?答案還是在web.xml文件中,還記得之前《Tomcat詳細用法學習(三)》中定義的首頁設置嗎,對,就是這個方法,這個方法由默認Servlet來管理,我們再來回顧下在Tomcat的web.xml文件中的<welcome-file-list>標簽:
如果瀏覽器的輸入地址只輸入了web應用名,那么Tomcat的默認Servlet傳送這個web應用下的index.html文件,否則傳送index.htm文件,再否則傳送index.jsp,如果三個都沒有那么只能返回404了。
如果我把這段代碼注釋掉或刪掉,再想直接訪問web應用名就跟我把index.jsp文件刪除一樣,Tomcat的默認Servlet找不到資源,返回404提示(在MyEclipse中需要重啟服務器):
所以如果我們想為自己的web應用弄出個漂亮首頁,只需要在index.jsp中開發就行了,或者另外創建一個index.html文件開發,這個文件會比index.jsp更優先被訪問。
細節七:因為我們的開發Servlet都要繼承Servlet接口的某個實現類,那么我們在編寫doGet方法或者doPost方法的時候很可能調用了某些會拋出異常的方法,那么我們對這些異常只能捕獲處理,而不能拋出,這是因為子類在覆蓋父類的方法時,不能拋出比父類更多的異常。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。