在寫javaweb項目的時候,總會遇到路徑書寫的問題,現在將其作個總結。
在javaweb中需要書寫路徑的地方主要有這四大類:
客服端路徑
超鏈接
表單
重定向
服務器端路徑
轉發
包含
資源獲取路徑
servletContext獲取資源
ClassLoader獲取資源
Class獲取資源
<url-pattern>路徑
現分別作介紹
其構建的javaweb如下:
1客服端路徑
A超鏈接
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>頁面A</title>
- </head>
- <body>
- <!--
- 超鏈接和表當都有三種書寫路徑的方式
- 1,絕對地址
- 2,以"/"開頭的相對地址
- 3,不以"/"開頭的相對地址
- -->
- <!-- 1.絕對地址 -->
- <!-- 完整的URL -->
- <a href="http://localhost:8080/javaee/jsp/b.jsp">這是絕對地址超鏈接</a><br/>
- <!-- 2.以"/"開頭的相對地址 -->
- <!-- /代表了整個web項目,即:http://localhost:8080/ -->
- <a href="/javaee/jsp/b.jsp">這是以"/"開頭的相對地址超鏈接</a><br/>
- <!-- 3.不以"/"開頭的相對地址 -->
- <!--
- 不以/開頭,則相對於當前資源的路徑
- 當前資源的路徑為:http://localhost:8080/javaee/jsp/
- 而b.jsp也在此路徑下
- 所以直接書寫b.jsp
- -->
- <a href="b.jsp">這是不以"/"開頭的相對地址超鏈接</a><br/>
- </body>
- </html>
B表單
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Insert title here</title>
- </head>
- <body>
- <!-- 所有的表單都是提交到b.jsp -->
- <!--
- 表當提交路徑有三種書寫方式
- 1,絕對地址
- 2,以"/"開頭的相對地址
- 3,不以"/"開頭的相對地址
- -->
- <form action="http://localhost:8080/javaee/jsp/b.jsp" methoe="get">
- username:<input type="text" name="username" value="">
- <input type="submit" value="提交---絕對地址 ">
- </form>
- <!--
- 以/開頭的相對地址
- 此時的/代表整個web項目,即:http://localhost:8080/
- -->
- <form action="/javaee/jsp/b.jsp" methoe="get">
- username:<input type="text" name="username" value="">
- <input type="submit" value="提交---以/開頭的相對地址">
- </form>
- <form action="b.jsp" methoe="get">
- username:<input type="text" name="username" value="">
- <input type="submit" value="提交---不以/開頭的相對地址 ">
- </form>
- <!-- 表單提交到Servlet -->
- <!--
- 表單提交到Servlet有三種書寫方式
- 1,絕對路徑
- 2,以"/"開頭的相對地址
- 3,不以"/"開頭的相對地址
- -->
- <!-- 1.絕對地址 -->
- <!-- 完整的URL -->
- <form action="http://localhost:8080/javaee/PathServlet" methoe="get">
- username:<input type="text" name="username" value="">
- <input type="submit" value="表單提交到Servlet---絕對地址">
- </form>
- <!-- 2.以/開頭的相對地址 -->
- <!-- 此時的/代表整個web項目,即:http://localhost:8080/ -->
- <form action="/javaee/PathServlet" methoe="get">
- username:<input type="text" name="username" value="">
- <input type="submit" value="表單提交到Servlet---以/開頭的相對地址">
- </form>
- <!-- 3.不以/開頭的相對地址 -->
- <!--
- 不以/開頭的相對路徑是相對於當前資源的路徑
- 此時form.jsp的地址為:http://localhost:8080/javaee/jsp/form.jsp
- 所以當前資源路徑為:http://localhost:8080/javaee/jsp
- 而要提交的Servlet的路徑為Http://localhost:8080/javaee/PathServlet
- 所以路徑為當前路徑的上一級路徑下
- 即路徑為:../PathServlet
- 注:.代表當前路徑
- ..代表當前路徑的上一級路徑
- -->
- <form action="../PathServlet" methoe="get">
- username:<input type="text" name="username" value="">
- <input type="submit" value="表單提交到Servlet---不以/開頭的相對地址">
- </form>
- </body>
- </html>
C重定向
- package cn.ccnu.path;
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- /*
- * 重定向有三種路徑書寫方式
- * 1.絕對路徑
- * 2.以"/"開頭的相對路徑
- * 3.不以"/"開頭的相對路徑
- */
- public class RedirectServlet extends HttpServlet {
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.sendRedirect("http://localhost:8080/javaee/jsp/b.jsp");
- /*
- * 2.以"/"開頭的相對路徑
- * 此時,/代表整個web工程的路徑,即http://localhost:8080/
- */
- // response.sendRedirect("/javaee/jsp/b.jsp");
- /*
- * 3.不以"/"開頭的相對路徑
- * 此時是相對於當前資源的相對路徑
- * 當前資源路徑為:http://localhost:8080/javaee/RedirectServlet
- * 即表示:RedirectServlet在路徑http://localhost:8080/javaee之下
- * 而b.jsp在http://localhost:8080/javaee/jsp/b.jsp
- * 所以最終地址寫為:jsp/b.jsp
- */
- // response.sendRedirect("jsp/b.jsp");
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- }
2服務器端路徑
A請求轉發
- package cn.ccnu.path;
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- /*
- * 服務器端的路徑不能是絕對路徑,只能是相對路徑,也分為以/開頭和不以/開頭兩種
- * 1.以"/"開頭的相對路徑
- * 2.不以"/"開頭的相對路徑
- */
- public class DispatcherServlet extends HttpServlet {
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- /*
- * 1.以"/"開頭的相對路徑
- * 此時,/代表當前web項目,即:http://localhost:8080/javaee
- */
- // request.getRequestDispatcher("/jsp/b.jsp").forward(request, response);
- /*
- * 2.不以"/"開頭的相對路徑
- * 相對於當前資源的相對路徑
- * 此時,當前資源的路徑為:http://localhost:8080/javaee/DispatcherServlet
- * 所以要轉發去的資源的路徑以:http://localhost:8080/javaee開頭
- */
- request.getRequestDispatcher("jsp/b.jsp").forward(request, response);
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- }
B請求包含
- package cn.ccnu.path;
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- /*
- * 請求包含不能書寫絕對地址,只能書寫相對地址
- * 1.以"/"開頭的相對路徑
- * 2.不以"/"開頭的相對路徑
- *
- */
- public class IncludeServlet extends HttpServlet {
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- /*
- * 1.以"/"開頭的相對路徑
- * 此時,/代表當前web項目,即:http://localhost:8080/javaee
- */
- // request.getRequestDispatcher("/jsp/b.jsp").include(request, response);
- /*
- * 2.不以"/"開頭的相對路徑
- * 相對於當前資源的相對路徑
- * 此時,當前資源的路徑為:http://localhost:8080/javaee/IncludeServlet
- * 所以要轉發去的資源的路徑以:http://localhost:8080/javaee開頭
- */
- request.getRequestDispatcher("jsp/b.jsp").include(request, response);
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- }
3資源獲取路徑
AServletContext獲取資源
- package cn.ccnu.path;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.Properties;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- /*
- * ServletContext獲取資源必須是相對路徑,不能是絕對路徑,但不管是以/開頭,還是不以/開頭,
- * 都是相對於當前資源的相對路徑
- *
- */
- public class ServletContextServlet extends HttpServlet {
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- String path1 = this.getServletContext().getRealPath("/a.properties");
- String path2 = this.getServletContext().getRealPath("a.properties");
- System.out.println(path1);
- System.out.println(path2);
- //輸出的地址一樣
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- }
BClassLoader獲取資源
- package cn.ccnu.classloaderpath;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.Properties;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- /*
- * ClassLoader類加載器不能通過絕對地址來加載資源,只能通過相對地址來加載資源
- * 但相對地址不管前面加不加/都是相當於類路徑的相對地址
- *
- */
- public class ClassLoaderServlet extends HttpServlet {
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- /*
- * 加了/,其地址是相對於類路徑的相對地址
- */
- // InputStream in = this.getClass().getClassLoader().getResourceAsStream("/cn/ccnu/classloaderpath/c.properties");
- // Properties prop = new Properties();
- // prop.load(in);
- // System.out.println(prop.getProperty("url"));
- /*
- * 不加/,其地址是相對於類路徑的相對地址
- */
- InputStream in = this.getClass().getClassLoader().getResourceAsStream("cn/ccnu/classloaderpath/c.properties");
- Properties prop = new Properties();
- prop.load(in);
- System.out.println(prop.getProperty("url"));
- /*
- * 總結:不能使用絕對地址,而只能只用相對地址
- * 且不管加不加/的相對地址,都是相對於類路徑的相對地址
- *
- */
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- }
CClass獲取資源
- package cn.ccnu.classpath;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.Properties;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- /*
- * Class讀取資源不能是絕對路徑,只能是相對路徑,又分為以/開頭或者是不以/開頭
- * 1.以/開頭的相對路徑
- * 2.不以/開頭的相對路徑
- */
- public class ClassServlet extends HttpServlet {
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- /*
- * 1.以/開頭的相對路徑
- * 此時的/代表類路徑,即:/javaee/WEB-INF/classes
- */
- // InputStream in = ClassServlet.class.getResourceAsStream("/cn/ccnu/classpath/b.properties");
- // Properties porp = new Properties();
- // porp.load(in);
- // System.out.println(porp.getProperty("url"));
- /*
- * 2.不以/開頭的相對路徑
- * 此時相對的是:類ClassServlet.class的路徑,即:\javaee\WEB-INF\classes\cn\ccnu\classpath
- * 即:/javaee/WEB-INF/classes/cn/ccnu/classpath
- */
- InputStream in = ClassServlet.class.getResourceAsStream("b.properties");
- Properties porp = new Properties();
- porp.load(in);
- System.out.println(porp.getProperty("url"));
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- }
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);