实现重定向
重定向的原理就是302+location, 通过设置状态码302和location响应头就可以实现重定向的效果
response.setStatus(302);
response.setHeader("Location","/Day09/index.jsp");
这两行代码等价于
response.sendRedirect("/Day09/index.jsp");
请求的转发与重定向的区别:
1、请求的转发一定是在服务器内部转发,重定向可以访问外部资源
2、请求的转发是一次请求一次应答,重定向是两次请求两次应答
3、请求的转发地址栏的地址不会改变,重定向地址栏会改变
protectedvoid doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//实现请求的重定向
//设置状态码
response.setStatus(302);
//给用户传递应大头-->location
response.setHeader("location",request.getContextPath()+"/index.jsp");
//response.sendRedirect("https://www.baidu.com/");
}
实现请求转发
请求重定向: 302+location
请求转发: 实现资源的跳转, 服务器内部的跳转. 一次请求 一次响应 地址栏不会发生变化
RequestDispatcher dis = request.getRequestDispatcher("xxxxx");//调度器
dis.forward(request, response);//实现请求转发
**在请求转发之前, 如果response缓冲区写入了数据但是还没有打给浏览器, 在请求转发时这些数据将会被清空
**在请求转发之前, 如果response缓冲区写入了数据并且打给了浏览器, 请求转发失败抛出异常!
实例:response.flushBuffer();//把缓冲区里的数据首先刷新给浏览器,此时服务器就会报错(因为一次响应,形成了两次应答,与实际不符)
**请求转发就像方法的调用, 在转发代码之后的代码将会在转发结束后继续执行
**不能多次转发, 但是可以多重转发
protectedvoid doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Demo1...receive..");
//获取一个调度器
//response.flushBuffer();
response.getWriter().write("demo1give your beer");
RequestDispatcherrd = request.getRequestDispatcher("/Request2");
//实现请求的转发
rd.forward(request,response);
System.out.println("demo1...finish");
}
protectedvoid doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo2....receive");
response.getWriter().write("demo2give your beer");
System.out.println("demo2...finish");
}
2.5实现请求的包含
所谓的请求包含指的是服务器内部实现资源合并的效果
如果浏览器请求ServletA, 在A的内部可以通过
request.getRequestDispatcher("B的虚拟路径").include(request, response);将ServletB包含进来, 这时将由A和B共
protectedvoid doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Demo3...receive...");
response.getWriter().write("Demo3...onebeer");
//首先要获取一个调度器,实现请求的包含
request.getRequestDispatcher("/Request4").include(request,response);
}
protectedvoid doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Demo4...receive...");
response.getWriter().write("Demo4...twobeer");
}
2.6.作为域对象来使用
域对象: 一个对象具有可以被看见的范围, 利用这个对象身上的map就可以实现资源的共享, 像这样的对象就称之为域对象
setAttribute(Stringname, Object valObj);
getAttribute(Stringname);
removeAttribute(Stringname);
getAttributeNames();
生命周期: 一次请求开始, 到一次请求结束
作用范围: 在整个请求链上都可以看见
主要功能: 在转发时带数据到目的地
request作用域功能:
案例:
publicclass RequestDemo5 extends HttpServlet {
protectedvoid doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取属性
Stringusername = request.getParameter("username");
//往request作用域里存入属性
request.setAttribute("name",username);
//转发
request.getRequestDispatcher("/index.jsp").forward(request,response);
}
Index.jsp代码:
name=<%=request.getAttribute("name")%>