Servlet中的请求转发与重定向探究
a. 探究过程
b. 经验总结
1.采用与 Jsp与Servlet 重定向与转发探究(一) 一样的servlet Demo,想做测试的请前往此处copy。index.jsp、servlet(ServletRequest.java 与 ServletResponse.java)与web.xml此三文件。
图1. 修改ServletRequest.java中的代码:
request.getRequestDispatcher("end.jsp").forward(request, response);
你会看到结果
无影响!
图2 继续修改:
request.getRequestDispatcher(request.getContextPath()+"/end.jsp").forward(request, response);
你会看到结果:
message处显示的是: /servletForR/servletForR/end.jsp(servletForR为我项目名)
此处报错。
图3 继续修改代码:
request.getRequestDispatcher(request.getContextPath()+"end.jsp").forward(request, response);
结果:
message处显示的是: /servletForR/servletForR.jsp
图4 我们测试response重定向对应的servlet(ServletResponse.java):
response.sendRedirect(request.getContextPath()+"end.jsp");
少了个’/’。结果是:
message处显示的是: /servletForend.jsp
这不就是少了个‘/’所以拼接错误嘛!
图5 ServletResponse.java继续修改:
response.sendRedirect("/end.jsp");
结果是:
message处显示的是: /end.jsp
有没有发觉!!! 和request请求转发的区别!!!
好,我们继续。
图6 代码修改:
response.sendRedirect("end.jsp");
结果是:
有没有感到很奇怪!!!
好吧,我总结下:
如果URL都是“x.jsp”。转发和重定向指向的都是根目录下的文件,会在根目录下索引。
而如果有”/x.jsp”。则有很大的区别。
首先从图
2、图
5图中的message 你可以看出。response的默认目录是整个项目的上一级目录。request默认的目录是项目的根目录。
图 3、图 4我们知道getContextPath()是项目名的路径是没有’/’结尾
因此如果以后是在根目录,则可以选择都不加‘/’直接“x.jsp即可”。
如果不是在根目录,在某一文件中。建议:
重定向用 :request.getContextPath()+"/jsp_name"
;
请求转发用 : /filename/jsp_name
.
例:
重定向:
response.sendRedirect(request.getContextPath()+”/end.jsp”);
请求转发:
(ns为webroot下的子文件夹)
request.getRequestDispatcher("/ns/end.jsp").forward(request, response);