Response

1.HttpServletResponse对象
在Servlet API中,定义了一个HttpServletResponse接口,它继承自ServletResponse接口,专门用来封装HTTP响应消息。由于HTTP响应消息分为状态行、响应消息头、消息体三部分,因此,在HttpServletResponse接口中定义了向客户端发送响应状态码、响应消息头、响应消息体的方法。

2.发送状态码相关的方法
当Servlet向客户端回送响应消息时,需要在响应消息中设置状态码。为此,在HttpServletResponse接口中,定义了两个发送状态码的方法,具体如下。

setStatus(int status)方法
该方法用于设置HTTP响应消息的状态码,并生成响应状态行。由于响应状态行中的状态描述信息直接与状态码相关,而HTTP版本由服务器确定,因此,只要通过setStatus(int status)方法设置了状态码,即可实现状态行的发送。需要注意的是,正常情况下,Web服务器会默认产生一个状态码为200的状态行。

@WebServlet(urlPatterns = "/state")
public class StateServlet extends HttpServlet {
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    doGet(request, response);
 }
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    response.setStatus(404);
 }
}

3.发送响应消息头相关的方法
当Servlet向客户端发送响应消息时,由于HTTP协议的响应头字段有很多种,为此,在HttpServletResponse接口中,定义了一系列设置HTTP响应头字段的方法。
在这里插入图片描述
需要注意的是,在列举的一系列方法中,addHeader()、setHeader()、addIntHeader()、setIntHeader()方法都是
用于设置各种头字段的,而setContetType() 和setCharacterEncoding()方法用于设置字符编码,这些设置字符编码的方法可以有效解决乱码问题。

package hm04_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;
import java.util.Date;

@WebServlet(urlPatterns = "/head")
public class HeadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
    /*

      添加头信息 : addHeader(key, value) , 添加头信息键值对,  键可以重复.


      设置头信息: setHeader(key,value) , 设置头信息键值对, 键唯一的. 键重复时, 后面值覆盖前面的值.

      =========================

      了解 : setIntHeader  setDateHeader ,几乎不会调用 ,因为 字符串类型可以替代.
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

            // 添加 头信息
//        response.addHeader("name" , "tom");
//        response.addHeader("name" , "tom");
//        response.addHeader("name" , "tom");


        // 设置头信息
        response.setHeader("name" , "tom");
        response.setHeader("name" , "tom");
        response.setHeader("name" , "tom");
        response.setHeader("name" , "tommy");
        response.setHeader("Date" , new Date().toString());





    }
}
package hm04_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;
import java.util.Date;

@WebServlet(urlPatterns = "/head2")
public class Head2Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
    /*

      添加头信息 : addHeader(key, value) , 添加头信息键值对,  键可以重复.


      设置头信息: setHeader(key,value) , 设置头信息键值对, 键唯一的. 键重复时, 后面值覆盖前面的值.

      =========================

      了解 : setIntHeader  setDateHeader ,几乎不会调用 ,因为 字符串类型可以替代.
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


        // 测试 自动跳转 :
        // 格式 : "时间(秒); URL=地址"
        response.setHeader("Refresh","5; URL=https://www.baidu.com");

        response.getWriter().println("5 秒 自动跳转到 baidu.com");


    }
}

4.解决中文输出乱码问题
在开发中,如果需要响应给浏览器中文数据,我们需要使用getWriter()方法,tomcat使用getWriter()处理字符时,默认编码时ISO8859-1。响应给浏览器的数据,此时为乱码。在开发中我们需要使用setCharacterEncoding方法来设置编码。此时响应给浏览器的数据为正常数据,但浏览器查看编码,可能使我们查看到内容仍为乱码,需要使用响应头 content-type进行设置。
在HttpServletResponse对象中,提供了两种解决乱码的方案,具体如下:
第一种方式:

// 设置HttpServletResponse使用utf-8编码,此数据提供给tomcat使用。
response.setCharacterEncoding("utf-8");
// 通知浏览器查看编码为utf-8
response.setHeader("Content-Type","text/html;charset=utf-8");

第二种方式:
使用通用方法,setContentType底层自动调用了setCharacterEncoding

response.setContentType("text/html;charset=utf-8");

5.发送响应消息体相关的方法
由于在HTTP响应消息中,大量的数据都是通过响应消息体传递的,因此,ServletResponse遵循以IO流传递大量数据的设计理念。在发送响应消息体时,定义了两个与输出流相关的方法,具体如下。

getOutputStream()方法
该方法所获取的字节输出流对象为ServletOutputStream类型。由于ServletOutputStream是OutputStream的子类,它可以直接输出字节数组中的二进制数据。因此,要想输出二进制格式的响应正文,就需要使用getOutputStream()方法。

getWriter()方法
该方法所获取的字符输出流对象为PrintWriter类型。由于PrintWriter类型的对象可以直接输出字符文本内容,因此,要想输出内容全为字符文本的网页文档,需要使用getWriter()方法。

6.重定向
在这里插入图片描述
在这里插入图片描述

package hm05_redirect;

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;
/*
  重定向 :
  浏览器请求 AServlet , 由于A无法处理请求 , 将 此请求 重新定向到 BServlet ,此过程就是重定向.

  response的方法 :
  sendRedirect("路径") : 由于是重新定向 , 再次发起的请求来自于服务器外部, 所有需要添加 项目名称
                        举例 : "/web09/b"


 */
@WebServlet(urlPatterns = "/a")
public class AServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("AServlet.doGet");

        // 设置 重定向
        response.sendRedirect("/day09/b");
    }
}
package hm05_redirect;

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(urlPatterns = "/b")
public class BServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

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


       // response.getWriter().println("BBBBBBBBBBBBB");

            // 重定向 登录页面
        response.sendRedirect("/day09/login.jsp");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值