WEB项目的相对路径与绝对路径
先说结论:
1、强烈建议使用“/”开头的路径(Web应用程序特有的绝对路径)
2、"/"具体又分为以下两种情况
- 若"/"由客户端发起的请求:称为 Web服务器的根目录
- “/”代表主机根目录【
http://localhost:8080/
】 - 超链接、表单、重定向
- “/”代表主机根目录【
- 若"/"由Servlet容器来处理:称为 Web项目的虚拟目录
- “/”代表【
http://localhost:8080/projectName/
】 - 转发、包含、
- “/”代表【
3、不带“/”的相对路径,是相对于访问到当前文件的路径,而不是当前文件所在的目录。
1. JavaWeb中的绝对、相对路径
-
绝对路径:
-
绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径),例如:C:\xyz\test.txt 代表了test.txt文件的绝对路径。
-
Web绝对路径指给出的访问路径可以准确定位到资源的路径。
web应用的绝对路径,是指待访问协议的路径,即URL。
例:
http://localhost:8080/Servlets/index.jsp
-
-
相对路径:
相对路径必须要结合参照路径才可组成可以准确定位资源的绝对路径。
绝对路径 = 参照路径 + 相对路径
1.1 JavaWeb根路径 / 的区别
① 对于服务端
来说,称为 “WEB应用的虚拟路径”:http://localhost:8080/projectName/
-
应用场景如:请求转发,web.xml中的路径url-pattern路径配置,都是由web服务器来调用执行的。
-
请求转发:
request.getRequestDispacter("/path/a.jsp").forward(request,response) :=>则物理地址:`http://localhost:8080/projectName/path/a.jsp`
-
web.xml文件中映射Servlet访问路径:
<servlet> <servlet-name>Step2Servlet</servlet-name> <servlet-class>Step2Servlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Step2Servlet</servlet-name> <url-pattern>/Step2Servlet</url-pattern> </servlet-mapping> <!-- 映射的物理地址:http://localhost:8080/projectName/Step2Servlet -->
-
-
说明:
http://localhost:8080/projectName/
中的projectName实际代表的是项目发布的虚拟目录,虚拟目录由以下情况配置:-
在MyEclipse开发项目中,虚拟目录默认为项目名称
-
而在IDEA中,则需要自己配置,具体见IDEA中发布JavaWeb项目
-
Tomcat配置虚拟目录:在Tomcat下conf/server.xml中添加:
<Context docBase="F:\develop\upload\temp" path="/pic" reloadable="false"/> <!--其中 path="/pic" 即是 项目的虚拟路径 -->
访问
http://localhost:8080/pic
即可访问F:\develop\upload\temp下的资料。
-
-
重点:request.getContextPath() =
http://localhost:8080/projectName/
② 对于由客户端
来说 ,“/” 代表着的是web站点的根路径
,即http://localhost:8080/
-
应用场景如:
a标签
、表单提交
,请求重定向
- 超链接 : <a href="/testservlet"></a>=> `http://localhost:8080/testservlet` - form表单的action: <form action="/login.jsp"> =>` http://localhost:8080/login.jsp` - 做请求重定向的时候:response.sendRedirect("/a.jsp")=> `http://localhost:8080/a.jsp` 重定向资源是在servlet代码中实现的,服务端是将要重定向的路径返回给浏览器, 让浏览器重新请求,也归类为客户端请求,和浏览器在页面中发送请求的规律是一样的
2. 强烈建议
考虑到项目的移植性,实际开发种,我们使用“/”开头的路径,具体如下:
项目名 testProject
2.1 JSP页面到JSP页面
- 相对路径的方式:相对路径是根据当前页面的位置去定位目标的位置
该方法简单,适合初学者,但实际项目种移植性不好。
<!--a.jsp=>b.jsp-->
<a href="b.jsp">转向b</a>
<!--a.jsp=>c.jsp-->
<a href="jsp/c.jsp">转向c</a>
<!--c.jsp=>a.jsp-->
<a href="../a.jsp">转向a</a>
- 绝对路径的方式(推荐使用):
<!--a.jsp=>b.jsp-->
<a hre="${pageContext.request.contextPath}/b.jsp">绝对转向b</a>
<a hre="${request.getContextPath()}/b.jsp">绝对转向b</a>
<!--a.jsp向c.jsp-->
<a hre="${pageContext.request.contextPath}/jsp/c.jsp">绝对转向c</a>
<!--c.jsp向a.jsp-->
<a hre="${pageContext.request.contextPath}/a.jsp">绝对转向a</a>
${pageContext.request.contextPath}的值:/testProject(获取项目虚拟路径,也就是项目发布名,虚拟路径一般等同于项目名)
其中“/”表示的是Web服务器的根目录,也就是http://localhost:8080
或则Tomcat的webapps/testProject 目录,这是一个绝对路径,不会出错,移植性强。
2.2 JSP页面到Servlet
实际上和jsp到jsp一样.
假设现在在TestServelt
中 请求路径为http://localhost:8080/testProject/servlet/testServlet
- 相对路径的方式:
<!--a.jsp=>TestServlet-->
<a href="servlet/TestServlet">转向TestServlet</a>
<!--c.jsp=>TestServlet-->
<a href="../servlet/TestServlet">转向TestServlet</a>
- 绝对路径的方式:(推荐使用)
<!--a.jsp=>TestServlet-->
<a href="${pageContext.request.contextPath}/servlet/TestServlet">转向TestServlet</a>
<!--c.jsp=>TestServlet-->
<a href="${pageContext.request.contextPath}/servlet/TestServlet">转向TestServlet</a>
2.3 Servlet发出的转发
假设现在在TestServelt
中 请求路径为http://localhost:8080/testProject/servlet/testServlet
假设现在在TestServelt2
中 请求路径为http://localhost:8080/testProject/servlet/testServlet2
2.3.1 转发到a.jsp :
- 相对路径
request.getRequestDispatcher("../a.jsp").forword(request,response);
../相对于退出一级(servlet这一级),回到 http://localhost:8080/testProject这里 ,拼接上a.jsp即得到正确路径url=http://localhost:8080/testProject/a.jsp,这是用的相对路径.
- 绝对路径(推介使用)
request.getRequestDispatcher("/a.jsp").forword(request,response);
这也可以实现正确跳转,因为这里的"/"
表示web的虚拟路径
即 http://localhost:8080/testProject
,拼接上a.jsp即得到正确的路径url=http://localhost:8080/testProject/a.jsp ,这是绝对路径。
2.3.2 转发到Testservlet2:
-
相对路径
request.getRequestDispatcher("testServlet2").forward(request,response);
TestServlet和TestServlet2在
同一层级
,这里用的是相对路径
。 -
绝对路径(推介使用)
request.getRequestDispatcher("/servlet/testServlet2").forward(request,response);
这里就是绝对路径了,"/”表示
web虚拟路径
2.4 Servlet发出的重定向
重定向其实同JSP页面发起的请求一样,因为是一次新的HTTP请求
// request.getContextPath() 获取项目根路径 /testProject
response.sendRedirect(request.getContextPath() + "/a.jsp");//正确
response.sendRedirect("/a.jsp"); //不正确
这种写法是错误的 地址栏可见url=http://localhost:8080/a.jsp
, 因为这里的"/"
表示的是web虚拟路径,即:http://localhost:8080
2.5 绝对路径使用小结(重点)
在实际Java Web开发中,我们使用以下方法描述路径:使用“/”开头的绝对路径
-
客户端发起的请求,包括以下情景:超链接、表单、重定向等,在代码中使用request.contextPath()方法获取下项目虚拟路径,http://localhost:8080/虚拟目录(项目发布目录,一般为项目名称),可以理解该目录为项目根目录,然后访问其他文件,相对该路径描述出来即可。
-
本案例的request.contextPath()获取的路径为:http://localhost:8080/testProject
<!--a.jsp=>b.jsp--> <a hre="${request.getContextPath()}/b.jsp">绝对转向b</a> //拼接出来的实际url=http://localhost:8080/testProject/b.jsp
<!--a.jsp=>TestServlet--> <a href="${request.getContextPath()}/servlet/TestServlet">转向TestServlet</a> //拼接出来的实际url=http://localhost:8080/testProject/servlet/TestServlet
// request.getContextPath() 获取项目虚拟目录 /testProject response.sendRedirect(request.getContextPath() + "/a.jsp");//正确 //拼接出来的实际url=http://localhost:8080/testProject/a.jsp
-
服务器转发或包含,由一个Servlet转发到另一个Servlet 或 JSP,这是在服务器内完成,而不是由客户端发起的请求,包括场景:转发、包含、
等. request.getRequestDispatcher("/jsp/c.jsp").forword(request,response); //拼接出来的实际url=http://localhost:8080/testProject/jsp/c.jsp
request.getRequestDispatcher("/servlet/testServlet2").forward(request,response); //拼接出来的实际url=http://localhost:8080/testProject/servlet/testServlet2
这么多路径,搞晕了吗?晕了就对了,说明你还由很多东西需要学习!