ServletResponse简介

  • ServletResponse代表浏览器输出,它提供所有HttpResponse的设置接口,可以设置HttpResponse的响应状态,响应头和响应内容。
  • 生命周期:当用户发起对一个Servlet请求的时候,Tomcat自动传输一个空Response对象给Servlet进行内容填充,Servlet处理完以后将响应的Response通过Tomcat返回给客户端浏览器,显示响应结果。
  • ServletResponse常用如下功能:
    • 输出字符流,字节流(图片,视频...)
    • 设置浏览器解析的方式:编码解析,文件下载,浏览器刷新,资源缓存方式
    • 实现请求重定向
    • 生成Cookie 回写给客户端

Http请求常用响应头

  • Content-Encoding:gzip
  • Content-Length:80
  • Content-Language:zh-cn
  • Content-Type:text/html;charset=GB2312
  • Last-Modified: Tue, Oct 1 2016
  • Refresh:1
  • Content-Disposition: attachment; filename=xxx.jpg
  • Set-Cookie: XXname=XXvalue;path=/cookieScopePath
  • Expires:-1
  • Cache-Control: no-cache
  • Pragma: no-cache
  • Connection: close/Keep-Alive
  • Date: Tue,Oct 1 2016
  • Location: http://localhost:8080/test
  • Server: apache-tomcat

设置ServletResponse编码

乱码核心原因:浏览器默认的解析格式和服务器响应流的编码格式不一致

Eclipse中设置了字符编码格式为utf-8, 而浏览器的解码格式默认和OS(中文操作系统)保持一致为GB2312,编码和解码格式不一致就会造成中文输出乱码。

1
2
3
4
5
6
7
public class ResponseCharacterEncoding extends HttpServlet {
 
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.getWriter().write("你好,让我们来看一看JavaWeb编码");
 
    }
}

可以通过以下几种方式来决定输出流编码,告知浏览器以什么码表打开服务器发送的数据,核心原理是输入输出编码一致并且涵盖了你的编码内容。如果不确定工程写入的编码格式,可以通过设置response.setCharacterEncoding("UTF-8"); 来确保编码和解码格式一致。

  1. 通过response.setHeader("Content-type","text/html;charset=UTF-8");
  2. 通过response.setContentType("UTF-8") 来设置输出的编码格式,作用同1 一样
  3. 通过response.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>") 模拟html头标签来设置输出编码格式。

添加如上内容以后,中文编码可以正常输出。

ServletResponse 实现文件下载

文件下载的本质是把服务器端的文件拷贝到客户端浏览器,和普通拷贝的流传输过程一样,不同的是Response需要单独设置浏览器的解析方式为下载:

response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));

/**
 * Response响应文件下载,下载的本质是把文件从本地拷贝给远程客户端,下载和普通文件拷贝的区别在于要设置浏览器输出选项,如下是一个文件下载的实现过程:
 * 1. 读取本地文件,转化为输出流
 * 2. 通过response传送流给浏览器,并且设置浏览器接受方式为下载
 * 3. 如果文件名是中文,则下载的名字也需要进行输出编码的转换
 *
 */
public class ResponseDownloadFiles extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{
        //获取文件流,设置文件的中文名字
        InputStream in=this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/vivian/demo/response/fatcat.jpg");
        String filename="胖猫";

        response.setContentType("text/html;charset=UTF-8");
        //设置输出文件流被浏览器解析的方式, 如果不设置文件名属性,默认取Servlet的名字
        response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));
        byte[] buffer=new byte[1024];

        while(in.read(buffer)>0){
            response.getOutputStream().write(buffer);
        }

        in.close();
    }

}

ServletResponse 控制浏览器定时刷新网页

ServletResponse 管理浏览器缓存文档内容

ServletResponse 实现重定向

