JavaServlet 路徑書寫總結


  在寫javaweb項目的時候,總會遇到路徑書寫的問題,現在將其作個總結。

        在javaweb中需要書寫路徑的地方主要有這四大類:

        客服端路徑

                超鏈接

                表單

                重定向

        服務器端路徑

                轉發

                包含

        資源獲取路徑

                servletContext獲取資源

                ClassLoader獲取資源

                Class獲取資源

        <url-pattern>路徑

現分別作介紹

其構建的javaweb如下:

1客服端路徑

A超鏈接

 

[html]  view plain  copy
 
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>頁面A</title>  
  8. </head>  
  9. <body>  
  10.     <!--   
  11.         超鏈接和表當都有三種書寫路徑的方式  
  12.             1,絕對地址    
  13.             2,以"/"開頭的相對地址  
  14.             3,不以"/"開頭的相對地址   
  15.     -->  
  16.       
  17.     <!-- 1.絕對地址   -->  
  18.         <!-- 完整的URL -->  
  19.     <href="http://localhost:8080/javaee/jsp/b.jsp">這是絕對地址超鏈接</a><br/>  
  20.       
  21.     <!-- 2.以"/"開頭的相對地址    -->  
  22.         <!-- /代表了整個web項目,即:http://localhost:8080/ -->  
  23.     <href="/javaee/jsp/b.jsp">這是以"/"開頭的相對地址超鏈接</a><br/>  
  24.       
  25.     <!-- 3.不以"/"開頭的相對地址   -->  
  26.         <!--   
  27.             不以/開頭,則相對於當前資源的路徑  
  28.             當前資源的路徑為:http://localhost:8080/javaee/jsp/  
  29.             而b.jsp也在此路徑下  
  30.             所以直接書寫b.jsp  
  31.          -->  
  32.     <href="b.jsp">這是不以"/"開頭的相對地址超鏈接</a><br/>  
  33. </body>  
  34. </html>  

 

B表單

 

 

[html]  view plain  copy
 
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>Insert title here</title>  
  8. </head>  
  9. <body>  
  10.     <!-- 所有的表單都是提交到b.jsp -->  
  11.     <!--   
  12.         表當提交路徑有三種書寫方式   
  13.             1,絕對地址    
  14.             2,以"/"開頭的相對地址  
  15.             3,不以"/"開頭的相對地址   
  16.     -->  
  17.     <form action="http://localhost:8080/javaee/jsp/b.jsp" methoe="get">  
  18.         username:<input type="text" name="username" value="">  
  19.         <input type="submit" value="提交---絕對地址    ">  
  20.     </form>  
  21.     <!--   
  22.         以/開頭的相對地址  
  23.           
  24.         此時的/代表整個web項目,即:http://localhost:8080/  
  25.     -->  
  26.     <form action="/javaee/jsp/b.jsp" methoe="get">  
  27.         username:<input type="text" name="username" value="">  
  28.         <input type="submit" value="提交---以/開頭的相對地址">  
  29.     </form>  
  30.       
  31.     <form action="b.jsp" methoe="get">  
  32.         username:<input type="text" name="username" value="">  
  33.         <input type="submit" value="提交---不以/開頭的相對地址 ">  
  34.     </form>  
  35.       
  36.     <!-- 表單提交到Servlet -->  
  37.     <!--   
  38.         表單提交到Servlet有三種書寫方式  
  39.         1,絕對路徑  
  40.         2,以"/"開頭的相對地址  
  41.         3,不以"/"開頭的相對地址   
  42.     -->  
  43.     <!-- 1.絕對地址   -->  
  44.         <!-- 完整的URL -->  
  45.     <form action="http://localhost:8080/javaee/PathServlet" methoe="get">  
  46.         username:<input type="text" name="username" value="">  
  47.         <input type="submit" value="表單提交到Servlet---絕對地址">  
  48.     </form>  
  49.       
  50.     <!-- 2.以/開頭的相對地址  -->  
  51.         <!-- 此時的/代表整個web項目,即:http://localhost:8080/  -->  
  52.     <form action="/javaee/PathServlet" methoe="get">  
  53.         username:<input type="text" name="username" value="">  
  54.         <input type="submit" value="表單提交到Servlet---以/開頭的相對地址">  
  55.     </form>  
  56.     <!-- 3.不以/開頭的相對地址    -->  
  57.         <!--   
  58.             不以/開頭的相對路徑是相對於當前資源的路徑  
  59.             此時form.jsp的地址為:http://localhost:8080/javaee/jsp/form.jsp  
  60.             所以當前資源路徑為:http://localhost:8080/javaee/jsp  
  61.             而要提交的Servlet的路徑為Http://localhost:8080/javaee/PathServlet  
  62.             所以路徑為當前路徑的上一級路徑下  
  63.             即路徑為:../PathServlet  
  64.             注:.代表當前路徑  
  65.                ..代表當前路徑的上一級路徑  
  66.         -->  
  67.     <form action="../PathServlet" methoe="get">  
  68.         username:<input type="text" name="username" value="">  
  69.         <input type="submit" value="表單提交到Servlet---不以/開頭的相對地址">  
  70.     </form>  
  71. </body>  
  72. </html>  

 

