JavaWeb路径问题汇总
1. 问题一:普通Java类(不是Servlet类)读取文件的路径
- 方式一
- 通过类加载器ClassLoader的getResourceAsStream()方法返回读取指定资源的输入流。(我的理解是配置文件也会被加载,加载器就会根据文件被加载的位置,来获取文件读取流)
private static Properties dbProps;
static {
dbProps = new Properties();
try {
dbProps.load(DBUtil.class.getClassLoader().getResourceAsStream("db.properties"));
Class.forName(dbProps.getProperty("driver"));
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
上面是JDBC代码的加载驱动的一部分,写在静态初始化块中。工程结构图中把”dp.properties”文件放到工程目录下,用相对路径总是读取不到。因此采用ClassLoader,读取文件编译后的路径。
- 方式二
- 现在的工程是Javaweb,用Javase工程中的相对路径,把文件放在工程目录下是读取不到的。
- 方式三
- 如果该Java类继承了HttpServlet,则可以通过上下文对象ServletContext的getRealPath()方法。获取文件在服务器中的绝对路径。
工程图片:
工程中upload的绝对路径为:/Users/peng(mac上的用户名)/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/bookproject/upload
代码示范:
// 根据上下文对象获取到整个工程的任何绝对路径
ServletContext context = this.getServletContext();
String path = context.getRealPath("/");
System.out.println("path:"+path);
String path2 = context.getRealPath("/upload");
System.out.println("path2:"+path);
//控制台打印结果
path:/Users/peng(mac上的用户名)/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/bookproject/
path2:/Users/peng(mac上的用户名)/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/bookproject/upload
- 方法四
- 采用磁盘中文件的绝对路径。(不推荐)
2. 问题二:在JSP页面访问服务器的图片。
- 方式一
- 用图片在服务器中的绝对路径访问。注意路径的格式:/工程名/储存图片的文件夹/图片名
上面web工程图中要读取图片的绝对路径应为:/bookproject/upload/图片名
注意前面要加工程名
- 方式二
- 使用服务器的相对路径为:upload/图片名
3. 问题三:重定向和请求转发的路径问题
3.1 重定向
- 方式一
- 使用相对路径,如果要跳转的servlet或jsp与原servlet或jsp在同一级目录下。则相对路径就是文件名。
- 方式二
- 使用绝对路径,如果跳转前后也在同一级目录,则绝对路径为:/bookproject(工程名)/Servlet名
3.2 请求转发
- 方式一
- 使用相对路径,与重定向相同。
- 方式二
- 使用绝对路径,如果跳转前后也在同一级目录,则绝对路径为:/Servlet名
- 注意这里的绝对路径不要加工程名,可以理解为是在服务内部转发请求。
由于经常会遇到路径问题,很是烦人,以上都是我初略总结的。如果您感觉有不同的观点,那么肯定你是对的。仅供参考,还望多多指点。