探索Android软键盘的疑难杂症
深入探讨Android异步精髓Handler
详解Android主流框架不可或缺的基石
站在源码的肩膀上全解Scroller工作机制


Android多分辨率适配框架(1)— 核心基础
Android多分辨率适配框架(2)— 原理剖析
Android多分辨率适配框架(3)— 使用指南


自定义View系列教程00–推翻自己和过往,重学自定义View
自定义View系列教程01–常用工具介绍
自定义View系列教程02–onMeasure源码详尽分析
自定义View系列教程03–onLayout源码详尽分析
自定义View系列教程04–Draw源码分析及其实践
自定义View系列教程05–示例分析
自定义View系列教程06–详解View的Touch事件处理
自定义View系列教程07–详解ViewGroup分发Touch事件
自定义View系列教程08–滑动冲突的产生及其处理


版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

在前几篇博客中我们已经对Tomcat,Http,Servlet等方面有了简单的接触,在此基础上我们来深入学习Servlet的响应即HttpServletResponse.

Request、Response简介

Web服务器接收到客户端的http请求后会针对每一次请求创建用于代表请求的request对象以及代表响应的response对象。故,若要获取客户机提交的数据,只需要处理request对象就行;若要向客户端输出数据,只需要处理response对象即可。


HttpServletResponse的简单使用

在此以HttpSerlet为例,介绍HttpServletResponse的使用方式,请看如下示例:

/*** 本文作者:谷哥的小弟 * 博客地址:http://blog.csdn.net/lfdfhl*/
public class TestServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {response.setCharacterEncoding("GBK");response.setContentType("text/html;chartset=GBK");PrintWriter writer = response.getWriter();writer.write("佐佐木希写真全集");response.addHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Expires", "0");response.setHeader("refresh", "10;url=http://blog.csdn.net/lfdfhl");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {}
}

在这段代码中对Get请求做出响应,代码解析如下:

  • 设置将发送到客户端的响应内容的字符编码,请参见代码第9行
    在此将字符编码设置为GBK
  • 设置将发送到客户端的响应内容的类型,请参见代码第10行
    在此将内容的类型设置为text/html;chartset=GBK
  • 设置客户端不缓存,请参见代码第13-15行
  • 设置客户端在几秒钟后自动跳转,请参见代码第16行
  • 亦可利用response.setContentType()设定发送到客户端的响应内容的类型,即:

    response.setContentType(“text/html;chartset=GBK”);

  • 与此类似,也可设置重定向

    response.setStatus(302); response.setHeader(“location”,”http://blog.csdn.net/lfdfhl“);

    或者利用response.sendRedirect( )设置重定向

    response.sendRedirect(“http://blog.csdn.net/lfdfhl“);

同理,我们可用ServletOutputStream向客户端返回字节流

response.setCharacterEncoding("GBK");
response.setContentType("text/html;chartset=GBK");
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write("大泽玛利亚摄影写真".getBytes("GBK"));

HttpServletResponse返回下载文件

刚才的示例中,我们只是返回了简单的文字,现在我们来返回一张照片给客户端,请看如下示例:

/*** 本文作者:谷哥的小弟* 博客地址:http://blog.csdn.net/lfdfhl*/
package cn.com;import java.io.FileInputStream;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class TestResponsePhoto extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String path=getServletContext().getRealPath("/WEB-INF/ZXM.jpg");FileInputStream fileInputStream = new FileInputStream(path);ServletOutputStream outputStream = response.getOutputStream();int len=0;byte [] b=new byte[1024];while((len=fileInputStream.read(b))!=-1){outputStream.write(b, 0, len);}outputStream.close();fileInputStream.close();}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {}}

代码解析如下:

  • 得到文件路径,请参见代码第20行
  • 得到文件输入流,请参见代码第21行
  • 从response中获取到ServletOutputStream作为输出流,请参见代码第22行
  • 将图片返回给客户端,请参见代码第23-29行

运行后,效果如下图所示:

嗯哼,看到了吧:浏览器中显示了从服务端获取的我女朋友的照片

但是,如果想让用户下载这张照片该怎么办呢?请看如下示例:

/*** 本文作者:谷哥的小弟* 博客地址:http://blog.csdn.net/lfdfhl*/
package cn.com;import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class DownPhoto extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String path=getServletContext().getRealPath("/WEB-INF/zxm.jpg");System.out.println("-----------------> path="+path);String fileName=path.substring(path.lastIndexOf("\\")+1);fileName=URLEncoder.encode(fileName, "UTF-8");response.setHeader("content-disposition", "attachment;filename="+fileName);response.setHeader("content-type", "image/jpeg");FileInputStream fileInputStream = new FileInputStream(path);ServletOutputStream outputStream = response.getOutputStream();int len=0;byte [] b=new byte[1024];while((len=fileInputStream.read(b))!=-1){outputStream.write(b, 0, len);}outputStream.close();fileInputStream.close();}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {super.doPost(req, resp);}}

代码解析如下:

  • 获取到文件名称,请参见代码第23行
  • 设置Header指示客户端下载文件,请参见代码第24行
  • 利用Header设置响应的内容的类型

嗯哼,待用户输入地址后即可下载对应的文件。

