HttpServletResponse注意事项和细节和原理示意图

152 阅读2分钟

HttpServletResponse

 

HttpServletResponse 介绍

1. 每次 HTTP 请求,Tomcat 会创建一个 HttpServletResponse 对象传递给 Servlet 程序去使用

2. HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息, 如果需要设置返回给客户端的信息,通过 HttpServletResponse 对象来进行设置

 

 

HttpServletResponse 类图

 

 

向客户端返回数据方法

 

1. 字节流 getOutputStream(); 常用于下载(处理二进制数据)

2. 字符流 getWriter(); 常用于回传字符串

3. (细节:)两个流同时只能使用一个。 使用了字节流,就不能再使用字符流,反之亦然,否则就会报错

处理中文乱码问题-方案

 

 

处理中文乱码问题-方案 2

 

 

请求重定向

1. 请求重定向指:一个 web 资源收到客户端请求后,通知客户端去访问另外一个 web资源,这称之为请求重定向

请求重定向原理示意图

 

应用实例 

需 求 : 演 示 请 求 重 定 向 的 使 用 当 访 问 DownServlet 下 载 文 件 , 重 定 向 到 DownServletNew 下载文件

DownServlet Java类

public class DownServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // System.out.println("DownServlet 被调用");
        // response.setContentType("application/x-tar;charset=utf-8");
        // PrintWriter writer = response.getWriter();
        // writer.print("hi");
        // writer.flush();
        // writer.close();

        //完成了自己业务
        //发出请求重定向-> DownServletNew

        //1. sendRedirect 本质就会 返回 302 状态码 Location: /servlet/downServletNew
        //2. 因此 302和 /servlet/downServletNew 是浏览器解析,而不是服务器
        //3. 浏览器在解析 /servlet/downServletNew =>
http://localhost:8080/servlet/downServletNew

        //4. 动态获取到application context
        String contextPath = getServletContext().getContextPath();
        System.out.println("contextPath= " + contextPath);

        //response.sendRedirect("/servlet/downServletNew");

        response.sendRedirect(contextPath + "/downServletNew");

        //response.sendRedirect("http://www.baidu.com");

        //第二种重定向的写法
        // System.out.println("第二种方式重定向...");
        // response.setStatus(302); //设置http响应的状态码
        // //设置http响应的 Location: /servlet/downServletNew
        // response.setHeader("Location", "/servlet/downServletNew");


    }

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

DownServletNew.java

public class DownServletNew extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("DownServletNew 被调用");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.print("ok");
        writer.flush();
        writer.close();
    }

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

xml配置

    <servlet>
        <servlet-name>DownServlet</servlet-name>
        <servlet-class>com.servlet.response.DownServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>DownServlet</servlet-name>
        <url-pattern>/downServlet</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>DownServletNew</servlet-name>
        <servlet-class>com.servlet.response.DownServletNew</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>DownServletNew</servlet-name>
        <url-pattern>/downServletNew</url-pattern>
    </servlet-mapping>

请求重定向注意事项和细节

1. 最佳应用场景:网站迁移,比如原域名是 www.hsp.com 迁移到 www.hsp.cn ,但是百度抓取的还是原来网址.

2. 浏览器地址会发生变化,本质是两次 http 请求.

3. 不能共享 Request 域中的数据,本质是两次 http 请求,会生成两个 HttpServletRequest对象

4. 不能重定向到 /WEB-INF 下的资源

5. 可以重定向到 Web 工程以外的资源, 比如到 www.baidu.com 【在前面的案例演示】

6. 重定向有两种方式, 推荐使用第 1 种

 

 

7. 动态获取到 application context

String contextPath = getServletContext().getContextPath();

System.out.println("contextPath= " + contextPath);

response.sendRedirect(contextPath + "/downServletNew");