HttpServletRespnse 对象相关基本应用

向浏览器输出数据

getOutputStream()

    @Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setHeader("Content-Type","text/html;charset=UTF-8");
resp.getOutputStream().write("你好,aaaa".getBytes("UTF-8"));
}

或者

getWriter()

        //设置消息头,设置编码,自动刷新时间
resp.setHeader("Refresh","5");
resp.setHeader("Content-Type","text/html;charset=UTF-8");
//显示时间
resp.getWriter().write("实时时间是"+System.currentTimeMillis());
/*登录后3秒跳转可用此方法实现*/

注意事项

  1. getWriter()和getOutputStream()两个⽅法不能同时调⽤。如果同时调⽤就会出现异常。
  2. Servlet程序向ServletOutputStream或PrintWriter对象中写⼊的数据将被Servlet引擎从response⾥⾯获取,Servlet引擎将这些数据当作响应消息的正⽂,然后再与响应状态⾏和各响应头组合后输出到客户端。
  3. Servlet的serice()⽅法结束后【也就是doPost()或者doGet()结束后】,Servlet引擎将检查getWriter或getOutputStream⽅法返回的输出流对象是否已经调⽤过close⽅法,如果没有,Servlet引擎将调⽤close⽅法关闭该输出流对象。

实现文件下载

    @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//获取资源路径
String realPath = this.getServletContext().getRealPath("/download/二维码.jpg");
//读取资源
FileInputStream fileInputStream = new FileInputStream(realPath);
//获取文件名
String filename = realPath.substring(realPath.lastIndexOf("\\") + 1); //设置消息头,告知浏览器,需要下载该文件
resp.setHeader("Content-Disposition","attachment;filename="
+URLEncoder.encode(filename,"UTF-8") //设置编码,解决乱码问题
); // 将读取到的内容返回给浏览器
//按字节读取文件,输出流按字节输出文件
ServletOutputStream outputStream = resp.getOutputStream(); byte[] bytes =new byte[fileInputStream.available()]; //获取文件字节大小并设置
int len = 0;
while( ( len = fileInputStream.read(bytes)) > 0){
outputStream.write(bytes , 0 , len);
}
//关闭流
outputStream.close();
fileInputStream.close();
}

注意事项:

  1. windows系统获取文件的路径分隔符为 “ \\” 。

  2. 中文文件名需要加上设置编码,否则会出想下载到的文件名乱码。

  3. 注意最后要关闭流。

  4. 获取文件大小(字节)通过 FileInputStream 的 available() 方法获得。

    以下是通过Debug 下验证获取的文件大小与文件本身大小是否一致。

设置缓存

 //首先要明确哪些页面需要缓存。
//还是通过设置消息头,设置缓存。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置不缓存
/*resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragma", "no-cache");
resp.setDateHeader("Expires",-1);*/
//设置缓存,缓存一分钟
resp.setDateHeader("Expires",System.currentTimeMillis() + 1000 * 60);
resp.setHeader("Cache-Control","max-age");
//输出增加时间便于观察
/*配置消息头和消息编码,即可解决浏览器端乱码*/
resp.setHeader("Content-Type","text/html;charset=UTF-8");
resp.getWriter().print("你好,aaaaa");
}

通过调试模式可以查看到缓存的期限。

实现数据压缩

 @Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//压缩数据
String ss = "fsdfhsdfhuisdhfusdhfuids" +
"fsdfdsfsdfsdfdsfdafdsfhsdjfhsdjkfhkjds" +
"fdsfjdslkfjsldkfjsdlkfjsdkfsdjkff" +
"fsjdfjdsklfjdsklfjkldsfjlksdjflksdjflkds" +
"dsjfklsdjflsdjfkldsfkjsdkfjsldkfjsdlfk" +
"fdsjlkfjdslkfjsdlkfjlkasjflk";
//获取GZIP类
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
//输出数据
gzipOutputStream.write(ss.getBytes());
//GZIPOutputStream有缓存,关闭流清理缓存
gzipOutputStream.close();
//将压缩的数据取出来
byte[] bytes = byteArrayOutputStream.toByteArray();
// resp.getWriter().write(ss+"</br>"+"</br>"+"</br>");
System.out.println("原来的长度: "+ss.getBytes().length);
System.out.println("压缩后的长度: "+bytes.length);
//设置编码
resp.setHeader("Content-Encoding","gzip");
//把数据写到浏览器,让浏览器获取到压缩的数据
resp.getOutputStream().write(bytes); }

