RequestDispatcher dispatcher=request.getRequestDispatcher("b.jsp")
dispatcher.forward(request,response);
大致的示意图如下:
步骤2与步骤3的运行都在服务器内部,它对用户(浏览器)来说是透明的,那么新的地址,肯定不会显示在地址栏上,而且之前的request信息自然就可以用了#我们先看jsp中关于资源的引用
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
这是第一张
这是第二张
这是第三张
这是第四张
这是第五张
当我们直接访问b.jsp时,效果如下
根据上面的图,我们至少能得到一个结论<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
去b页面
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// request.getRequestDispatcher("jsp/b.jsp").forward(request, response);
request.getRequestDispatcher("/jsp/b.jsp").forward(request, response);
}
如果使用服务器跳转,那么默认路径就是当前的项目,因而,上面两种url方式(不管url前面是否有"/")都可以#
那么大家想想http://localhost:8900/PathTest/testServlet 在这个地址下(记着是服务器端跳转,"b.jsp"这个页面对用户来说就是透明的,你压根就不知道你到底访问的是那个页面# 另一方面,servlet的地址是:http://localhost:8900/PathTest/testServlet, 目录却是:http://localhost:8900/PathTest)
此时访问图片1的模式 ../images/b.jpg访问的图片地址其实就是:http://localhost:8900/images/b.jpg 怎么可能会有照片?
所以,在项目中,图片一的那种相对路径的方式是没办法两全其美的#
所以最好使用,图片四的访问方式,用绝对路径#
我们改动servlet,如下:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect("/jsp/b.jsp");
}
我们把servlet换成:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect("jsp/b.jsp");
}
点击去b页面后,地址栏成为http://localhost:8900/PathTest/jsp/b.jsp
显示出图片一与图片四
通过上面的例子,我们又可以得出结论
客户端跳转时,它的路径并不是相对于当前的项目#
所以,如果使用绝对路径,那么就得加上项目名称如下:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect(request.getContextPath()+"/jsp/b.jsp");
}
本文大范围的参考了
http://cxshun.iteye.com/blog/1123913
这篇博客,特此说明,并表示感谢