C重定向

 

 

[java]  view plain  copy
 
  1. package cn.ccnu.path;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9. /* 
  10.  * 重定向有三種路徑書寫方式 
  11.  *      1.絕對路徑 
  12.  *      2.以"/"開頭的相對路徑 
  13.  *      3.不以"/"開頭的相對路徑 
  14.  */  
  15. public class RedirectServlet extends HttpServlet {  
  16.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  17.             throws ServletException, IOException {  
  18.         response.sendRedirect("http://localhost:8080/javaee/jsp/b.jsp");  
  19.         /* 
  20.          * 2.以"/"開頭的相對路徑 
  21.          *      此時,/代表整個web工程的路徑,即http://localhost:8080/ 
  22.          */  
  23. //      response.sendRedirect("/javaee/jsp/b.jsp");  
  24.         /* 
  25.          * 3.不以"/"開頭的相對路徑 
  26.          *      此時是相對於當前資源的相對路徑 
  27.          *      當前資源路徑為:http://localhost:8080/javaee/RedirectServlet 
  28.          *      即表示:RedirectServlet在路徑http://localhost:8080/javaee之下 
  29.          *      而b.jsp在http://localhost:8080/javaee/jsp/b.jsp 
  30.          *      所以最終地址寫為:jsp/b.jsp 
  31.          */  
  32. //      response.sendRedirect("jsp/b.jsp");  
  33.           
  34.     }  
  35.   
  36.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  37.             throws ServletException, IOException {  
  38.         doGet(request, response);  
  39.     }  
  40.   
  41. }  

 

2服務器端路徑

 

A請求轉發

 

[java]  view plain  copy
 
  1. package cn.ccnu.path;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9. /* 
  10.  * 服務器端的路徑不能是絕對路徑,只能是相對路徑,也分為以/開頭和不以/開頭兩種 
  11.  *      1.以"/"開頭的相對路徑 
  12.  *      2.不以"/"開頭的相對路徑 
  13.  */  
  14. public class DispatcherServlet extends HttpServlet {  
  15.   
  16.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  17.             throws ServletException, IOException {  
  18.         /* 
  19.          * 1.以"/"開頭的相對路徑 
  20.          *      此時,/代表當前web項目,即:http://localhost:8080/javaee 
  21.          */  
  22. //      request.getRequestDispatcher("/jsp/b.jsp").forward(request, response);  
  23.         /* 
  24.          * 2.不以"/"開頭的相對路徑 
  25.          *      相對於當前資源的相對路徑 
  26.          *  此時,當前資源的路徑為:http://localhost:8080/javaee/DispatcherServlet 
  27.          *  所以要轉發去的資源的路徑以:http://localhost:8080/javaee開頭 
  28.          */  
  29.         request.getRequestDispatcher("jsp/b.jsp").forward(request, response);  
  30.     }  
  31.   
  32.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  33.             throws ServletException, IOException {  
  34.         doGet(request, response);  
  35.     }  
  36.   
  37. }  

 

