- 这是我的项目结构:
- 项目的虚拟路径:
- 当我在
web.xml
中设置news.html
为欢迎界面时:
- 网页会出现图片无法加载的问题:
- 我们可以看到
news.html
中的url
是相对路径:
- 这样就会导致当网页打开后,网页会在当前目录下自动进行图片访问加载
我们知道通过../img/logo.png
访问到的路径为localhost:8080/img/logo.png
,那么就会产生一个问题:虚拟路径缺失,因此会导致图片无法加载。
解决方案一
我们可以把虚拟路径设置为 /
,这样可以避免虚拟路径的丢失。
解决方案二
也可以直接在浏览器中输入绝对路径:localhost:8080/test/news/news.html
,也可以解决图片加载不出来的问题。
但这样欢迎界面就没有意义了。
解决方案三
可以不用设置欢迎界面,可以在index.jsp
中通过<a>
标签设置链接打开news.html
页面。
总结
-
对于这个项目,不能配置虚拟路径,如果配置虚拟路径news.html的图片将无法显示
-
当访问到news.html ,浏览器会检测html中的所有路径(img,link),再次发起请求,而这些路径如果是相对路径,则会参照当前浏览器中的路径来进行查找
-
由于相对路径参照的文件夹不一样,会有很多种解决方案,主要是要理解资源的加载路径、加载过程
路径问题:
java中的路径:转发,重定向路径,refresh,servlet绑定的路径
流读取图片/文件,路径 (getRealPath或者直接是电脑上的某个绝对路径:d:\\stu.txt)
html中的路径,img,link,a的href,form的action
绝对路径: 以"/"开头的都是绝对路径(全路径:项目虚拟路径+资源路径)
1. 转发:req.getRequestDispatcher("/servletDemo10").forward(req,resp);
转发这里没有写全路径,是因为转发只能转发当前项目内的url,所以相当于默认就有项目虚拟路径
2. 重定向:resp.sendRedirect(req.getContextPath() + "/servletDemo07"); //例如:/response/servletDemo07
3. 定时刷新:resp.setHeader("Refresh","3;URL=/response/login.html"); // 这里其实也可以通过req.getContextPath()动态获取虚拟路径,然后进行拼接
4. servlet绑定路径: @WebServlet("/addStudentServlet");// servlet绑定的路径相当于是给servlet指定一个访问的url,那肯定不需要写项目虚拟路径
访问此servlet的路径:例如:/stu/addStudentServlet
5. 文件:
BufferedWriter bw = new BufferedWriter(new FileWriter("d:\\stu.txt",true));//本地真实路径
String realPath = getServletContext().getRealPath("/img/a.png"); //在项目中的路径:web/img/a.png
6. <frame src="/crm/html/frame/left1.html" scrolling="no"/> //在项目中的路径web/html/frame/left1.html (/crm是虚拟路径)
7. <a href="/stu/addStudent.html">添加学生</a> //在项目中的路径:web/addStudent.html (/stu是虚拟路径)
8. <form action="/stu/addStudentServlet"> //(/stu是虚拟路径)
相对路径: 不以"/"开头的都是相对路径(相对于当前浏览器地址栏的地址)
1. img的src: <img src="../img/1.jpg">
2. link的href: <link rel="stylesheet" href="../css/login.css"/>