response.sendRedirect和RequestDispatcher跳转的怪问题,请大家帮助
(1)利用MyEclipse新建web project,在WebRoot目录下建立子目录admin和css,在admin目录下有1.jsp,在css目录下有s.css.
(2)在1.jsp中通过以下代码使用样式文件s.css
侧栏
(3)在浏览器中浏览1.jsp文件,样式应用成功。
(4)新建一个Servlet.问题出现了,如果在Servlet通过
response.sendRedirect("admin/1.jsp"); 该句代码跳转到1.jsp后,样式表仍然起作用
但是如果通过以下方法跳转,跳转后在1.jsp中样式表不起作用。
RequestDispatcher rd = request.getRequestDispatcher("admin/1.jsp");
rd.forward(request, response);
这里就不明白两种跳转为什么有一种导致样式不生效呢。
如果将1.jsp不放在admin目录下,直接放置在WebRoot目录下,两种跳转方式跳转后,样式表文件都生效,但是不知道为什么1.jsp放置在admin子目录中后,ReqeustDispatcher的跳转方式
跳转后样式文件不生效。
请各位指教,小弟感激涕零
是相对路径的问题。
我从lz描述的现象猜测lz的servlet应该映射的是web应用的根目录下的,假设相关的url如下:
servlet: http://localhost:8080/myapp/myservlet
jsp: http://localhost:8080/myapp/admin/1.jsp
css: http://localhost:8080/myapp/css/s.css
要取到css文件,浏览器请求的url应该是http://localhost:8080/myapp/css/s.css
(1)直接访问jsp的情况,浏览器请求的url是http://localhost:8080/myapp/admin/1.jsp,然后再根据../css/s.css请求css文件,相对路径转换后的url是http://localhost:8080/myapp/css/s.css,所以可以取到文件。
(2)response.sendRedirect的情况,访问servlet后,浏览器被重定向到http://localhost:8080/myapp/admin/1.jsp,情况跟(1)一样,所以也能取到。
(3)rd.forward的情况,浏览器请求的是http://localhost:8080/myapp/myservlet,经过请求转发,返回1.jsp的内容,但浏览器的url仍旧是http://localhost:8080/myapp/myservlet,根据../css/s.css来取文件的话,转换后的url变为http://localhost:8080/s.css,所以取不到。
(4)把1.jsp放在根目录下以后,lz的1.jsp里的路径应该有改成./css/s.css之类的吧。这时http://localhost:8080/myapp/myservlet被forward后,请求的css路径就变成http://localhost:8080/myapp/css/s.css,所以可以取的到文件。
这是我猜测的大概情况,不知是否跟lz的实际情况一样。lz可以用firebug等截包工具,看看取到1.jsp页面后,浏览器发的css文件请求的url就知道了。
页面上导入Javascript和CSS最好不要那样写
[code="html"]
<%String path = request.getContextPath();%>
一种是重定向,一种是请求转发
重定向,其实是两次request,
第一次,客户端request A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了
而转发是服务器内部把对一个request/response的处理权,移交给另外一个
对于客户端而言,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D...
[quote]
这种区别我是知道的,但是为什么有了文件夹后,servlet中利用ReqeustDisptacher转发到1.jsp后,1.jsp的样式表无法起作用呢?
[/quote]
Servlet是把请求转发了,但是浏览器认为它访问的还是那个Servlet,所以相对路径是这个Servlet的相对路径.