servlet 和 jsp 服務器端和客戶端的相對路徑

Servlet中相對路徑與絕對路徑的總結

servlet中,所有路徑的配置都要用絕對路徑。

什麼是絕對路徑,就是以“/”開頭的路徑(開發中就這樣理解)。

實際開發中,“/”所代表的含義不同,但主要分以下兩種情況:

1.servlet內部配置路徑

servlet內部的含義就是:在客戶端看不到,全是在(應用)後臺處理的部分(簡單說,就是除了JSP以外的所有地方)。包含以下2點:

a. web.xml中servlet 配置的路徑

<servlet>
  <servlet-name>helloWorld</servlet-name>
  <servlet-class>
   com.bill99.li.servlet.HelloWorldServlet
  </servlet-class>
 </servlet>

 <servlet-mapping>
  <servlet-name>helloWorld</servlet-name>
  <url-pattern>/test1/helloWorld</url-pattern>

 </servlet-mapping>

我們配置的這個“ /test1/helloWorld”,前面必須加“/” ---- 該“/”代表我們應用的名稱。比如我們的應用名是“test”,那訪問我們應有的地址就是: http:// 192.168.XX.XX:8080/test ,說白了就是代表項目的名稱。

“ /test1/helloWorld”代表的路徑就是http:// 192.168.XX.XX:8080/test/test1/helloWorld

b.forward轉發的路徑(注意:不包含redirect重定向

做完後臺業務邏輯處理後,需要做頁面的跳轉,比如:

req.getRequestDispatcher("/pages/succ.jsp").forward(req, resp);

這時候跳轉的頁面"/pages/succ.jsp"也必須添加“/”,它代表的含義也一樣,是我們應用的名稱。

總結:

在應用內部,“/”代表的就是應用的名稱!!!

2.頁面配置的路徑

頁面是指什麼 ------  肯定是指我們的JSP頁面,而JSP頁面是服務端解析的,對我們而言是下載到客戶端,讓瀏覽器解析爲HTML展示出來的頁面。

比如,我們的應用url是:http:// 192.168.XX.XX:8080/test

那站點的路徑就是:http:// 192.168.XX.XX:8080/   --- 很明顯 test 是應用名

客戶端的瀏覽器而言,它認識的只有站點,也就是說,我們的jsp頁面,“/”代表的是站點名。

所以在“/”後需要添加上我們應用的名稱才能正確的訪問到。(也容易理解,一個tomcat下可以部署多個應用,就相當於一個站點多個應用,怎麼區別不同的應用呢,當然是不同應用名啦-----這個需要和上面的servlet內部配置路徑區分理解一下啊,因爲servlet本身就部署在服務端,在站點內部了,內部處理肯定知道它是站點下的哪個應用內,但對於外部而言,只知道一個站點IP。)

頁面主要表現有以下3個地方:

a. form的action路徑配置

頁面舉例:

<form action=" /test /test1/helloWorld" method="post">

解析:

應用名是test,/ 代表站點的url http:// 192.168.XX.XX:8080/,所以/test代表 http:// 192.168.XX.XX:8080/test

/test1/helloWorld代表servlet在web.xml中配置的訪問路徑,所有上面的action可以正確的訪問。

但是在真正的應用中,我們經常這樣寫:

<form action="${pageContext.request.contextPath}/test1/helloWorld" method="post">

${pageContext.request.contextPath} 的效果就是"/應用名" ,這裏等於 /test

一樣的效果,不解釋啦。

b. 頁面資源引用

同樣,只要是頁面中引入的東西(常常需要引入CSS,JS,圖片等),都要如此寫,比如

<script type="text/javascript" src="${pageContext.request.contextPath}/pages/event/js/addevent.js"></script>

c. jsp/servlet的重定向 redirect

首先必須理解重定向的概念:重定向其實向服務器發送了2次請求,第一次把請求url告訴給服務器,服務器看到這個請求的狀態碼,馬上明白該url是需要瀏覽器來重新去請求的url,於是呢把該url顯示在瀏覽器的地址欄內,再次向服務器請求(第二次了吧),服務器響應,然後返回。

很明顯,只要和頁面打交道的,“/”都代表站點名,需要在後面添加應用名以區分是哪個應用的請求。所有。。。。不解釋也明白了吧!

總結:

所有涉及前端頁面的地方,“/”代表的是站點名,需要我們在“/”加上應用名以明確應用服務!!

=========================================================

基本上可以總結爲兩點:

a. servlet中所有訪問路徑都要用絕對路徑“/”開頭

b. 頁面中“/”表示站點路徑(在客戶端展現出來,只知道它的站點路徑,所有需要“/”後追加應用名來區分屬於站點下的哪個應用),其他地方的“/”表示應用路徑(在服務端的應用程序內調用,肯定是相對於應用的路徑啦)

 

有人要懷疑:如果全是 絕對路徑 ,那 相對路徑 呢,其實,相對這個概念的確是相對的,但對於應用開發來說,簡單理解就是木有以 “/” 開頭的路徑配置就是相對的。

而用相對路徑是不安全的,很容易出現404錯誤。

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