1.關於JSP/Servlet中的相對路徑和絕對路徑。
1)服務器端的地址
指的是相對於你的web應用的地址,這個地址是在服務器端解析的,也就是說這時候在jsp和servlet中的相對地址應該是相對於你的web應用,即相對於http: //192.168.30.147/webapp/的。
其用到的地方有:
forward:servlet中的request.getRequestDispatcher(address);這個address是在服務器端解析的。
所以,你要forward到a.jsp應該這么寫:request.getRequestDispatcher(“/user/a.jsp”)這個/ 相對於當前的web應用webapp,其絕對地址就是:http://192.168.30.147/webapp/user/a.jsp。 sendRedirect:在jsp中<%response.sendRedirect("/rtccp/user/a.jsp");%>
2)客戶端的地址
所有的html和javascript頁面中的相對地址,,這個地址是在客戶端瀏覽器解析的,都是相對於服務器根目錄,及相對於(http://192.168.30.147/)的。
其用到的地方有:
Html中的form表單的action屬性的地址應該是相對於服務器根目錄(http://192.168.30.147/)的。
所以,如果提交到a.jsp 為:action="/webapp/user/a.jsp"或action="<%=request.getContextPath()% >"/user/a.jsp;
提交到servlet為actiom="/webapp/handleservlet" Javascript也是在客戶端解析的,所以其相對路徑和form表單一樣。
因此,一般情況下,在JSP/HTML頁面等引用的CSS,Javascript.Action等屬性前面最好都加上
<%=request.getContextPath()%>,以確保所引用的文件都屬於Web應用中的目錄。另外,應該盡量避免使用類似".","./","../../"等類似的相對該文件位置的相對路徑,這樣當文件移動時,很容易出問題。
3)JSP中獲得當前應用的相對路徑和絕對路徑
根目錄所對應的絕對路徑:request.getRequestURI()
文件的絕對路徑 :application.getRealPath(request.getRequestURI());
當前web應用的絕對路徑 :application.getRealPath("/");
取得請求文件的上層目錄:new File(application.getRealPath(request.getRequestURI())).getParent()
4)Servlet中獲得當前應用的相對路徑和絕對路徑
根目錄所對應的絕對路徑:request.getServletPath();
文件的絕對路徑 :request.getSession().getServletContext().getRealPath(request.getRequestURI())
當前web應用的絕對路徑 :servletConfig.getServletContext().getRealPath("/");
(ServletContext對象獲得幾種方式:
javax.servlet.http.HttpSession.getServletContext()
javax.servlet.jsp.PageContext.getServletContext()
javax.servlet.ServletConfig.getServletContext()
)
2、java類中獲取路徑
1) 利用Java的類加載機制 調用 XXX.class.getClassLoader().getResource(""); 方法來獲取到ClassPath , 然后處理獲得WebRoot目錄
(這種方式只能是該class在WebRoot/WEB-INF/classes下才能生效, 如果該class被打包到一個jar文件中, 則該方法失效。這時就應該用下面一種方式)
2) spring框架的思路, 在WEB-INF/web.xml中,創建一個webAppRootKey的param, 指定一個值(默認為webapp.root)作為鍵值
然后通過Listener , 或Filter , 或Servlet 執行String webAppRootKey = getServletContext().getRealPath("/");
並將webAppRootKey對應的webapp.root 分別作為Key , Value寫到System Properties系統屬性中。之后在程序中通過System.getProperty("webapp.root")來獲得WebRoot的物理路徑
下面是一些得到classpath和當前類的絕對路徑的一些方法。你可使用其中的一些方法來得到你需要的資源的絕對路徑:
1.得到當前類FileTest.class文件的URI目錄,不包括自己:
-
- DebitNoteAction.class.getResource("")
如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/atacarnet/src/com/evi/modules/atacarnet/action/
2.得到當前ClassPath的絕對URI路徑
-
- this.getClass().getResource("/")
- this.getClass().getClassLoader().getResource("")
- Thread.currentThread().getContextClassLoader().getResource("")
- ClassLoader.getSystemResource("")
- this.getClass().getResource("/")
如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/
(推薦使用Thread.currentThread().getContextClassLoader().getResource("")來得到當前的classpath的絕對路徑的URI表示法)
3.取得服務器相對路徑
-
- System.getProperty("user.dir")
如:E:\apache-tomcat-5.5.16\apache-tomcat-5.5.16\bin
6.取得項目中的絕對路徑
-
- request.getRealPath("/")
- request.getRealPath("/config/")
(但現在不提倡使用request.getRealPath("/")了,大家可試用ServletContext.getRealPath("/")方法得到Web應用程序的根目錄的絕對路徑)
7.要取得src的文件非常容易,因為src是默認的相對目錄,比如你說要取得src下com目錄的test.java文件,你只需要這樣就夠了
-
- File f = new File(com/test.java);
8.但如果我要取得不在src目錄或者WebRoot目錄下的文件呢,而是要從src或者WebRoot同級的目錄中取呢,比如說doc吧
我的硬方法是這樣實現的:
String path = this.getServletContext().getRealPath("/"); Properties p = new Properties(); p.load(new FileInputStream(new File(path.substring(0,(path.lastIndexOf("\\WebRoot") + 1)) + "doc/db.properties"))); System.out.println(p.getProperty("driverName"));