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路徑下。