注意: 回到前面提到的 getWriter() 和 getOutputStream() 不能同时使用。

生出随机图片

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过java提供的 BufferedImage 生成一张图片
BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
//获取这张图片
Graphics graphics = image.getGraphics();
//设置图片内容,颜色
graphics.setColor(Color.white);
graphics.setFont(new Font(null,Font.BOLD,20));
//随机数字使用自定义方法
graphics.drawString(this.getNum(),0,20);
// graphics.fillRect(0,0,80,20); 不需要填充
//告知浏览器,发送的是一张图片
resp.setHeader("ContentType","jpeg");
//Java提供图⽚流给我们使⽤,这是⼀个⼯具类发送图片
ImageIO.write(image,"jpeg",resp.getOutputStream());
} private String getNum() { //自定义生成随机数字方法
Random random = new Random();
int nextInt = random.nextInt(9999999);
String num = String.valueOf(nextInt); StringBuilder stringBuffer =new StringBuilder();
//不够数字就填充
for (int i =0 ;7- num.length() > i ;i++){
stringBuffer.append("0");
}
return stringBuffer.append(num).toString();
}

注意 :是否要使用Graphics . fillRect() 方法填充, 填充是否会覆盖要显示的内容,这需要使用者自己衡量决定使用哪一种。

重定向跳转

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//重定向
resp.sendRedirect("/hello.jsp");
}

注意: jsp 页面是否放在正确的路径上。

web.xml 配置文件

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app>
<display-name>Archetype Created Web Application</display-name> <servlet>
<!--为这个Servlet去一个名字,一般是和类名一致-->
<servlet-name>demoServlet</servlet-name>
<!--Servlet的位置,有包名需要加上包名-->
<servlet-class>com.ling.demoServlet</servlet-class>
</servlet>
<servlet>
<!--为这个Servlet去一个名字,一般是和类名一致-->
<servlet-name>demoHttpServlet</servlet-name>
<!--Servlet的位置,有包名需要加上包名-->
<servlet-class>com.ling.demoHttpServlet</servlet-class>
</servlet>
<servlet>
<!--为这个Servlet去一个名字,一般是和类名一致-->
<servlet-name>downloadServlet</servlet-name>
<!--Servlet的位置,有包名需要加上包名-->
<servlet-class>com.ling.downloadServlet</servlet-class>
</servlet>
<servlet>
<!--为这个Servlet去一个名字,一般是和类名一致-->
<servlet-name>dataServlet</servlet-name>
<!--Servlet的位置,有包名需要加上包名-->
<servlet-class>com.ling.dataServlet</servlet-class>
<init-param> <param-name>fileEncoding</param-name> <param-value>UTF-8</param-value> </init-param>
</servlet>
<servlet>
<!--为这个Servlet去一个名字,一般是和类名一致-->
<servlet-name>cachedServlet</servlet-name>
<!--Servlet的位置,有包名需要加上包名-->
<servlet-class>com.ling.cachedServlet</servlet-class>
</servlet>
<servlet>
<!--为这个Servlet去一个名字,一般是和类名一致-->
<servlet-name>graphServlet</servlet-name>
<!--Servlet的位置,有包名需要加上包名-->
<servlet-class>com.ling.graphServlet</servlet-class>
</servlet> <servlet-mapping>
<!--配置映射路径-->
<servlet-name>graphServlet</servlet-name>
<url-pattern>/graphServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<!--配置映射路径-->
<servlet-name>demoHttpServlet</servlet-name>
<url-pattern>/demoHttpServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<!--配置映射路径-->
<servlet-name>demoServlet</servlet-name>
<url-pattern>/demoServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<!--配置映射路径-->
<servlet-name>downloadServlet</servlet-name>
<url-pattern>/downloadServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<!--配置映射路径-->
<servlet-name>cachedServlet</servlet-name>
<url-pattern>/cachedServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<!--配置映射路径-->
<servlet-name>dataServlet</servlet-name>
<url-pattern>/dataServlet</url-pattern>
</servlet-mapping>
</web-app>

注意: 需要设置编码时,要明确编码类型。

