问题描述
今天在公司测试使用一个新框架时出现了一个奇怪的问题,当在浏览器中直接访问jsp页面时一切正常,但是在servlet进行转发到这个页面时,框架的JS就无法正确执行了,但是使用重定向一切正常。当时困扰了好久,后来和同事一起排查才发现是由于servlet在进行转发时使用的上下文路径还是servlet路径,而不是jsp的路径,所以只要改下路径就行了。
解决方案
将相对路劲变为决定路径,如:
以前错误的引用格式(相对路径)
<script src="../js/jquery.min.js"></script>
改为正确的格式(绝对路径)
<script src="<%=request.getContextPath()%>/js/jquery.min.js"></script>
问题背后
其实这个问题的解决方案很简单,但是在我们应该看到问题背后的一些东西,比如下面这句话的效果
request.getRequestDispatcher("jsp/demo.jsp").forward(request, response);
其实是servlet 去读取 jsp/demo.jsp文件,然后使用response.getOutputStream()将文件数据输出到浏览器中,所以这里的路径依旧是servlet的路径,而不是jsp/demo.jsp的路径,其实通过浏览器上面的路径也可以看出来。