对于java项目的路径问题
@TOC对于java项目的路径问题
1.绝对路径和相对路径概念的理解
- 绝对路径:
绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)
例如:
d:/mp3/test.txt 代表了test.txt文件的绝对路径.
http://www.sun.com/index.html 也代表了一个URL绝对路径.
http://www.sun.com/upload/car.jpg 也代表了一个URL绝对路径.
- 相对路径:
相对与某个基准目录的路径.包含Web的相对路径(HTML中的相对目录)
例如:
在Servlet中,
"/"代表Web应用的根目录.和物理路径的相对表示.
"./" 代表当前目录,
"../"代表上级目录.这种类似的表示,也是属于相对路径.
2.关于JSP/Servlet中的相对路径和绝对路径.
2.1服务器端的地址
服务器端的相对地址指的是相对于你的web应用的地址,这个地址是在服务器端解析的也就是说这时候在jsp和servlet中的相对地址应该是相对于你的web应用,即相对于http://localhost/webapp/的.
其用到的地方有:
转发和重定向
forward:servlet中的request.getRequestDispatcher(address);
这个address是在服务器端解析的,所以,你要forward到a.jsp应该这么写:
request.getRequestDispatcher("/user/a.jsp")这个"/"是相对于当前的web应用webapp来说,其绝对地址就是:http://localhost/webapp/user/a.jsp.
sendRedirect:在jsp中即可以写http://localhost/test.jsp 也可以写相对路径但URL显示发生跳转
2.22客户端的地址
所有的html页面中的相对地址都是相对于服务器根目录(http://localhost/)的,
而不是(跟目录下的该Web应用的目录)http://localhost/webapp/的.
Html中的form表单的action属性的地址应该是相对于服务器根目录(http://localhost/)的,
所以,如果提交到a.jsp为:action="/webapp/user/a.jsp"或action="/user/a.jsp;
提交到servlet为actiom="/webapp/handleservlet"Javascript也是在客户端解析的,所以其相对路径和form表单一样.
因此,一般情况下,在jsp/html页面等引用的CSS,Javascript.Action等属性前面最好都加上"/",以确保所引用的文件都属于Web应用中的目录.
另外,应该尽量避免使用类似".","./","…/…/"等类似的相对该文件位置的相对路径,这样当文件移动时,很容易出问题.
在Jsp,Servlet,Java中详细获得路径的方法!
1.jsp中取得路径:
以工程名为TEST为例:
(1)得到包含工程名的当前页面全路径:request.getRequestURI()
结果:/TEST/test.jsp
(2)得到工程名:request.getContextPath()
结果:/TEST
(3)得到当前页面所在目录下全名称:request.getServletPath()
结果:如果页面在jsp目录下 /TEST/jsp/test.jsp
(4)得到页面所在服务器的全路径:application.getRealPath(“页面.jsp”)
结果:D:\resin\webapps\TEST\test.jsp
(5)得到页面所在服务器的绝对路径:absPath=new java.io.File(application.getRealPath(request.getRequestURI())).getParent();
结果:D:\resin\webapps\TEST
2.在类中取得路径:
(1)类的绝对路径:Class.class.getClass().getResource("/").getPath()
结果:/D:/TEST/WebRoot/WEB-INF/classes/pack/
(2)得到工程的路径:System.getProperty(“user.dir”)
结果:D:\TEST
3.在Servlet中取得路径:
(1)得到工程目录:request.getSession().getServletContext().getRealPath("") 参数可具体到包名。
结果:E:\Tomcat\webapps\TEST
(2)得到IE地址栏地址:request.getRequestURL()
结果:http://localhost:8080/TEST/test
(3)得到相对地址:request.getRequestURI()
结果:/TEST/test
4.如何获得当前文件路径
常用:
(1).Test.class.getResource("")
得到的是当前类FileTest.class文件的URI目录。不包括自己!
(2).Test.class.getResource("/")
得到的是当前的classpath的绝对URI路径。
(3).Thread.currentThread().getContextClassLoader().getResource("")
得到的也是当前ClassPath的绝对URI路径。
(4).Test.class.getClassLoader().getResource("")
得到的也是当前ClassPath的绝对URI路径。
(5).ClassLoader.getSystemResource("")
得到的也是当前ClassPath的绝对URI路径。
尽量不要使用相对于System.getProperty(“user.dir”)当前用户目录的相对路径,后面可以看出得出结果五花八门。
(6) new File("").getAbsolutePath()也可用。
5.Web服务器
(1).Tomcat
在类中输出System.getProperty(“user.dir”);显示的是%Tomcat_Home%/bin
(2).Resin
不是你的JSP放的相对路径,是JSP引擎执行这个JSP编译成SERVLET
的路径为根.比如用新建文件法测试File f = new File(“a.htm”);
这个a.htm在resin的安装目录下
(3).如何读文件
使用ServletContext.getResourceAsStream()就可以
(4).获得文件真实路径
String file_real_path=ServletContext.getRealPath(“mypath/filename”);
不建议使用request.getRealPath("/");