Response对象及相关方法

目录

response

设置响应正文

设置响应头 

 设置状态码

 重定向


response

    response也是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletResponse。在客户端发出每个请求时,服务器都会创建一个response对象,并传入给Servlet.service()方法。response对象是用来对客户端进行响应的这说明在service()方法中使用response对象可以完成对客户端的响应工作

response对象的功能分为以下四种:

  • 设置响应正文;

  • 重定向;

  • 设置响应头信息;

  • 发送状态码;

设置响应正文

    通过response对象得到输入流,往客户端浏览器写一些内容。response一共提供了两个响应流对象:

  • PrintWriter out = response.getWriter():获取字符流;

  • ServletOutputStream out = response.getOutputStream():获取字节流;

注:在一个请求中,不能同时使用这两个流!不然会抛出IllegalStateException异常。

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Cservlet的doGet方法");
        FileInputStream fis = new FileInputStream();
        //得到响应输出流
        ServletOutputStream outputStream = resp.getOutputStream();
        int i = -1;
        while((i = fis.read())!=-1){
            outputStream.write(i);
        }
        outputStream.flush();
        outputStream.close();
    }

    在使用response.getWriter()时需要注意默认字符编码为ISO-8859-1,如果希望设置字符流的字符编码为utf-8,可以使用response.setCharaceterEncoding(“utf-8”)来设置。这样可以保证输出给客户端的字符都是使用UTF-8编码的!

但客户端浏览器并不知道响应数据是什么编码的!如果希望通知客户端使用UTF-8来解读响应数据,那么还是使用response.setContentType("text/html;charset=utf-8")方法比较好,因为这个方法不只会调用response.setCharaceterEncoding(“utf-8”),还会设置content-type响应头,客户端浏览器会使用content-type头来解读响应数据。

设置响应头 

    可以使用response对象的setHeader()方法来设置响应头!使用该方法设置的响应头最终会发送给客户端浏览器!

public void setHeader(String name, String value) throws IOException;

其中,name为响应头的名称,value为响应头的值。

例如:

response.setHeader(“content-type”, “text/html;charset=utf-8”):设置content-type响应头,该头的作用是告诉浏览器响应内容为html类型,编码为utf-8。而且同时会设置response的字符流编码为utf-8,即response.setCharaceterEncoding(“utf-8”);

response.setHeader("Refresh","5; URL=http://www.baidu.com"):5秒后自动跳转到百度主页。

 设置状态码

    在HttpServletResponse接口中,setStatus(int sc)方法用于设置HTTP响应的状态码。sc表示状态码。

    在Java Servlet API中,HttpServletResponse接口定义了一系列状态码常量。

状态码常量名称描述
200SC_OK

请求已成功,请求所希望的响应头或数据体将随此响应返回。

204SC_NO_CONTENT

请求已成功,但响应中不包含实体的主体部分。

302SC_FOUND

请求的资源临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。

304SC_NOT_MODIFIED

如果客户端发送了一个带条件的GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304响应禁止包含消息体,因此始终以消息头后的第一个空行结束。

400SC_BAD_REQUEST

服务器无法理解请求的格式,客户端不应当重复发送这个请求。

401SC_UNAUTHORIZED

请求要求用户的身份认证。

403SC_FORBIDDEN

服务器理解请求客户端的请求,但是拒绝执行此请求。

404SC_NOT_FOUND

服务器无法根据客户端的请求找到资源(网页)。通过此状态码,服务器可以告诉客户端,该服务器上根本没有这个目标资源。

500SC_INTERNAL_SERVER_ERROR

服务器内部错误,无法完成请求。

501SC_NOT_IMPLEMENTED服务器不支持请求的功能,无法完成请求。
502SC_BAD_GATEWAY作为网关或代理工作的服务器从上游服务器收到无效响应。
503SC_SERVICE_UNAVAILABLE服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。
504SC_GATEWAY_TIMEOUT作为网关或代理工作的服务器未及时从上游服务器收到请求。

 重定向

    Servlet进行资源跳转,除了request对象的请求转发,还有response的重定向。在地址栏输入url的方式就属于重定向。

方法:

void sendRedirect(String var1) throws IOException;

 重定向的特征:

  • 重定向是两次请求;

  • 重定向的URL可以是其他应用,不局限于当前应用;

  • 重定向的响应头为302,并且必须要有Location响应头;

  • 重定向就不要再使用response.getWriter()或response.getOutputStream()输出数据,不然可能会出现异常;

重定向与请求转发的区别

  • 请求转发是一个请求,而重定向是两个请求;

  • 请求转发后浏览器地址栏不会有变化,而重定向会有变化,因为重定向是两个请求;

  • 请求转发的目标只能是本应用中的资源,重定向的目标可以是其他应用;

  • 请求转发对AServlet和BServlet的请求方法是相同的,即要么都是GET,要么都是POST,因为请求转发是一个请求;

  • 重定向的第二个请求一定是GET;

  • 请求转发是在服务端内部执行的,而重定向是在客户端执行的.

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值