1. 程式人生 > >客戶端跳轉與伺服器端跳轉的區別以及路徑

客戶端跳轉與伺服器端跳轉的區別以及路徑

客戶端跳轉時用HttPservletResopse物件的sendRedirect函式實現,伺服器端跳轉是使用RequestDispather物件的forward方法實現的。這兩者之間的區別主要體現在三個方面:


1. 使用伺服器端跳轉時,客戶瀏覽器的位址列並不會顯示目標地址的URL,而是用客戶端跳轉時,位址列當中會顯示目標資源的URL;


2. 伺服器端跳轉是由客戶端傳送一個請求,請求一個伺服器資源——如JSP和Servlet——,這個資源又將請求轉到另一個伺服器資源,然後再給客戶端傳送一個響應,也就是說伺服器端跳轉是客戶端傳送一次請求,伺服器端給出一次響應;而客戶端跳轉的流程則不同。客戶端同樣是傳送一個請求給伺服器端資源,這個伺服器資源會首先給客戶端一個響應,客戶端再根據這個響應當中所包含的地址,再次向伺服器端傳送一個請求,也就是說客戶端跳轉是兩次請求,兩次響應;


3. 在進行客戶端跳轉和伺服器端跳轉時,都需要指定目標資源的URL,如果這個路徑以“”開始。在客戶端跳轉當中“”代表的是應用伺服器根目錄,即“http://localhost:8080/”,而在伺服器端跳轉當中代表的是應用程式根目錄,即“http://localhost:8080/專案名/”。


 


 


page = 頁面級別


request = 請求級別(與伺服器端跳轉配合使用)


session = 會話級別(客戶端跳轉(伺服器端跳轉也可,但是客戶端跳轉更加突出了session的作用範圍))


application = 應用級別


客戶端跳轉:伺服器端將請求結果返回給客戶端,客戶端向伺服器發出另一次請求。在客戶端跳轉過程中是兩次不同的請求。在位址列中顯示的是最後一次請求地址。


客戶端跳轉可以進行站外跳轉。


1、連結跳轉:<a href=””></a>


2、表單提交


3、Response.sendRedirect(“3.jsp”);


4、<mata http-equiv=”refresh”, content=”3;2.jsp”/>


5、response.setHeader(“refresh”,” 3;2.jsp”);


6、客戶端跳轉“/”代表伺服器跟路徑webapps


 


伺服器端跳轉(容器內跳轉):能夠自動的在伺服器內部進行跳轉,這種跳轉對使用者來說是透明的。兩次跳轉時同一個request,在位址列中顯示的事第一次頁面地址。


只能進行站點內跳轉。


1、<jsp:forward page=””/>


2、pageContext.forward();


3、 request.getRequestDispatcher("1.jsp").forward(request,response);


3、伺服器端跳轉“/”代表站點根路徑




伺服器跳轉也叫內部跳轉、請求轉發,客戶端跳轉也叫外部跳轉或重定向。


1、內部跳轉的時候實際上是通過伺服器端將請求轉發到另外的頁面或者servlet中,這個時候跳轉到的目標頁面或者servlet可以獲取到請求物件,也可以獲取到請求中的屬性和引數。而外部跳轉的時候實際上是第一次請求後,伺服器端向客戶端傳送了一個指令,讓客戶端再次請求了一次伺服器端,這個時候伺服器第二次拿到的request物件已經不是第一次請求的request物件了,所以無法獲取到第一次請求裡的引數和屬性。 
2、內部跳轉的url位址列不會發生變化,外部跳轉url則會發生變化。 
3、內部跳轉無法跳轉到工程以外的jsp或者servlet,外部跳轉則可以。 
4、內部跳轉實現的方法:


request.getRequestDispatcher("XXX.jsp或者servlet").forward(request, response),
而外部跳轉實現的方法:

response.sendRedirect("XXX.jsp或者servlet")。

在java web種經常出現 404找不到網頁的錯誤,究其原因,一般是訪問的路徑不對。

java web中的路徑使用按我的分法可以分兩種情況,當然啦兩者使用相對路徑是一致,本文只說絕對路徑。

情況一、指向外部的web元件和本身關係不大的,這一類的有:html中使用路徑的標籤,比如<a>標籤中的href;servlet和jsp中的重定向sendRedirect(path);

情況二、指向內部的web元件和本身有關係的,這一類我暫時看到的有:servlet或者jsp的轉發

假設在myapp專案下有個login.html,index.jsp,還寫了兩個servletA和servletB.

在web.xml中的地址配置:

<url-pattern>/servlet/servletA</url-pattern>

<url-pattern>/servlet/servletB</url-pattern>

在情況一中:若在路徑中以/開頭,則這一/相當於http://localhost:8080/

<c:url>相當於pageContext.request.contextPath,也就是專案名。

在情況二中:若在路徑中以/開頭,則這一/相當於http://localhost:8080/myapp/


class和classLoader獲取類路徑資源

Class c=Demo.class;

InputStream in=c.getResourceAsStream("/a.html");//與類載入器相同

ClassLoader c=Demo.class.getClassLoader();

InputStream in=c.getResourceAsStream("a.html");//類載入器路徑下查詢資源

相同

Class c=Demo.class;

InputStream in=c.getResourceAsStream("a.html");//到當前Class對應的.class檔案所在目錄載入