Response对象--响应重定向

需求:用户访问AServlet后,服务器告诉浏览器重定向到BServle(BServlet可以是外网地址)

代码:AServlet

package com.lagou;

/**
 * 需求2:实现重定向的访问,即用户访问AServlet后,服务器告诉浏览器重定向到BServlet
 */

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

public class AServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //设置浏览器和服务器的编码方式
        resp.setContentType("text/html;charset=utf-8");

        //需求:实现重定向的访问,即用户访问AServlet后,服务器告诉浏览器重定向到BServlet
        //1.设置状态马:将状态码设置为302,表示重定向
        resp.setStatus(302);

        //2.设置响应头,即将重定向的地址设置在响应头中
     resp.setHeader("Location","/bServlet")  //重定向到BServlet resp.setHeader("Location","http://fanyi.youdao.com/"); //重定向到外网地址 } }

  总结:

    1. 地址栏会发生改变
    2. 重定向是二次请求
    3. 重定向是客户端(浏览器)行为,可以跳转到服务器外部资源...
    4. 不能使用request域共享数据


  PS:请求转发和请求重定向的区别

    1. 哪个对象
      转发(request对象的方法)
      request.getRequestDispatcher("/bServlet").forward(request,response);
      重定向(response对象的方法)
      response.sendRedirect("/day10_response/bServlet");
    2. 几次请求
      转发
        地址栏: 没有改变
        浏览器: 发了一次请求
        服务器: 只有一对请求和响应对象
        发生的位置: 服务器
      重定向
        地址栏: 发生了改变
        浏览器: 发了两次请求
        服务器: 有两对请求和响应对象
        发生的位置: 浏览器
    3. 小结
      写法
        转发("/servlet资源路径") 服务器内部行为
        重定向 ("/虚拟路径(项目名)/servlet资源路径") 浏览器外部行为
      使用场景(重点掌握)
        如果需要传递数据(request域),使用转发
        如果不需要传递数据(request域),使用重定向
    

   解决中文乱码问题:

 

1. 指定服务器响应编码方式
response.setCharacterEncoding("GBK");
2. 统一浏览器和服务器编码
response.setContentType("text/html;charset=utf-8");

  

posted @ 2021-01-16 16:02  咕噜_咕噜  阅读(393)  评论(0编辑  收藏  举报