目前遇到的 web 工程中要寫url和路徑的文件有
- webContent中.jsp/.html :action
- src中的servlet類 : 映射地址、重定向、請求轉發、訪問資源文件(webContent中、src中)
- src非servlet類的普通類 :訪問資源文件(webContent中、src中)
以下一一說明:
.jsp/.html中的路徑
form表單提交的action中要寫servlet(jsp)的路徑
1. 跳轉到.jsp
action中使用相對路徑,相對於當前頁面。
<!-- from JSP1.jsp to JSP2.jsp --> <!-- JSP1.jsp中的form --> <form action="File/JSP2.jsp">
<!-- from JSP2.jsp to JSP1.jsp --> <!-- JSP2.jsp中的form --> <form action="../JSP1.jsp">
2.跳轉到servlet1
注意,路徑與package產生的目錄無關。
//Servlet1.java 的映射地址 @WebServlet(name = "Servlet1", urlPatterns = { "/Servlet1" })
<!-- from JSP2.jsp to Servlet1 --> <!-- JSP2.jsp中的form --> <form action="../Servlet1">
改變servlet的映射地址,使servlet映射到與JSP2.jsp一個文件夾下
//修改servlet1的映射地址后 @WebServlet(name = "Servlet1", urlPatterns = { "/File/Servlet1" })
<!-- from JSP2.jsp to Servlet1 --> <!-- JSP2.jsp中的form --> <form action="Servlet1">
再次改變servlet映射地址,servlet映射到虛擬目錄下
//再次修改servlet1的映射地址后,映射到virtualFile虛擬目錄 @WebServlet(name = "Servlet1", urlPatterns = { "/virtualFile/Servlet1" })
<!-- from JSP2.jsp to Servlet1 --> <!-- JSP2.jsp中的form --> <form action="../virtualFile/Servlet1">
3.更新:利用超鏈接<a>跳轉到servlet,其中的href:
//相對於當前jsp的相對路徑跳轉到servlet,同時傳遞參數id = 111,111為String類 //在servlet頁面可以通過 request.getPatameter("id")獲取111 <a href="servlet1?id=111">點擊跳轉到servlet1</a>
src中的servlet類
- url注解中的要寫servlet的映射地址
- servlet類訪問webContent中的資源文件 Servlet1訪問1.txt(按照tomcat中的工程結構)
//Servlet1.java 的映射地址 @WebServlet(name = "Servlet1", urlPatterns = { "/Servlet1" })
//利用getServletContext().getRealPath()獲取web工程的絕對路徑 String filePath = this.getServletContext().getRealPath("/sourceFile/1.txt"); //filePath=// D:\tomcat\apache-tomcat-8.0.50-windows-x64\apache-tomcat-8.0.50\webapps\test3\sourceFile\1.txt BufferedReader br = new BufferedReader(new FileReader(filePath));
- 訪問src中的資源文件 Servlet1訪問2.txt
//Servlet1.java 的映射地址 @WebServlet(name = "Servlet1", urlPatterns = { "/Servlet1" })
//訪問src中的文件,要按照tomcat中的工程目錄獲取絕對路徑 //servlet不要映射到虛擬目錄 String filePath = this.getServletContext().getRealPath("/WEB-INF/classes/2.txt"); BufferedWriter br = new BufferedWriter(new FileWriter(filePath));
- 重定向到servlet(jsp),只能用相對路徑 servlet1重定向到JSP2.jsp
//重定向使用相對路徑,url發生改變 response.sendRedirect("File/JSP2.jsp");
- 請求轉發到servlet,可以 用相對路徑、絕對路徑 servlet1請求轉發到Servlet2
//相對路徑 RequestDispatcher rd = request.getRequestDispatcher("Servlet2"); rd.forward(request,response); //絕對路徑 RequestDispatcher rd = request.getRequestDispatcher("/Servlet2"); rd.forward(request,response);
src非servlet類的普通類
- 普通類訪問webContent中的資源文件 NormalClass中訪問1.txt
//利用class獲取本類所在的目錄(不含pacakage,只到classes), //利用getResource()獲取資源文件絕對路徑 //在webContent中則要兩次返回上級目錄(WEB-INF,工程名URLTest) File filePath = new File(NormalClass.class.getClassLoader().getResource("../../sourceFile/1.txt").getPath()); FileInputStream fn = new FileInputStream(filePath);
- 普通類訪問src中的資源文件 NormalClass中訪問2.txt
//利用class獲取本類所在的目錄(不含pacakage,只到classes), //利用getResource()獲取資源文件絕對路徑 File filePath = new File(NormalClass.class.getClassLoader().getResource("2.txt").getPath()); FileInputStream fn = new FileInputStream(filePath);
注意:
注意!! 第一次打開.jsp頁面時,.jsp頁面的所有相對路徑都是相對.jsp頁面的,然而從servlet轉發到jsp頁面時相對路徑會變成相對於servlet的路徑,會導致資源文件訪問不到。
如何避免:在所有相對路徑前面加上 ${pageContext.request.contextPath}來獲得相對web工程的目錄。
如:
<!-- from JSP2.jsp to Servlet1 --> <!-- JSP2.jsp中的form --> <form action="../Servlet1">
改為
<!-- from JSP2.jsp to Servlet1 --> <!-- JSP2.jsp中的form --> <form action="${pageContext.request.contextPath}/Servlet1">