实现重定向

重定向的原理就是302+location, 通过设置状态码302和location响应头就可以实现重定向的效果

response.setStatus(302);

response.setHeader("Location","/Day09/index.jsp");

这两行代码等价于

response.sendRedirect("/Day09/index.jsp");

#yyds干货盘点#response的重定向和request转发_请求转发

请求的转发与重定向的区别:

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

请求转发: 实现资源的跳转, 服务器内部的跳转. 一次请求 一次响应 地址栏不会发生变化

#yyds干货盘点#response的重定向和request转发_数据_02

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();


生命周期: 一次请求开始, 到一次请求结束

作用范围: 在整个请求链上都可以看见

主要功能: 在转发时带数据到目的地

#yyds干货盘点#response的重定向和request转发_数据_03

request作用域功能:

#yyds干货盘点#response的重定向和request转发_数据_04

案例:

#yyds干货盘点#response的重定向和request转发_数据_05

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")%>