B請求包含

 

 

[java]  view plain  copy
 
  1. package cn.ccnu.path;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9. /* 
  10.  * 請求包含不能書寫絕對地址,只能書寫相對地址 
  11.  *      1.以"/"開頭的相對路徑 
  12.  *      2.不以"/"開頭的相對路徑 
  13.  *  
  14.  */  
  15. public class IncludeServlet extends HttpServlet {  
  16.   
  17.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  18.             throws ServletException, IOException {  
  19.         /* 
  20.          * 1.以"/"開頭的相對路徑 
  21.          *      此時,/代表當前web項目,即:http://localhost:8080/javaee 
  22.          */  
  23. //      request.getRequestDispatcher("/jsp/b.jsp").include(request, response);  
  24.         /* 
  25.          * 2.不以"/"開頭的相對路徑 
  26.          *      相對於當前資源的相對路徑 
  27.          *  此時,當前資源的路徑為:http://localhost:8080/javaee/IncludeServlet 
  28.          *  所以要轉發去的資源的路徑以:http://localhost:8080/javaee開頭 
  29.          */  
  30.         request.getRequestDispatcher("jsp/b.jsp").include(request, response);  
  31.     }  
  32.   
  33.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  34.             throws ServletException, IOException {  
  35.         doGet(request, response);  
  36.     }  
  37.   
  38. }  

 

3資源獲取路徑

 

AServletContext獲取資源

 

[java]  view plain  copy
 
  1. package cn.ccnu.path;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.util.Properties;  
  6.   
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11. /* 
  12.  * ServletContext獲取資源必須是相對路徑,不能是絕對路徑,但不管是以/開頭,還是不以/開頭, 
  13.  * 都是相對於當前資源的相對路徑 
  14.  *  
  15.  */  
  16. public class ServletContextServlet extends HttpServlet {  
  17.   
  18.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  19.             throws ServletException, IOException {  
  20.         String path1 = this.getServletContext().getRealPath("/a.properties");  
  21.         String path2 = this.getServletContext().getRealPath("a.properties");  
  22.         System.out.println(path1);  
  23.         System.out.println(path2);  
  24.         //輸出的地址一樣  
  25.     }  
  26.   
  27.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  28.             throws ServletException, IOException {  
  29.         doGet(request, response);  
  30.     }  
  31.   
  32. }  

 

BClassLoader獲取資源

 

 

[java]  view plain  copy
 
  1. package cn.ccnu.classloaderpath;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.util.Properties;  
  6.   
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11. /* 
  12.  * ClassLoader類加載器不能通過絕對地址來加載資源,只能通過相對地址來加載資源 
  13.  * 但相對地址不管前面加不加/都是相當於類路徑的相對地址 
  14.  *  
  15.  */  
  16. public class ClassLoaderServlet extends HttpServlet {  
  17.   
  18.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  19.             throws ServletException, IOException {  
  20.         /* 
  21.          * 加了/,其地址是相對於類路徑的相對地址 
  22.          */  
  23. //      InputStream in = this.getClass().getClassLoader().getResourceAsStream("/cn/ccnu/classloaderpath/c.properties");  
  24. //      Properties prop = new Properties();  
  25. //      prop.load(in);  
  26. //      System.out.println(prop.getProperty("url"));  
  27.           
  28.         /* 
  29.          * 不加/,其地址是相對於類路徑的相對地址 
  30.          */  
  31.         InputStream in = this.getClass().getClassLoader().getResourceAsStream("cn/ccnu/classloaderpath/c.properties");  
  32.         Properties prop = new Properties();  
  33.         prop.load(in);  
  34.         System.out.println(prop.getProperty("url"));  
  35.         /* 
  36.          * 總結:不能使用絕對地址,而只能只用相對地址 
  37.          * 且不管加不加/的相對地址,都是相對於類路徑的相對地址 
  38.          *  
  39.          */  
  40.     }  
  41.   
  42.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  43.             throws ServletException, IOException {  
  44.         doGet(request, response);  
  45.     }  
  46.   
  47. }  

 

