当在进行前后台整合的时候,往往会出现路径不统一或者路径错误的情况,结果就是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以及得到的结果
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),其中的参数应该是以"/"开头的绝对路径,其中"/"表示应用的根。