除此以外,我们可利用画笔在内存中创作一张图片BufferedImage然后再返回给客户端;有的网站登录时的验证码正是采用该方式实现的。


HttpServletResponse的几个细节问题

  • getOutputStream()和getWriter()分别用于得到输出字节流和输出字符流的ServletOuputStream、Printwriter。但是请注意:getOutputStream()和getWriter()这两个方法互相排斥,调用了其中任意一个方法后就不能再调用另一方法;否则系统抛出异常。

  • 在Servlet中向ServletOutputStream对象或PrintWriter对象写入的数据将被Servlet引擎(如Tomcat)从response里面获取,然后Servlet引擎再将这些数据当作响应消息的正文且与响应状态行和响应头组合并输出到客户端。这也就是说:并不是response将响应消息传递给了客户端,而是Servlet引擎将响应消息封装到了response中再由Servlet引擎传递给客户端

  • Serlvet的service()结束后,Servlet引擎将检查getWriter()或getOutputStream()返回的输出流对象是否已经调用过close();如果未关闭则Servlet引擎将调用close()关闭该流对象,如果已经关闭则不作处理

后台(11)——Servlet(3)相关推荐

  1. flash在线拍照并上传到后台(servlet)

    一.flash在线拍照并上传到后台(servlet) 第一步:先新建一个ActionScript文件:ShiBieFunction.as 该文件的核心代码如下: =========使用摄像头获取视频流 ...

  2. JAVA后台Controller/servlet如何获取到从前端传来的参数

    JAVA后台Controller/servlet如何获取到从前端传来的参数 前言: 本次内容是对后台如何获取到前端传来的信息的总结: 1.前端传来数据的格式为form表单形式: 1.1 reqeust ...

  3. 1027-特色酒店后台管理系统servlet

    项目介绍 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势:对于酒店后台管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了超市,它彻底改变了过去传统的管理 ...

  4. mysql网页后台_jsp+servlet+mysql开发java web旅游网站,有后台管理系统

    项目描述 jsp+servlet开发的景点旅游网站 运行环境 jdk8+tomcat8+mysql+eclipse+maven 项目技术(必填) java servlet+mysql+jquery a ...

  5. 【收藏】JavaWeb项目详解:水果库存后台管理系统(servlet+thymeleaf+mysql)

    目录 实现功能 使用开发工具和技术 开发工具 相关依赖 数据库表格设计 创建数据库 创建表格 插入数据 代码部署 获取代码 打开项目 添加Artifacts文件 设置Tomcat信息 引入依赖 运行项 ...

  6. 后台(12)——Servlet(4)

    探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架 ...

  7. Servlet之前端web数据与后台Java数据进行交互

    前端web数据传到后台数据,可以通过注解的方式,在前端的表单中的action属性里起一个名字,例如是 action = "login",那么在后台的servlet类中只需在类上面写 ...

  8. 基于 jsp+servlet+mysql 开发旅游推介网站和后台管理系统(maven项目)

    你知道的越多,你不知道的越多 点赞再看,养成习惯 如果您有疑问或者见解,或者没有积分想获取项目,欢迎指教: 企鹅:869192208 文章目录 一. 开发背景 二. 需求分析 三.开发环境 四.运行效 ...

  9. 请求servlet操作成功后,在JSP页面弹出提示框

    应用环境: 点击前台页面,执行某些操作.后台action/servlet 执行后,返回处理结果(成功.失败.原因.状态等)信息.在前台jsp进行弹窗显示,alert(); 后台处理代码:(把要提示的数 ...

最新文章

  1. 程序员才懂的“凡尔赛语录”
  2. 【BLE】蓝牙模块V1.0
  3. Java Review - SimpleDateFormat线程不安全原因的源码分析及解决办法
  4. sqlserver大数据归档
  5. OpenCV向Facemark API添加新算法
  6. 剑指 Offer 28. 对称的二叉树【无取巧,易于理解!】
  7. 数组和集合的相互转换
  8. 数据处理不等式:Data Processing Inequality
  9. mysql中用来取余数的函数是_MySQL常用函数-单行处理函数-字符串处理函数(更新中...)...
  10. python telnet登录发送命令_Telnet发送命令,然后读取响应
  11. 在Ubuntu1404的64bit版本下安装caffe
  12. Android设计模式——抽象工厂方法模式
  13. Web API-排他思想及其案例
  14. 基于DEAP库的NSGA2代码详解
  15. C/C++:构建你自己的插件框架(1)
  16. 哲学中的推理规则 —— 《自然哲学之数学原理》
  17. CF#446 Gluttony(思维题)
  18. 今日分享——《青春》(李大钊)
  19. python中批量将矩形图片转化为正方形图片,并且缩放
  20. element适配svg格式图片

热门文章

  1. 利用Python进行数据分析笔记-pandas建模(Patsy篇)
  2. python大学生信息管理系统_基于Python的高等学校社团信息管理系统
  3. Basic Authorization 认证方法
  4. @Autowired(required=true)
  5. oracle 中的 NVL2() 函数
  6. 没什么,国内做任何大项目,不外乎人情.技术是次要的
  7. Keras loss函数
  8. 英语长难句之非谓语动词作状语与独立主格-学习笔记
  9. 前端视频预览功能的实现
  10. 鲁棒性、泛化的解释和区别