相对路径、绝对路径和servlet映射路径

时间:2022-03-13 08:54:54

当在进行前后台整合的时候,往往会出现路径不统一或者路径错误的情况,结果就是css无效、servlet或jsp页面映射不到。

所以特意对路径的设置写一下总结:

这里只涉及到 web应用的路径问题, 至于本地系统的路径不做讨论。

1. 路劲可分为 绝对路径 和 相对路径

 

2. 绝对路径 (开头带"/"

  前端: http://localhost:8080/myWebApp/user/login.jsp

     /myWebApp/user/login.jsp

  后端: /user/login.jsp

  这里可以看出一个区别, 其中"/"这个斜杠在前后端有着不同的意义:

  前端--> (表示) 服务器的根路径(例如:http://localhost:8080/)

  后端-->(表示) 应用的根路径 (例如: http://localhost:8080/yourWebAppName/)

3. 相对路径 (开头不带"/")

     举个例子, 假如当前的路径是 http://localhost:8080/myWebApp/user/login.jsp

      那么这时候访问 “main.jsp”页面,即访问的是 http://localhost:8080/myWebApp/user/main.jsp

  也就是说,使用相对路径,那么访问的是 当前页面路径 所属 目录 下的文件路径

  这个特性无论是在前端 、 后端 都是一样的。

  在java中,无论是JSP或者Servlet , 都可以通过request这个对象获得requestURL( ) , 该方法返回当前所访问的页面的绝对路径的一个StringBuilder。

  应用服务器正是通过该路径来得到用户想要访问的页面路径。

  而一般使用forward时,就是通过修改该路径(无论当前指定的是绝对路径或者相对路径),来请求新的路径。

 

4. JSP/Servlet中对路径信息的获取的相关API

下面是一个使用jetty作为底层的服务器。其中存在一个映射为/plugins的servlet

我们访问的页面为:http://localhost:9090/plugins/maidatabase/user-vCard-view.jsp

下面是调用相关API以及得到的结果

相对路径、绝对路径和servlet映射路径
the Base path(scheme+serverName+serverport+requestContext): http://localhost:9090  //应用路径 

request.reqeustURL(): http://localhost:9090/plugins/maidatabase/user-vCard-view.jsp    //请求路径
request.requestURI(): /plugins/maidatabase/user-vCard-view.jsp    //请求路径(相对服务器根目录部分)

request.getSession.getServletContext().getRealPath(""): E:\projects\openfire_src\target\openfire\plugins\admin\webapp  //根目录的真实路径
request.getSession().getServletContext().getResource("/").toString(): file:/E:/projects/openfire_src/target/openfire/plugins/admin/webapp/  //这里必须要‘/'开头

request.getServletPath(): /plugins  //servlet的映射路径

the servletContext serverInfo: jetty/7.0.1.v20091125  //服务器信息
request.pathInfo() : /maidatabase/user-vCard-view.jsp  //请求路径中位于 servlet路径 和 查询数据 之间的 附加路径信息

servletContext.getContextPath() :    //应用上下文路径(标准的)
request.getContextPath():    //请求request 所指向的应用上下文路径 一般为应用路径,即/yourWebAppName (因为这里的场景是把整个应用服务器当成一个应用,所以应用上下文为"")

 

5. 附带上别人的文章

  这篇文章总结得好,而且很简练:
1. <form action="abc.do" method="post">*********</form>,并且该页面的访问地址是http://localhost:8080/yaso/login
   <form action="/abc.do" method="post">*********</form>,并且该页面的访问地址是http://localhost:8080/yaso/login
    此处可以使用相对路径或者绝对路径,其中相对路径是相对于当前访问的页面。当提交表单后,浏览器地址栏中的信息变为http://localhost:8080/yaso/abc.do
    如果使用绝对路径,则"/"是指服务器的根而非应用的根。如果将上述表单改为action="/abc.do",则当提交表单后,浏览器地址栏中的信息变为http://localhost:8080/abc.do
    如果要使用绝对路径可以使用getContextPath()方法。

2. 在web.xml中的<servlet-mapping>中的<url-pattern>标记中只能使用绝对路径,即必须要 以"/"开头。可以这样理解:一个应用对应于一个web.xml,所以这里的绝对路径表示应用的根,而不是服务器的根。(一个特殊情况就是 在<url-pattern>中使用模式匹配的*.do,但仍然应该理解成从/开始。)

3.RequestDispatcher view = request.getRequestDispatcher("/abc.jsp");
   RequestDispatcher view = request.getRequestDispatcher("abc.jsp");
    这里可以使用相对路径和绝对路径。相对路径是当执行到该代码所在的Servlet的时候地址栏上显示的路径。
    如果使用绝对路径,则"/"表示应用的根。

4.RequestDispatcher view = getServletContext().getRequestDispatcher("/abc.jsp");
    这里必须使用绝对路径,"/"表示应用的根。可以这么理解:在ServletContext上调用请求转发,如果使用相对路径,则无法得知到底相对于该应用的什么位置,只能根据绝对路径来判断。由于是在应用上下文上调用的方法,所以"/"就表示应用的根。

5.servletContext中的getResourceAsStream(String),其中的参数应该是以"/"开头的绝对路径,其中"/"表示应用的根。