理解java Web項目中的路徑問題


本文以項目部署在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"

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM