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)
请求内部转发实例演示
protectedvoid 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;
}
protectedvoid 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对象 |