JaveWeb-ServletResponse对象

response响应过程

在去发送一个请求时, 会找到tomcat引擎,引擎会找到对应的web应用,并且会创建request对象和response对象,找到应用后, 会执行应用的web.xml再去根据url-patten的内容创建Servlet对象,并且会调用Servlet对象的service方法,并且把创建的request对象和response对象传入到方法当中,拿到response对象后, 自己可以往响应当中写入一些自己给客户端的内容,通过response.getwrite().wirte(“写的内容”)方法进行写入,写的内容,是存到一个response缓冲区当中,当方法执行结束之后, tomcat就会从response缓冲区当中取出数据,取出你的数据同时,它自己还会自动的往里面添加一些服务器相关的信息进去,所以响应给浏览器时, 可以看到除了自己写的内容, 还会有一些服务器相关的信息。

设置响应行

response.setState(Int code);

设置响应头

  • add
    add代表添加新的内容
addHeader(String name,String value);
addIntHeader(String name,int value);
addDateHeader(String name,date);
  • set
    set代表设置,已经存在的内容
setHeader(String name,String value);
setIntHeader(String name,int value);
setDateHeader(String name,Date value);

重定向

  • 什么是重定向
    到服务器当中去找servlet1,servlet1当中没有这个资源,告诉你去找servlet2,再去发送一个请求到servlet2.

  • 状态码
    302

  • 特点
    1.要访问两次服务器,第一次访问是人为的去访问,第二次是自动的访问。
    2.浏览器地址栏已经发生变化。

  • 设置重定向
    1.设置响应码

 response.setStatus(302);

2.设置响应头

response.setHeader("location","/Hello");
  • 封装的重写向
    每次都要写状态码,和location比较麻烦,就给封装了一个方法。
response.sendRedirect("/Hello");
  • 定时刷新重定向,在HTTP协议中,定义了一个Refresh头字段,可以通知浏览器在指定的时间内自动刷新并跳转到其它页面。
response.setHeader("refresh","5;url=http://www.baidu.com")

自动刷新

response.setHeader("refresh","3");

设置响应体

  • 通过write方法来写
    response.getwrite().wirte(“要写的内容”),默认情况下写的中文内容会乱码。
    把写的内容存到缓存区中使用的是ISO8859,ISO8859不支持中文,所以会乱码。
    在存之前设置可以设置存放的编码,浏览器一般默认编码格式为GB2312,告知浏览器使用的是utf-8编码
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type", "text/html;charset=UTF-8");

使用封装写法

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

tomcat看到设置了为utf-8的编码,它在存在的时候也会使用utf-8的编码。

例子:

@WebServlet("/Servlet2")
public class Servlet2 extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.write("浏览器");
    }
}
  • 通过OutPutStream来写
    write():一次性写一个字符
    write(buffer):一个性写多个字符
    write(buffer,0,len):一次性写指定个数的字符
@WebServlet(  "/Servlet5")
public class Servlet5 extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getOutputStream().write("output".getBytes());
    }
}

response响应图片在浏览器

@WebServlet( "/Servlet5")
public class Servlet5 extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        String realPath = servletContext.getRealPath("/img/1.jpg");
        FileInputStream inputStream = new FileInputStream(realPath);
        ServletOutputStream outputStream = response.getOutputStream();
        byte[] b = new byte[1024];
        int len ;
        while ((len = inputStream.read(b))>0){
            outputStream.write(b,0,len);
        }
    }
}

浏览器结果:
在这里插入图片描述
response注意点:
getWrite()和getOutputSteam不能同时调用

FileInputSteam

1.read方法读取一个字节

@WebServlet("/Servlet3")
public class Servlet3 extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String realPath = this.getServletContext().getRealPath("/a.txt");
        //1.把指定的文件转成二进制
        FileInputStream inputStream = new FileInputStream(realPath);
        //2.读取一个字节,读取的结果是一个int类型的assic码读到文件的结尾返回的是一个-1
        System.out.println(inputStream.read());
        System.out.println(inputStream.read());
        System.out.println(inputStream.read());
        System.out.println(inputStream.read());

    }
}

在这里插入图片描述
2.read(byte[] b)
一次读取多个字节,并存放到数组b中

@WebServlet("/Servlet4")
public class Servlet4 extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        byte[] b = new byte[1024];
        String path = this.getServletContext().getRealPath("/a.txt");
        FileInputStream inputStream = new FileInputStream(path);
        int len;
        while ((len = inputStream.read(b))>0){
            System.out.println(new String(b, 0, len));
        }
    }
}

控制台打印结果:
在这里插入图片描述

发布了25 篇原创文章 · 获赞 0 · 访问量 279

猜你喜欢

转载自blog.csdn.net/qq_42219004/article/details/105296652
今日推荐