在写程序时,想要获取某个资源文件,或想访问某个Servlet,如果路径写不对,就找不到该文件,或访问失败。由此可见,路径很重要。下面我们就来一一分析如何正确找到资源文件及访问Servlet。
1.Servlet访问路径
Servlet的访问路径是在web.xml文件中配置的,如下所示:
Servlet访问路径
Servlet访问路径有如下两种书写方式:
l 路径以“/”开头
l 路径以“*“开头
Servlet的访问路径要么以“/”开头,要么以“*”开头,但是在Servlet中,现在很少使用“*”开头,在后面将要学习的过滤器中会使用它来匹配要过滤的资源。
2.请求转发和请求包含路径
请求转发和请求包含需要给出即将转发和包含资源的路径,例如:
request.getRequestDispatcher(“/BServlet”).forward(request,response),表示要转发到BServlet。request对象的getRequestDispatcher(String path)方法的参数有如下两种书写方式:
l 以“/”开头:
相对当前项目路径,即:http://localhost:8080/项目名,例如:request.getRequestDispatcher(“/BServlet”)表示转发或包含路径为http://localhost:8080/项目名/BServlet的Servlet。
l 不以“/”开头:
相对当前Servlet的路径,例如:当前Servlet是AServlet,访问它的路径为http://localhost:8080/项目名/servlet/AServlet,那么request.getRequestDispatcher(“BServlet”)就相当于,转发或包含路径为http://localhost:8080/项目名/servlet/BServlet的Servlet。
以上两种书写方式中,以“/”开头的路径是绝对路径,不以“/”开头的路径是相对路径。为了以后的开发简便,建议大家采用第一种方式,即以“/”开头的路径。
3.重定向路径
进行重定向时,需要给出将要重定向的资源的路径,例如:
response.sendRedirect(“/Example/BServlet”),表示重定向到Example项目中的访问路径为“/BServlet”的Servlet。
重定向中的路径是客户端路径,只要是客户端路径都需要加上项目名,否则找不到将要访问的资源。重定向路径有以下要求:
l 路径要以“/”开头
以“/”开头,相对当前主机,即http://localhost:8080,所以路径上要加上项目名,如:response.sendRedirect(“/Example/Servlet”),对应的路径就是:http://localhost:8080/Example/Servlet。
4.页面中超链接和表单路径
页面中的超链接和表单路径和重定向路径一样,也是客户端路径,因此路径中要加上项目名。例如:
Ø
Ø
如果超链接或者表单路径中没有加上项目名,如:,并且没有以“/”开头,那么就是相对路径,相对于当前页面所在路径。例如,超链接所在页面是index.jsp,那么index.jsp页面的路径就是:http://localhost:8080/项目名,超链接路径就是:http://localhost:8080/项目名/AServlet。如果是这样就不存在问题,但是如果页面并不是在应用的根目录下,而是根目录下的一个目录中,例如html目录中,那么index.jsp的访问路径就应该是:http://localhost:8080/项目名/html,那么再使用中的路径就会出现问题,所以建议大家使用绝对路径。
5.ServletContext获取资源路径
ServletContext获取资源路径使用的方式是getRealPath(String path),该方法获取的是应用发布到Tomcat安装目录下的webapps目录中的根目录,如:servletContext.getRealPath(“/”)返回的路径就是D:/apache-tomcat-7.0.42/webapps/项目名。具体内容请参考ServletContext读取web应用中的资源文件。
6.ClassLoader获取资源路径
在之前的文档中,我们讲解了在Servlet中使用ClassLoader来获取资源路径,今天我们要学习的是在普通类中使用ClassLoader获取资源路径。具体如下:
(1)创建一个web应用,Example14,在该应用下的【src】目录下新建txt文件,one.txt,文件内容如下所示:
hello one
(2)在该应用下新建一个Class类,DemoLoader,主要代码如例1-1所示:
例1-1 DemoLoader.java
public class DemoLoader {
@Test
public void fun1() throws IOException{
//1.获得ClassLoader对象
ClassLoader cl=this.getClass().getClassLoader();
InputStream in=cl.getResourceAsStream("one.txt");
String value= IOUtils.toString(in);
System.out.println(value);
}
}
在DemoLoader中,我们使用了IOUtils帮助类,该类是commons-io-1.4.jar包中的类,点击此处
下载jar包。IOUtils类的toString(InputStream)方法是将输入流转换成字符串并返回。
(3)例1-1中,我们使用了单元测试,现在运行fun1()方法,运行结果如图1-1所示:
图1-1 运行结果
由运行结果可知,使用ClassLoader的getResourceAsStream(“one.txt”)方法获取到了src目录下的one.txt文件资源。
(4)现在将fun1()方法稍作修改,如例1-2所示:
例1-2 fun1()方法
@Test
public void fun1() throws IOException{
//1.获得ClassLoader对象
ClassLoader cl=this.getClass().getClassLoader();
InputStream in=cl.getResourceAsStream("/one.txt");
String value= IOUtils.toString(in);
System.out.println(value);
}
例1-2相对于例1-1,在路径上多加了“/“。
(5)再次运行fun1()方法,运行结果如图1-2所示:
图1-2 运行结果
由运行结果可知,路径以“/”开头,one.txt文件就找不到了。cl.getResource(“/”)获取的URL为null,如果是cl.getResource(“”),那么获取的URL的值为“file:/F:/space/Example13/WebRoot/WEB-INF/classes/“,因此要注意:
² 使用ClassLoader获取资源路径,资源路径不能以“/“开头。
7.Class获取资源路径
在之前的文档中,我们也讲解过在Servlet中使用Class来获取资源路径,下面我们要学习的是在普通类中使用Class获取资源路径,具体如下:
(1)在DemoLoader类中再次新建一个单元测试方法fun2(),主要代码如例1-3所示:
例1-3 fun2()方法
@Test
public void fun2() throws IOException{
Class c=this.getClass();//获取Clas对象
InputStream in=c.getResourceAsStream("/one.txt");//获取one.txt文件流
System.out.println(IOUtils.toString(in));//打印文件内容
}
fun2()方法中,使用Class获取资源时,资源路径是以“/“开头。
(2)运行fun2()方法,运行结果如图1-3所示:
图1-3 运行结果
(3)对fun2()方法稍作修改,如例1-4所示:
例1-4 fun2()方法
@Test
public void fun2() throws IOException{
Class c=this.getClass();//获取Clas对象
InputStream in=c.getResourceAsStream("one.txt");//获取one.txt文件流
System.out.println(IOUtils.toString(in));//打印文件内容
}
将例1-3中fun2()方法中的资源路径前面的“/“去掉。
(4)再次运行fun2()方法,运行结果如图1-4所示:
图1-4 运行结果
图1-4中,运行结果出现空指针异常,原因是没有找到one.txt文件。
Myeclipse中的应用在工作空间中,目录结构如图1-5所示:
图1-5 class文件所在目录
one.txt文件在工作空间的位置,如图1-6所示:
图1-6 txt文件所在目录
使用Class获取资源路径,要注意以下两点:
l 路径以“/“开头:相对的是classes目录,即在图1-6中的目录下查找文件;
例如:class.getResource(“/“),它返回的URL为:
file:/F:/space/Example14/WebRoot/WEB-INF/classes/
所以想要获取src根目录下的one.txt文件,可以通过class.getResourceAsStream(“/one.txt”)方法。
l 路径不以“/”开头:相对的是当前类的class文件所在的路径,即在图1-5中的目录下查找文件;
例如:class.getResource(“”)方法的返回值为:
file:/F:/space/Example14/WebRoot/WEB-INF/classes/cn/itcast/road/
而通过class.getResource(“one.txt”)方法获取one.txt文件,是在classes目录下的cn/itcast/road目录下查找one.txt,由于one.txt文件是在classes目录下,所以报了图1-4的空指针异常。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/java/253256.html