本资源引自: 页面转发引起文件路径失效 - 柳松 廊坊师范学院 七期信息技术提高班 - 博客频道 - CSDN.NET http://blog.csdn.net/liusong0605/article/details/7888033 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- 转发和重定向的区别之一是:采用转发,URL不会发生变化。即从一个servlet转发到一个jsp页面,url仍为servlet的地址。这样,原来jsp页面中使用到相对路径的地方要进行修改。否则,是找不到文件的。 例如:假设jsp页面在project文件夹下,css源文件在project/style文件夹下。 从servlet转发到jsp页面的地址为http://localhost:8080/ project/item/Servlet/ShowItemServlet, jsp页面中引入css文件的地址为<link rel="stylesheet"href="style/css.css">, 这时,就出现了调用页面的url和被调用页面的url不一致,相当于css文件的地址为http://localhost:8080/ project/item/Servlet/ShowItemServlet/syle/css.css ,这样,css文件自然是无法找到的。
解决办法: 1. 修改页面中元素的路径。 将引入的css的链接改为<link rel="stylesheet"href="../style/css.css">,即先由servlet的地址退回到project目录下,这样,就找到了project/style/css.css文件了。 缺点:如果servlet的路径较深,这样做容易出现错误,并且,页面中所有的链接全部都要进行这样的修改,所以,不推荐这样的修改方式。
在html的头部加入<base href="http://localhost:8080/project/">,其他引入文件的地址不变,仍为<link rel="stylesheet" href="style/css.css">,这样,css文件的路径是正确的。
默认情况下,页面中的相对路径,都是相对于当前URL请求的地址去寻找资源的。html中的base标签,用来设置当前页面的默认起始路径,设置了base标签后,浏览器不再使用当前文档的URL,而是使用指定的url来解析页面中所有的相对URL。 原理就是上面讲的这些,但是,在实际的项目中,base标签中的url一般不会直接写死在代码中,而是通过动态获取得到。 String path =request.getContextPath(); String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; <base href="basePath">
Request.getcontextPath: 得到项目的名字 /project Request.getSchema() 返回页面使用的协议名称 这里使用的是http协议 Request.getServerName() 返回当前页面所在的服务器的名字 如果是本机,就为localhost Request.getServerPort() 返回当前页面所在的服务器使用的端口 |
|