JavaWeb复习巩固

第四天:请求转发 重定向 response对象

1.请求转发:资源进行跳转的一种方式
当客户端发送请求请求服务端某个资源的时候,这个资源处理不了请求,会把这个请求交给其他服务器内部的其他资源处理这个请求。
请求转发的特点:
1.浏览器只会发送一次请求
2.浏览器地址栏不会发生变化
3.请求转发的时候只能跳转到服务器内部的资源(不能跳转到服务以外的资源)

例子代码如下:

package com.swlz.response;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/response1")
public class Response1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("客户端接收到用户请求借1100元");
        //但是response1处理不了这个请求,就转发给/response2处理这个请求
        //设置数据信息(保存数据 ),可以用getAttribute("money");获取到这个数据
        request.setAttribute("money",1000);
        //response1和response2的request对象是同一个
        request.getRequestDispatcher("/response2").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}
package com.swlz.response;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/response2")
public class Response2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //response1和response2的request对象是同一个
        int money = (int)request.getAttribute("money");
        System.out.println("reponse1传过来了"+money+"元");
        System.out.println("接收到/response1请求响应1100元给客户端");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

2.重定向

重定向:也是资源跳转的一种方式

特点:

1.地址路径会发生变化

2.重定向可以跳转到其他外部资源

3.重定向会向服务器发送两次请求

例子代码如下:

package com.swlz.response;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/servletResponseDemo2")
public class ServletResponseDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("从客户端接收到了请求,但是处理不了");
        System.out.println("告诉客户端ServletResponseDemo3这个可以帮你处理,提供ServletResponseDemo3的信息给客户端");
//      重定向
//        response.setStatus(302);
//        response.setHeader("location","/servletResponseDemo3");
        response.sendRedirect("/tomcat/servletResponseDemo3");//重定向到ServletResponseDemo3这个资源下帮客户端处理请求
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}
package com.swlz.response;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/servletResponseDemo3")
public class ServletResponseDemo3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("----帮助客户端处理好请求!");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

2.重定向和请求转发的区别

  1. 转发客户端只会发送一次请求,重定向会发送两次
  2. 转发浏览器地址栏不会发送变化,重定向的时候浏览器地址栏会发送变化
  3. 转发只能跳转到服务器内部资源,重定向可以跳转到其他服务器资源

3.什么时候使用重定向 什么时候使用转发

如果跳转的两个资源直接要通过request对象去共享数据,那就只能使用转发

如果地址栏要发送变化或者要跳转到其他服务器的资源的时候,必须使用重定向

代码细节

重定向的路径前面一定要加虚拟路径 转发不需要加虚拟路径

4.Response

http协议响应消息数据

使用response设置响应(响应行,响应头和响应体)数据的方法
 
HTTP常用状态码:

200   请求处理成功

302   重定向

304   找缓存

404   请求的资源找不到

405   请求方式有问题(get请求post请求)

500   服务器内部异常

例子代码如下

package com.swlz.response;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/servletResponseDemo4")
public class ServletResponseDemo4 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//         response.setCharacterEncoding("utf-8");//设置缓冲区编码格式
//        response.setHeader("Content-Type","text/html;charset=utf-8");//然后把utf-8的数据响应到浏览器之后,
        // 浏览器在接收你传过来的数据的时候用什么编码格式打开?它不知道就会自动用操作系统的编码格式GB2312,所以也会乱码,
        // 所以要设置response.setHeader("Content-Type","text/html;charset=utf-8");
        response.setContentType("text/html;charset=utf-8");//这个是对前面两行的封装,只需要设置这一行(相当于上面两行)就可以解决乱码问题
        response.getWriter().println("aaaaa");
        response.getWriter().println("恭喜发财");//没有设置缓冲区的编码格式会有乱码存在,因为缓冲区的编码格式GBK,服务器的编码格式是UTF-8,编码变不不一样,所有乱码
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      doPost(request,response);
    }
}

今日学习总结:日子一天一天的过,事情一件一件的做,路要一步一步走争取不能错,错了也没关系,人生总会走弯路的,学习中也会有不少弯路,闯过去了,就是成功的。最后一句话:自己打败自己是最可悲的失败,自己战胜自己是最可贵的胜利。

posted @ 2021-12-14 23:47  编程玩家1号  阅读(23)  评论(0)    收藏  举报