以往一直没注意javaweb中的相对路径和绝对路径问题,有时有问题了,才想起去看看是否是路径的问题,一直对路径问题都是一知半解。今天就姑且记录一下,毕竟事如春梦了无痕嘛,倘不记之笔墨,未免有辜彼苍之厚。
对于一个URL
地址,我们在编码的时候不会去这样写http://localhost/TestProject/registerUserServlet
大多只会在form
表单的提交路径中写上registerUserServlet
或者/TestProject/registerUserServlet
如此这般。
那其实这两种写法效果是一样的,只是前者叫做相对路径
或者叫做绝对路径
。
- 相对路径:以
./
开头,可以省略 - 绝对路径:以
/
开头
我们先来看相对路径,只要搞清楚当前资源与目标资源之间的相对关系,相对路径是非常容易的。
我们通过举例来说明。
我们建立一个javaweb
l类型的项目
在web
文件夹下我们新建一个location.html
文件
<body>
<h1>相对路径</h1>
<h1>找到当前资源和目标资源之间的相对位置关系</h1>
<P>
当前资源:location.html
http://localhost/day15/location.html
</P>
<P>
目标资源:
http://localhost/day15/responseDemo
</P>
<a href="./responseDemo">
responseDemo2
</a>
<a href="responseDemo">
responseDemo2
</a>
在src/com/helius/servelt
文件夹下新建一个responseDemo
的servlet类,来处理location.html
中的响应。
那此时采用上图中的两种写法都是可以的,因为相对路径中的./
可以省略。
分析:当我们打开浏览器,准备访问这个html文件,我们访问的路径是什么呢?
显然是http://localhost/day15/location.html
day15
我们称为虚拟目录
,虚拟目录可以在idea
中的启动的tomcat
中配置。
也就是apache-tomcat-7.0.94\conf\server.xml
中配置的Context
标签
<Context path="/day15" docBase="c:\work_folder" />
另外这个文件是在web
目录下的,也就是项目根目录
所以得出它的访问路径http://localhost/day15/location.html
再来看responseDemo
这个从哪里来的呢,当然是我们在web.xml中配置的
<servlet>
<servlet-name>ResponseDemo</servlet-name>
<servlet-class>ResponseDemoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ResponseDemo</servlet-name>
<url-pattern>/responseDemo</url-pattern>
</servlet-mapping>
注:Servlet3.0
可以直接通过注解进行配置
所以当我们请求这个类的路径就是http://localhost/day15/responseDemo
将两个路径比较一下,使用相对路径可以通过href="responseDemo"
进行访问。
再来看绝对路径
绝对路径要分两种情况了,需要判断定义的路径是给谁用的?判断请求从哪里发出?
- 给客户端使用:需要加虚拟目录
-
<a>
标签,<form>
标签、重定向
-
- 给服务端使用:不需要加虚拟目录
- 转发
再来看用绝对路径怎么改写上个例子
<h1>绝对路径</h1>
<a href="/day15/responseDemo">
responseDemo2
</a>
绝对路径以/
开头,显然,这个超链接肯定是通过用户点击,也即是客户端使用,请求也由客户端发出,所以需要加上虚拟目录day15
同理,我们可以思考,哪些是客户端发出的请求呢?
比如使用
- form表单进行提交
- 点击超连接
- 重定向:切记重定向是客户端行为,
哪些是服务端行为呢?
比较常见的就是转发操作
Tips:如果动态获取虚拟目录
request.getContextPath()
好吧,这次记录的比较简洁,希望这次不会再忘记了。