HttpServletRespnse 对象 相关基本应用的更多相关文章

  1. 通过runtime获取对象相关信息

    通过runtime获取对象相关信息 在这里,本人给大家提供一个runtime关于NSObject的扩展,用来显示各种NSObject中的信息,这有助于你来分析类的组成:) 先准备以下类供测试: Mod ...

  2. Object-C中动态类型对象相关操作汇总

    Object-C(以后简称OC)中有id类型,相对于明确定义类型的静态类型,称为动态类型. 使用动态类型,配合多态(不同类型拥有同名方法),动态绑定(运行时决定实际调用的方法)可以将很多判断延迟到运行 ...

  3. JS JSON对象相关

    1.多对象合并 将2个或2个以上对象(object{....})中的属性进行合并,即最后合并为一个object{.....} 解决办法:Object.assign 方法 var form = {nam ...

  4. HotSpot虚拟机对象相关内容

    一.对象的创建 1.类加载检查 普通对象的创建过程:虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化 ...

  5. Python面对对象相关知识总结

    很有一段时间没使用python了,前两天研究微信公众号使用了下python的django服务,感觉好多知识都遗忘了,毕竟之前没有深入的实践,长期不使用就忘得快.本博的主要目的就是对Python中我认为 ...

  6. JavaScript (JS)基础:BOM 浅析 (含window对象相关基本方法、属性解析)

    ① window对象(Math方法也属于window对象): window对象是JavaScript中的顶级对象,所有定义在全局作用域中的变量.函数都会变成window对象的属性和方法,window对 ...

  7. python语法学习第十天--类与对象相关的BIF、魔法方法

    一些相关的BIF: issubclass(class,classInfo)#判断是否为子类,classInfo可以为多个类的元组,其中一个是,返回true,一个类也被认为是自己的子类,object是所 ...

  8. js 事件对象相关笔记

    事件对象     event就是一个事件对象 写到我们的监听函数的括号里面 当形参来看     事件对象只有有了事件才存在,他是系统给我们自动创建的 不需要我们传递参数     事件对象是我们事件的一 ...

  9. ES6深入学习记录(二)promise对象相关

    1.Promise的含义 Promise是异步编程的一种解决方案,比传统的解决方案--回调函数和事件更合理和强大.ES6将其写进了语言标准,统一了用法,原生提供了promise对象. 所谓Promis ...

随机推荐

  1. HDU 1756 Cupid's Arrow 计算几何 判断一个点是否在多边形内

    LINK:Cupid's Arrow 前置函数 atan2 返回一个向量的幅角.范围为[Pi,-Pi) 值得注意的是 返回的是 相对于x轴正半轴的辐角. 而判断一个点是否在一个多边形内 通常有三种方法 ...

  2. Prometheus的伴侣:Grafana在centos下的搭建

    Grafana 是一款采用 go 语言编写的开源应用,主要用于监控指标数据的可视化展现,是当前最流行的时序数据展示工具,目前已经支持绝大部分常用的时序数据库.Grafana常常搭配用作Promethe ...

  3. Jenkins总结2-部署maven项目

    1. 部署Maven项目 1.1 新建项目 选择新建任务 输入任务名称,并选择构建一个Maven项目.如果你的页面没有看到“构建一个maven项目”,则需要安装Maven Integration插件. ...

  4. easyui 属性 事件 方法

    在easyui当中 属性和事件可以按照json定义的对象来使用. /*在easyui中 属性和事件的使用方法相同*/ var loginWinJson = { closed: false, closa ...

  5. "点"醒自己

    回顾: 过去的经历 从18年开始在某机构进行了测试培训,9月正式加入测试小白大军,中间也经历了半年的空窗期,入职2个月应能力不够被公司辞退,后通过培训班的朋友内推到一家软件外包公司,工作到现在. 思考 ...

  6. 《MySQL必知必会》过滤数据,数据过滤(where ,in ,null ,not)

    <MySQL必知必会>过滤数据,数据过滤 1.过滤数据 1.1 使用 where 子句 在SEL ECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤. WHERE子句在表名(FR ...

  7. 《MySQL必知必会》简介、使用

    2.MySQL简介 2.1 什么是MySQL 我们在前一-章中介绍了数据库和SQL.正如所述,数据的所有存储. 检索.管理和处理实际上是由数据库软件一 DBMS (数据库管理系统) 完成的. MySQ ...

  8. eric4 中pyqt 字符串 输入 获取

    在eric4中使用pyqt需要注意: 输入 中文 时,前面加 u ,例如: from PyQt4.QtGui import * from PyQt4.QtCore import * QMessageB ...

  9. linux命令--大小写转换命令

    1.tr命令 tr命令转换小写为大写     cat aa.txt | tr a-z A-Z 或者   cat aa.txt | tr [:lower:] [:upper:]  tr命令大写转换小写  ...

  10. 畅购商城(九):Spring Security Oauth2

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 畅购商城(一):环境搭建 畅购商 ...