JavaWeb路径问题汇总

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名
    • 注意这里的绝对路径不要加工程名,可以理解为是在服务内部转发请求。

由于经常会遇到路径问题,很是烦人,以上都是我初略总结的。如果您感觉有不同的观点,那么肯定你是对的。仅供参考,还望多多指点。

猜你喜欢

转载自blog.csdn.net/xsp_happyboy/article/details/78176963
今日推荐