先看看几个路径的概念:
1、绝对路径:以/开头的路径就叫做绝对路径,绝对路径在相对于的路径上直接拼接得到最终的路径。
2、相对路径:不以/开头的路径就叫做相对路径,相对路径基于当前所在的路径计算的到最终的路径。
3、硬盘路径:以盘符开头的路径就叫做硬盘路径.是哪个路径就是哪个路径.没有相对于谁的问题。
1、虚拟路径: ----都使用绝对路径
(1)若虚拟路径是给浏览器用的,这个路径相对于虚拟主机,所以需要写上web应用的名称。
<a href="${pageContext.request.contextPath}/.....">
<form action="${pageContext.request.contextPath}/.....">
<img src="${pageContext.request.contextPath}/.....">
response.setHeader("Location",request.getContextPath()+"/index.jsp"); //重定向
response.setHeader("refresh","3;url="+request.getContextPath()+"/index.jsp"); // 定时刷新重定向
response.sendRedirect(request.getContextPath()+"/index.jsp"); //重定向
(2)若虚拟路径是给服务器用的,这个路径相对于web应用,所以可以省写web应用的名称。
request.getRequestDispathce("/index.jsp").forward(); //转发
request.getRequestDispathce("/index.jsp").include(); //包含
2、真实路径: ----都使用相对路径,计算得到
根据原理,具体问题具体分析
servletContext.getRealPath("1.jpg"); //--给一个相对于web应用目录下的路径
this.getServletContext().getRealPath("1.jpg").toString();
E:\Program-Files\apache-tomcat-6.0.36\webapps\day04\1.jpg
classLoader.getResource("2.jpg").getPath(); //--给一个相对于类加载目录下的路径
PathDemo.class.getClassLoader().getResource("2.jpg").getPath();
/E:/Program-Files/apache-tomcat-6.0.36/webapps/day04/WEB-INF/classes/2.jpg
PathDemo.class.getClassLoader().getResource("../../1.jpg").getPath();
/E:/Program-Files/apache-tomcat-6.0.36/webapps/day04/1.jpg
3、相对路径
File file = new File("config.properties");//--相对于程序的启动目录
new InputStream("config.properties");//--相对于程序的启动目录
E:\Program-Files\apache-tomcat-6.0.36\bin\config.properties
public static void main(String[] args) {
File file = new File("3.jpg");
System.out.println(file.getAbsolutePath());}
E:\Program-Files\java-workplace\MyeclipseWorkspace\myeclpse_javaweb_2016\day04\3.jpg
public static void main(String[] args) {
String path=demo1.class.getClassLoader().getResource("2.jpg").getPath();
File file = new File(path);
System.out.println(file.getAbsolutePath());
E:\Program-Files\java-workplace\MyeclipseWorkspace\myeclpse_javaweb_2016\day10\bin\2.jpg
4、绝对路径 直接拼接
File file = new File("/1.jpg");
new InputStream("/1.jpg");
E:\1.jpg
地址路径写法举例
1、Servlet的转发
RequestDispatcher dispatcher = this.getServletContext().getRequestDispatcher (“/servlet/Demo6Servlet”); //获取转发器
dispatcher.forward(request,response); //把请求响应转发到Demo6Servlet
2、请求重定向
//response.setStatus(302);
//response.setHeader("Location", "/day04/index.jsp");
或
response.sendRedirect("/day04/index.jsp");
3、请求包含:
将两个资源的输出进行合并后输出
1、this.getServletContext().getRequestDispatcher(" /../..").include(request,response);
2、request.getRequestDispatcher("/../..").include(request,response);
*被包含的Servlet程序,只能是实体内容
4、当前web应用的名称
resquest.getContextPath(); = /day04 ,当前web应用虚拟目录名称
则重定向要这么写了
response.setHeader("Refresh", "2;url=”+resquest.getContextPath()+”/index.jsp");
5、在Servlet中读取资源文件
config.properties直接放在WebRoot文件夹下:= web应用根目录day03
Properties prop = new Properties();
prop.load(new FileReader(this.getServletContext().getRealPath("config.properties")));
6、非Servlet环境下要读取资源
1、config.properties直接放在src文件夹下: = web应用目录的classes文件夹
Properties prop = new Properties();
prop.load(new FileReader( Service.class.getClassLoader().getResource("config.properties").getPath()));
2、config.properties直接放在WebRoot文件夹下Service.class.getClassLoader().getResource("../../config.properties").getPath()
去上一层文件夹找../
classes里上一层是WEB-INF里,再上一层是Day3里
3、config.properties直接放在src/com/itheima文件夹下
Service.class.getClassLoader().getResource("com/itheima/config.properties").getPath()
7、定时更改刷新--是重定向
indext.jsp在WebRoot文件夹下
response.setHeader("Refresh", "2;url=/day04/index.jsp");