转发和重定向的区别之一是:采用转发,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>标签。
在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() 返回当前页面所在的服务器使用的端口