CClass獲取資源

 

 

[java]  view plain  copy
 
  1. package cn.ccnu.classpath;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.util.Properties;  
  6.   
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11. /* 
  12.  * Class讀取資源不能是絕對路徑,只能是相對路徑,又分為以/開頭或者是不以/開頭 
  13.  *      1.以/開頭的相對路徑 
  14.  *      2.不以/開頭的相對路徑 
  15.  */  
  16. public class ClassServlet extends HttpServlet {  
  17.   
  18.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  19.             throws ServletException, IOException {  
  20.         /* 
  21.          * 1.以/開頭的相對路徑 
  22.          *      此時的/代表類路徑,即:/javaee/WEB-INF/classes 
  23.          */  
  24. //      InputStream in = ClassServlet.class.getResourceAsStream("/cn/ccnu/classpath/b.properties");  
  25. //      Properties porp = new Properties();  
  26. //      porp.load(in);  
  27. //      System.out.println(porp.getProperty("url"));  
  28.         /* 
  29.          * 2.不以/開頭的相對路徑 
  30.          *      此時相對的是:類ClassServlet.class的路徑,即:\javaee\WEB-INF\classes\cn\ccnu\classpath 
  31.          *      即:/javaee/WEB-INF/classes/cn/ccnu/classpath 
  32.          */  
  33.         InputStream in = ClassServlet.class.getResourceAsStream("b.properties");  
  34.         Properties porp = new Properties();  
  35.         porp.load(in);  
  36.         System.out.println(porp.getProperty("url"));  
  37.   
  38.     }  
  39.   
  40.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  41.             throws ServletException, IOException {  
  42.         doGet(request, response);  
  43.     }  
  44.   
  45. }  

 

4<url-pattern>路徑

 

        要么以“*”開關,要么為“/”開頭,當通常情況看下,我們都會以"/"開頭。

 

                Servlet的路徑跳轉

一、JSP跳轉到Servlet 
1、相對路徑,如href="servlet/TestServlet" 
如果寫成"/servlet/TestServlet"會報錯,因為第一個“/”表示的是【服務器根目錄】

2、絕對路徑,通過內置成員變量path實現,如href="<%=path%>/servlet/TestServlet"
path得到的是項目根目錄,如【http://localhost:8080/ServletDemo】
二、Servlet跳轉JSP 1、請求重定向:response.sendRedirect(request.getContextPath()+"/xxx.jsp"); request.getContextPath()獲得項目根目錄,或者通過"../xxx.jsp"取得上層路徑得到
 2、服務器內部轉發: request.getRequestDispatcher("../xxx.jsp").forward(req,resp); request.getRequestDispatcher("/test.jsp").forward(request, response); //斜線表示項目的根目錄 小結:Servlet都可以通過../xxx.jsp獲取路徑
三、web.xml的路徑
 

web.xml的<url-pattern>必須以“/”開頭,“/”表示項目的根目錄

在JSP頁面上使用相對路徑和絕對路徑調用servlet

web.xml的<url-pattern>必須以“/”開頭,“/”表示項目的根目錄
如果在Servlet中使用請求重定向方式跳轉到其他jsp頁面,則需要:
response.sendRedirect(request.getContextPath()+"/test.jsp");
服務器內部跳轉路徑:
request.getRequestDispatcher("/test.jsp").forward(request,response);//這里的斜線表示項目的根目錄
或者request.getRequestDispatcher("../test.jsp").forward(request,response);//“..”表示回到上層目錄也就是根目錄;
PS:如果<url-pattern>帶一層路徑 如:<url-pattern>/servlet/loginServlet</url-pattern>,則內部轉發的時會從WebRoot/servlet/路徑下找jsp頁面,如果要轉發的頁面不在WebRoot/servlet/路徑下,則需要“..”回到上層或根目錄再定位到jsp頁面,如下:request.getRequestDispatcher("../test.jsp").forward(request,response);
如果要轉發的頁面在WebRoot/servlet/路徑下,則如下:request.getRequestDispatcher("/test.jsp").forward(request,response);

 


免責聲明!

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



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