JavaWeb基础:Servlet Response的更多相关文章

  1. JavaWeb基础-servlet

    Servlet简介 Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤: 1.编写一个Java类,实现s ...

  2. JavaWeb基础—Servlet

    一.Servlet是什么 是服务器上运行的Java小应用程序,并被称为JavaWeb三大组件之一 通常我们把实现了Servlet的类,称之为Servlet Servlet作用主要是 1.接收请求数据 ...

  3. Javaweb基础--->Servlet(转载)

    今天看到这篇博客,感觉还不错,拿来借鉴学习一下. 一.Servlet 是什么? Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客 ...

  4. JavaWeb基础—Servlet重要对象

    一.ServletConfig对象 当servlet配置了初始化参数后(<init-param> <param-name> <param-value>),web容器 ...

  5. JavaWeb基础总结:Servlet专题

    最近工作中有部分整改老接口的任务,大部分与Spring的拦截器,Tomcat相关,改到一些底层的代码发现,对基础J2EE的知识有些遗忘,需要频繁查阅,索性从头系统的整理一下Servlet和Filter ...

  6. JavaWeb基础: ServletContext

    基本概念 Web容器在启动时,会为每个Web应用程序都创建一个对应的ServletContext对象,它代表当前Web应用. ServletContext(javax.servlet.http.Ser ...

  7. JavaWeb基础: 学习大纲

    JavaWeb基础: Web应用和Web服务器 JavaWeb基础: Tomcat JavaWeb基础:HTTP协议和基于Restful的架构 JavaWeb基础: Web工程配置文件 JavaWeb ...

  8. JavaWeb基础知识总结

    JavaWeb基础知识总结.   1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供 ...

  9. 超详细的Java面试题总结(四 )之JavaWeb基础知识总结

    系列文章请查看: 超详细的Java面试题总结(一)之Java基础知识篇 超详细的Java面试题总结(二)之Java基础知识篇 超详细的Java面试题总结(三)之Java集合篇常见问题 超详细的Java ...

  10. 关于java基础、多线程、JavaWeb基础、数据库、SSM、Springboot技术汇总

    作者 : Stanley 罗昊 本人自行总结,纯手打,有疑问请在评论区留言 [转载请注明出处和署名,谢谢!] 一.java基础 1.多态有哪些体现形式? 重写.重载 2. Overriding的是什么 ...

随机推荐

  1. 【leetcode❤python】 290. Word Pattern

    #-*- coding: UTF-8 -*-class Solution(object):    def wordPattern(self, pattern, str):        "& ...

  2. Update与FixedUpdate区别

    以下的代码能使游戏暂停,记得要使速度*Time.deltaTime,目的是保证游戏运行在帧数不同的情况下,角色移动速度都一样,因为此时角色是按时间移动与帧数无关. using UnityEngine; ...

  3. 正则表达式(/[^0-9]/g,'')中的"/g"是什么意思 ?

    正则表达式(/[^0-9]/g,'')中的"/g"是什么意思 ?     表达式加上参数g之后,表明可以进行全局匹配,注意这里“可以”的含义.我们详细叙述: 1)对于表达式对象的e ...

  4. Django Models的数据类型

    Django中的页面管理后台 Djano中自带admin后台管理模块,可以通过web页面去管理,有点想php-admin,使用步骤: 在项目中models.py 中创建数据库表 class useri ...

  5. Scanner

    /* next()与nextLine()区别 next(): 1.一定要读取到有效字符后才可以结束输入. 2.对输入有效字符之前遇到的空白,next()方法会自动将其去掉. 3.只有输入有效字符后才将 ...

  6. c#扩展方法的理解(一:初识)

    扩展方法是静态方法,是类的一部分,但是实际上没有放在类的源代码中. 扩展方法所在的类也必须被声明为static C#只支持扩展方法,不支持扩展属性.扩展事件等. 扩展方法的第一个参数是要扩展的类型,放 ...

  7. [JAVA设计模式]第三部分:结构模式

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  8. python_way day14 HTML

    python_way day 14 HTML 一,标签 二.特殊字符 三,css <!DOCTYPE html> <html lang="en"> < ...

  9. Github上不错的Android开源代码(一)

    总有一些朋友很热心的整理一些好的资料,在收集之后,可以用作阅读.学习和实践.小伙伴们,总有一天,你也能写出 Niubility 的 Android App :-) 为了防止以上链接失效,以及部分内容丢 ...

  10. 汇编语言指令与debug命令符

    •MOV与ADD指令 汇编指令 控制CPU完成的操作 形式化语法描述 mov ax, 18 将18送入AX (AX)=18 mov   ah, 78 将78送入AH (AH)=78 add ax, 8 ...