访问资源时经常出现访问404错误,一般都是路径的问题。
需思考以下几点。什么是Url地址、相对路径、绝对路径,二者之间有何区别;路径常常出现在什么地方。
项目结构图:
==============================
重点内容
URL地址:
访问服务器资源时需要在浏览器地址栏输入:
http://主机地址:端口号/项目名/资源路径/资源名,
比如:http://localhost:8080/servlet001/hello/3.html
再熟悉不过了,这个就是我们的URL地址,访问资源时都必须通过我们的URL地址去访问,那么URL的地址正确与否就显得特别的关键。
====================================
相对路径和绝对路径:
相对路径:2.html: <a href="2.html">去2.html</a>
绝对路径:2.html: <a href="/2.html">去2.html</a>
平常所说的相对绝对指的是上面书写的问题。有一点需要注意的是,不管是相对路径书写还是绝对路径书写,他们都有自己的相对路径,并且是一样的。
相对的路径分为2种情况,服务器端、浏览器端。
服务器端相对的路径是:http://localhost:8080/10_WEB_Path/
浏览器端相对的路经是:http://localhost:8080/
因此我们访问资源是的URL地址栏显示的路径字符串就是等于书写的路径+相对的路径。
===================================
对于浏览器:
base标签:项目名称时常发生变动,如果频繁在静态页改动很麻烦,统一配到base标签里。
对于服务器:想取得项目名称,使用:
String contextPath = request.getContextPath();
/**
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<!-- base标签中可以设置一个href属性,这个属性可以作为页面中所有相对路径的前缀 -->
<!-- base标签不会对使用绝对路径书写起作用 -->
<!--浏览器端相对的路经是:http://localhost:8080/-->
<base href="http://localhost:8080/10_WEB_Path/" />
</head>
<body>
<!--http://localhost:8080/10_WEB_Path/index.html -->
<a href="index.html">去index.html</a>
<hr />
<!--http://localhost:8080/10_WEB_Path/hello/1.html -->
<!-- 实际上base标签就是可以让我们以相对路径的方式使用绝对路径 -->
<a href="hello/1.html">去1.html</a>
</body>
</html>
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//转发到1.html
//转发是在服务器内部进行,它会自动为绝对路径加上项目名
request.getRequestDispatcher("/hello/1.html").forward(request, response);
//重定向是发生在浏览器端的,地址由浏览器解析,绝对路径需要加上项目名
/*String contextPath = request.getContextPath();
System.out.println(contextPath);
response.sendRedirect(contextPath+"/hello/1.html");*/
}
====================================
tips:
1.使用绝对路径书写,不要使用相对路径书写,因为转发的缘故,相对路径非常容易发生改变,所以在开发中我们从来不使用相对路径。
/**
使用相对路径书写发生错误场景:
1.html: <a href="2.html">去2.html</a>
Index.html:<a href="PathServlet">转发去1.html</a>
PathServlet:request.getRequestDispatcher("/hello/1.html").forward(request, response);
在index.html中点击转发去1.html,通过转发去到了1.html页面,地址栏显示的地址是:http://localhost:8080//10_WEB_Path/PathServlet
再点击去2.html时,发送了404错误。因为转发地址栏路径不变,此时相对的路径是http://localhost:8080//10_WEB_Path/,加上2.html成了http://localhost:8080//10_WEB_Path/2.html;所以资源找不到。
*/
2.常见路径:
/**
servlet中的url-pattern、转发的路径
-- 这两个的绝对路径由服务器解析,相对于项目的根目录 http://localhost:8080/10_WEB_Path/
重定向的路径、页面中的路径:
> 这两个路径有浏览器解析,相对于服务器的根目录
http://localhost:8080/
*/
未完待续!