1.关于JSP/Servlet中的相对路径和绝对路径。

1)服务器端的地址

指的是相对于你的web应用的地址,这个地址是在服务器端解析的,也就是说这时候在jsp和servlet中的相对地址应该是相对于你的web应用,即相对于http: //IP/webapp/的。

其用到的地方有:

  forward:servlet中的request.getRequestDispatcher(address);这个address是在服务器端解析的。

  所以,你要forward到a.jsp应该这么写:request.getRequestDispatcher(“/user/a.jsp”)这个/ 相对于当前的web应用webapp,其绝对地址就是:http://IP/webapp/user/a.jsp。 

  sendRedirect:在jsp中<%response.sendRedirect("/rtccp/user/a.jsp");%>

2)客户端的地址

所有的html和javascript页面中的相对地址,这个地址是在客户端浏览器解析的,都是相对于服务器根目录,及相对于(http://192.168.30.147/)的。

其用到的地方有:

  Html中的form表单的action属性的地址应该是相对于服务器根目录(http://IP/)的。

  所以,如果提交到a.jsp 为:action="/webapp/user/a.jsp"或action="<%=request.getContextPath()% >"/user/a.jsp;
  提交到servlet为actiom="/webapp/handleservlet" Javascript也是在客户端解析的,所以其相对路径和form表单一样。

  因此,一般情况下,在JSP/HTML页面等引用的CSS,Javascript.Action等属性前面最好都加上
  <%=request.getContextPath()%>,以确保所引用的文件都属于Web应用中的目录。另外,应该尽量避免使用类似".","./","../../"等类似的相对该文件位置的相对路径,这样当文件移动时,很容易出问题。

3)JSP中获得当前应用的相对路径和绝对路径

根目录所对应的绝对路径:  request.getRequestURI()
文件的绝对路径 :  application.getRealPath(request.getRequestURI());
当前web应用的绝对路径 :  application.getRealPath("/");
取得请求文件的上层目录:  new File(application.getRealPath(request.getRequestURI())).getParent()

4)Servlet中获得当前应用的相对路径和绝对路径

根目录所对应的绝对路径:  request.getServletPath();
文件的绝对路径 :  request.getSession().getServletContext().getRealPath(request.getRequestURI())
当前web应用的绝对路径 :  servletConfig.getServletContext().getRealPath("/");


ServletContext对象获得几种方式:

javax.servlet.http.HttpSession.getServletContext()
javax.servlet.jsp.PageContext.getServletContext()
javax.servlet.ServletConfig.getServletContext()

2、java类中获取路径

1) 利用Java的类加载机制 调用 XXX.class.getClassLoader().getResource(""); 方法来获取到ClassPath , 然后处理获得WebRoot目录

(这种方式只能是该class在WebRoot/WEB-INF/classes下才能生效, 如果该class被打包到一个jar文件中, 则该方法失效。这时就应该用下面一种方式)

2) spring框架的思路, 在WEB-INF/web.xml中,创建一个webAppRootKey的param, 指定一个值(默认为webapp.root)作为键值

然后通过Listener , 或Filter , 或Servlet 执行String webAppRootKey = getServletContext().getRealPath("/");

并将webAppRootKey对应的webapp.root 分别作为Key , Value写到System Properties系统属性中。之后在程序中通过System.getProperty("webapp.root")来获得WebRoot的物理路径

下面是一些得到classpath和当前类的绝对路径的一些方法,你可使用其中的一些方法来得到你需要的资源的绝对路径:

1.得到当前类FileTest.class文件的URI目录,不包括自己:

DebitNoteAction.class.getResource("")

  如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/atacarnet/src/com/evi/modules/atacarnet/action/

2.得到当前ClassPath的绝对URI路径

this.getClass().getResource("/")  
this.getClass().getClassLoader().getResource("")
Thread.currentThread().getContextClassLoader().getResource("")  
ClassLoader.getSystemResource("")

  如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/

(推荐使用Thread.currentThread().getContextClassLoader().getResource("")来得到当前的classpath的绝对路径的URI表示法)

3.取得服务器相对路径

System.getProperty("user.dir")

  如:E:\apache-tomcat-5.5.16\apache-tomcat-5.5.16\bin

4.取得项目中的绝对路径

request.getRealPath("/")
request.getRealPath("/config/")

(但现在不提倡使用request.getRealPath("/")了,大家可试用ServletContext.getRealPath("/")方法得到Web应用程序的根目录的绝对路径)

5.要取得src的文件非常容易,因为src是默认的相对目录,比如你说要取得src下com目录的test.java文件,你只需要这样就够了

File f = new File(com/test.java);

6.但如果我要取得不在src目录或者WebRoot目录下的文件呢,而是要从src或者WebRoot同级的目录中取呢,比如说doc吧

我的硬方法是这样实现的: 

String path = this.getServletContext().getRealPath("/");
Properties p = new Properties();
p.load(new FileInputStream(new File(path.substring(0,(path.lastIndexOf("\\WebRoot") + 1)) + "doc/db.properties")));
System.out.println(p.getProperty("driverName"));


参考:JavaWeb项目各种路径的获取 - 五指少年 - 博客园  http://www.cnblogs.com/xrab/p/5046005.html

你可能感兴趣的文章

评论区

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

您好,欢迎到访网站!
  查看权限

«   2018年6月   »
123
45678910
11121314151617
18192021222324
252627282930

最新留言