1.请求内部转发
使用:req.getRequestDispatcher("uri").forward(req, resp);
1、多个Servlet共享一个request对象(重点)
2、一次请求,当转发结束的时候也就是业务处理完毕的时候request对象会被销毁
3、地址栏不改变
注意在执行转发完毕后会继续执行代码,但是没有意义,所以一般在转发后面加return
4、request对象的作用域(重中之重)
作用域:共享request对象的Servlet
作用域中存取数据:
req.setAttribute(key,value)
req.getAttribute(key)
req.removeAttribute(key)
请求内部转发实例演示
@Overrideprotectedvoid service(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{//设置响应编码格式resp.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");//设置请求字符编码格式req.setCharacterEncoding("utf-8");//请求转发(获取用户数据):System.out.println(req.getParameter("uname"));System.out.println(req.getParameter("pwd"));//开始请求转发req.setAttribute("405","听说支付宝要收费了,赶紧给我转账");req.getRequestDispatcher("tr.action").forward(req, resp);//开始重定向resp.sendRedirect("http://www.baidu.com");return;}
@Overrideprotectedvoid service(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{//获取用户数据System.out.println(req.getParameter("uname")+"-----tr.action");System.out.println(req.getParameter("pwd")+"-----tr.action");System.out.println(req.getAttribute("405"));resp.getWriter().write("哈哈");}
2.重定向
使用:resp.sendRedirect("uri");
特点:
地址栏改变
两次请求,两个request对象
3.重定向/请求转发时参数URI问题
3.1重定向
项目目录
main.jsp

在main.jsp中进行重定向
| response.sendRedirect("/login.jsp")-->代表localhost:8080/login.jsp |
| response.sendRedirect("login.jsp")-->代表localhost:8080/Admin/login.jsp |
| response.sendRedirect("checkOper")-->代表localhost:8080/Admin/checkOper |
| response.sendRedirect("/checkOper")-->代表localhost:8080/checkOper |
| response.sendRedirect("/Exercise_Jsp/login.jsp")-->代表localhost:8080/Exercise_Jsp/login.jsp |
| response.sendRedirect("/Exercise_Jsp/checkOper")-->代表localhost:8080/Exercise_Jsp/checkOper |
3.2请求转发
在checkOper中转到Oper下的selectAll.jsp中
请求内部转发和重定向图解

总结:
| 请求转发是一次请求,地址栏不改变,多个Sevrlet共享一个request |
| 重定向是两次请求,地址栏改变,两个request对象 |

浙公网安备 33010602011771号