一 、web开发中路径问题:(关于访问servlet时的路径问题)
在浏览器上访问服务器:
1.超链接(get)
2.表单(get post)
3.javascript(get) location.href=""
4.直接在浏览器地址栏上输入。 (get)
在页面上访问servlet路径问题分析:
1.绝对路径
1.带协议绝对路径
<a href="http://localhost/07_25_servlet/hello">带协议绝对路径</a>
2.不带协议绝对路径(推荐)
<a href="/07_25_servlet/hello">不带协议的绝对路径</a>
这时它的规律 /工程名(虚拟目录名称)/资源名称
2.相对路径
http://localhost/07_25_servlet/demo1.html 当前页面路径.
http://localhost/07_25_servlet/demo1 要访问的资源路径.
这时通过上述路径就知道在demo1.html中要访问demo1这个servlet
<a href="demo1">访问Demo1Servlet</a>
改变demo1.html路径
将demo1.html放置在WebRoot/admin目录
这时它们路径之间的关系
http://localhost/day07_25_servlet/admin/demo1.html 当前页面路径.
http://localhost/07_25_servlet/demo1 要访问的资源路径.
此时的型对路径为 <a href="../hello">相对路径</a>
二、获取资源时的路径
1. String getRealPath(String path)
获取当前web工程下文件的绝对磁盘路径.
2. URL getResource(String path)
获取一个指定资源的URL
3. InputStream getResourceAsStream(String path)
获取一个指向指定资源的一个输入流。
案例:
在myeclipse下创建 day10_3这样web工程,在工程下创建四个文件
1.txt--------src下
2.txt--------WebRoot下
3.txt--------WebRoot/WEB-INF
4.txt--------放置在当前工程下
要求1:创建一个java类分别将这个四个文件内容读取出来,显示在控制台上.
// 读取1.txt文件内容
readFile("src/1.txt");
// 读取2.txt文件内容
readFile("WebRoot/2.txt");
// 读取3.txt文件内容
readFile("WebRoot/WEB-INF/3.txt");
// 读取4.txt文件内容
readFile("4.txt");
要求2:创建一个servlet,在servlet中将部署到tomcat下的所有的x.txt文件内容读取出来.
getRealPath("/")获取的是当前工程在服务器上的的绝对磁盘路径。
例如:D:\apache-tomcat-7.0.26\webapps\day10_3\
分析1.txt 2.txt 3.txt 4.txt文件部署到tomcat下的路径:
1.txt---因为它是在src下,部署到tomcat下时会被放置在WEB-INF/classess目录下.
2.txt---因为它在WebRoot下,部署到tomcat下时会被放置在工程根路径下.
3.txt---因为它在WEB-INF下部署到tomcat下时会被放置在WEB-INF下.
4.txt--因为它在myeclipse工程下,不会被部署到tomcat服务器.
要在servlet中获取1.txt 2.txt 3.txt绝对磁盘路径
this.getServletContext().getRealPath("/WEB-INF/classes/1.txt");
this.getServletContext().getRealPath("/2.txt");
this.getServletContext().getRealPath("/WEB-INF/3.txt");
扩展知识点:
在开发中有另外一种可以获取一个资源的磁盘路径方案:根据Class获取.
可以根据Class获取classpath路径。
java project工程中 java文件编译后的.class文件默认放置在 bin目录下.
web project工程中 java文件编码后的.class文件默认放置在 classess目录下.
Class.getResource("/").getPath();可以获取.class文件所在的路径。
//我们在开发中根据classpath获取路径还有另外一种方式:
Class.getClassLoader().getResource();
Class.getResource()与Class.getClassLoader().getResource()区别?
Class.getResource它依赖于当前类的classLoader来获取,如果在写路径时使用 "/"代表的是从classpath根路径查找.
如果不写"/"代表的是从当前Class所代表的类的路径查找.
Class.getClassLoader().getResource();代表的都是从classpath路径查找.
在开如使用时,如果使用 Class.getResource("/"); 代表从classpath路径查找.
如果使用Class.getClassLoader().getResource("");都不写"/" 这时得到的就是classpath路径.
如果写了"/"有可以得到null值
结论:
Class.getResource("/");
Class.getClassLoader().getResource("");
补充:
以web工程为例:
Class.getResource("/"); 得到的就是classes目录磁盘路径. 例如: d:/tomcat/webapps/day10/WEB-INf/classes
Class.getResource(""); 得到的就是Class对应的类它的绝对磁盘路径。 d:/tomcat/webapps/day10/WEB-INf/classes/cn/itcast/servlet
Class.getClassLoader().getResource("");得到的就是classes目录磁盘路径. 例如: d:/tomcat/webapps/day10/WEB-INf/classes