1. 程式人生 > >web專案總的路徑問題

web專案總的路徑問題

理解java Web專案中的路徑問題

原文地址:https://www.cnblogs.com/fnz0/p/5595546.html

本文以專案部署在tomcat伺服器為例,其他相信也是一樣的。

先說明請求頁面的寫法,在web中,頁面路徑主要寫的有以下幾種

  1、請求重定向

  2、瀏覽器的請求被伺服器請求到新頁面(我稱為“轉發”)

  3、超連結

  4、form表單提交的action

為了演示路徑寫法,首先先建一個專案(專案名WebPath),並建立一個servlet(PathServlet)

目錄結構如下

以訪問目錄中index.jsp檔案為例,jxf.path.PathServlet.jave中對以上四種路徑的寫法(紅色部分)

複製程式碼

 1 package jxf.path;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 
 6 import javax.servlet.ServletException;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 
11 public class PathServlet extends HttpServlet {
12     public void doGet(HttpServletRequest request, HttpServletResponse response)
13             throws ServletException, IOException {
14         //1、重定向
15         response.sendRedirect("/WebPath/index.jsp
"); 16 17 //2、轉發 18 //request.getRequestDispatcher("/index.jsp").forward(request, response); 19 20 //3、超連結 21 //response.setContentType("text/html"); 22 //response.getWriter().write("<thml><head></head><body><a href='/WebPath/index.jsp
'>index.jsp<a></body></html>"); 23 24 //4、表單提交 25 //response.setContentType("text/html"); 26 //response.getWriter().write("<thml><head></head><body><form action='/WebPath/index.jsp'><input type='submit' value='to index.jsp'/></form></body></html>"); 27 } 28 29 }

複製程式碼

路徑的寫法主要注意以兩點:

  1、路徑是誰發起的(瀏覽器,伺服器)

  2、路徑開頭直接 “/” 表示當前路徑(主要就是這個當前路徑,搞清楚就明白了)

首先來分析“路徑是由誰發起的”,以上四種寫法,除了“2、轉發”是伺服器發起的,其他都是由瀏覽器發起的。

用過tomcat伺服器的都應該明白一點,平常我們開發時候在瀏覽器中輸入“http://localhost:埠號/專案名/xxx檔案”請求需要的資源,並且根據tomcat的專案都是在%tomcat根目錄%/webapps資料夾下,可得知,此時由瀏覽器發起的請求,程式碼中的“/”表示的當前路徑就應該表示的是webapps的根目錄

而程式碼中的“轉發”,是由瀏覽器向伺服器發起請求,而伺服器根據請求的內容幫助其訪問專案中的其他資源,並返回給瀏覽器。整個 “資源路徑” 是由伺服器來發起的,可以檢視web專案在tomcat部署後的結構,對比MyEclipse中的專案結構,可理解為“/”表示當前目錄是MyEclipse中專案的WebRoot的根目錄(也可理為%tomcat%/webapps/WebPath根目錄)。既然是“/”表示為WebRoot的根目錄,那麼訪問這個index.jsp檔案的寫法應該為“/index.jsp”

 總結:   

  1、由瀏覽器發起的路徑,“/”表示%tomcat根目錄%/webapps根目錄

  2、由伺服器發起的路徑,“/”表示專案中的WebRoot根目錄

根據請求的資源的檔案與“/”代表的路徑的相對位置,即可寫對訪問的資源路徑。

順便提起src中的資源的訪問路徑

新建一個txt檔案,隨便寫點內容,新建一個servlet,名為SourcePath,檔案目錄結構如下

jxf.path.SourcePath.java

複製程式碼

 1 public class SourcePath extends HttpServlet {
 2 
 3     public void doGet(HttpServletRequest request, HttpServletResponse response)
 4             throws ServletException, IOException {
 5         response.setContentType("text/html;charset=UTF-8");
 6         //String path = request.getRealPath("/WEB-INF/classes/demo.txt");
 7         //InputStream inputStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/demo.txt");
 8         String path = this.getServletContext().getRealPath("/WEB-INF/classes/demo.txt");
 9         File file = new File(path);
10         FileInputStream inputStream = new FileInputStream(file);
11         byte[] bytes = new byte[1024];
12         StringBuilder sb = new StringBuilder();
13         int len = 0;
14         while((len = inputStream.read(bytes))!=-1){
15             sb.append(new String(bytes,0,len));
16         }
17         inputStream.close();
18         response.getWriter().write(sb.toString());
19     }
20 
21 }

複製程式碼

web專案中載入資原始檔有以下方法:   

  request物件.getRealPath("/WEB-INF/classes/demo.txt");//返回該檔案絕對路徑的字串,不過在java Servlet API 2.1版本以後去除了,不推薦使用

  Context物件.getResourceAsStream("/WEB-INF/classes/demo.txt");//返回該檔案絕對路徑建立的InputStream

  Context物件.getRealPath("/WEB-INF/classes/demo.txt");//返回該檔案絕對路徑的字串

而這些方法中的路徑寫法和上面的url原理是一樣的,此時也是由伺服器發起的,所以“/”代表的是WebRoot根目錄,而src下的所有資源,專案部署後,都會自動放在/WEB-INF/classes目錄下。所以應寫為"/WEB-INF/classes/demo.txt"

......待續......

 

重點總結

1 由servlet傳送的請求,路徑是從伺服器的webcontext目錄開始的(根路徑),

2 瀏覽器傳送的請求是從伺服器的根目錄開始的(localhost:8080:)

3 傳送的請求前邊不帶  “/” 意思是從請求發出的那個檔案所在的地址為根目錄開始找你的連線。

4 如果請求前邊是 “/”開始的,那麼要看1,2 條

5 spring mvc 中 web.xml 中配置的攔截器,攔截到請求之後,並不能無條件的幫你找到你的地址,

要想找到controller處理方法,必須要從webapp目錄下開始找,並且這個路徑是你的請求 路徑,攔截器攔截到你的請求之後,不會無條件的幫你找到你要的方法,而是讓你自己去找,意思就是,能不能找到controller處理器,要看你的路徑,那麼controller處理器在哪裡呢?在webapp下面。

6 如果你在webapp下面新建了一個view 資料夾,並且你要是想找到controller處理器,那麼你要在你的超連結前面加上“../” 回到webapp路徑下。