深入学习请求响应(一)---response的应用

概述

Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象和代表响应的response对象。
request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了;要向客户机输出数据,只需要找response对象就行了。

response的继承结构

ServletResponse -- 通用的response。提供了一个响应应该具有最基本的属性和方法。
    |-HttpServletResponse -- 在ServletResponse的基础上针对于HTTP协议增加了很多强化的属性和方法。

利用response向浏览器输出一段数据

package me.zipstream.response;

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

public class OutServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
//      response.setContentType("text/html;charset=utf-8");//通知浏览器用u8来解码
//      response.getOutputStream().write("中国".getBytes("utf-8"));

        response.setCharacterEncoding("utf-8");//通知服务器以u8来编码。
        //其实上面这句话可以省略,因为只要有下面这句话,服务器就会默认使用u8来编码。
        response.setContentType("text/html; charset=utf-8");//通知浏览器以u8来解码。
        response.getWriter().write("中国");
    }

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

另外,这里需要注意的是:
对于一次请求,Response的getOutputStream()方法和getWriter()方法互斥,只能调用其一,特别注意forward后(在请求转发时)也不要违反这一规则。

利用response实现下载

package me.zipstream.response;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownServlet extends HttpServlet {

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

        response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode("机械键盘.jpg", "utf-8"));

        InputStream in = new FileInputStream(this.getServletContext().getRealPath("1.jpg"));
        OutputStream out = response.getOutputStream();

        byte[] buf = new byte[1024];
        int len = 0;

        while ((len=in.read(buf))!=-1){
            out.write(buf, 0, len);
        }

        in.close();
    }

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



    /*
     * URL编码与解码的过程
     */
/*
    public static void main(String[] args) throws Exception {
        String str = "文明开化";
        String str2 = URLEncoder.encode(str, "utf-8");
        System.out.println(str2);

        String str3 = URLDecoder.decode("%E6%96%87%E6%98%8E%E5%BC%80%E5%8C%96", "utf-8");
        System.out.println(str3);
    }
*/

}

设置响应头content-disposition为“attachment;filename=xxx.xxx”。
利用输入流将文件读取进来,再利用Response获取响应流输出。
如果文件名为中文,一定要进行URL编码,编码所用的码表必须是utf-8。

注意:
service方法返回后,服务器会自己检查Response获取的OutputStream()或者Writer()是否关闭,如果没有关闭,服务器自动帮你关闭,一般情况下不要自己关闭这两个流。

利用response实现定时刷新页面

package me.zipstream.response;

import java.io.IOException;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RefreshServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //隔1s刷新一次本页
//      response.getWriter().write(new Date().toLocaleString());
//      response.setHeader("Refresh", "1");

        //隔3s跳转到主页
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("恭喜您注册成功,3秒后回到主页...");
        response.setHeader("Refresh", "3;url=/Day04/index.jsp");
    }

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

设置响应头Refresh为一个数值,指定多少秒后刷新当前页面。
设置响应头Refresh为 3;url=/Day05/index.jsp,指定多少秒后刷新到哪个页面。
可以用来实现注册后“注册成功,3秒后跳转到主页”的功能。

另外,在HTML可以利用<meta http-equiv= "" content="">标签模拟响应头的功能。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
      <meta http-equiv="Refresh" content="3;url=/Day04/index.jsp">
  </head>

  <body>
    恭喜您注册成功,3秒后回到主页.... <br>
  </body>
</html>

利用response控制是否缓存资源

不缓存资源:
控制浏览器不要缓存(如验证码图片不缓存),设置expires为0或-1,设置Cache-Control为no-cache,Pragma为no-cache

package me.zipstream.response;

import java.io.IOException;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class NoCacheServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setIntHeader("Expires", -1);
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Pragma", "no-cache");

        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("当前时间是: " + new Date().toLocaleString());
    }

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

}

缓存资源:
即使不明确指定浏览器也会缓存资源,这种缓存没有截至日期。当在地址栏重新输入地址时会用缓存,但是当刷新或重新开浏览器访问时会重新获得资源。
如果明确指定缓存时间,浏览器缓存时会有一个截至日期,在截至日期到期之前,当在地址栏重新输入地址或重新开浏览器访问时都会用缓存,而当刷新时会重新获得资源。

package me.zipstream.response;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CacheServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setDateHeader("Expires", System.currentTimeMillis() + 1000l*3600*24*30);
        //注意这里时间的设置。后面不要都是int型的,至少有一个为long型。

        InputStream in = new FileInputStream(this.getServletContext().getRealPath("1.jpg"));
        OutputStream out = response.getOutputStream();

        byte[] buf = new byte[1024];
        int len = 0;

        while ((len=in.read(buf)) != -1){
            out.write(buf, 0, len);
        }

        in.close();
    }

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

利用response实现请求重定向

package me.zipstream.response;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RedirectServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
//      response.setStatus(302);
//      response.setHeader("Location", "/Day04/index.jsp");

        response.sendRedirect("/Day04/index.jsp");
    }

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

}

古老方法:
response.setStatus(302);
response.addHeader("Location","URL");

快捷方式:
response.sendRedirect("URL");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值