后台(11)——Servlet(3)

探索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–滑动冲突的产生及其处理


版权声明



在前几篇博客中我们已经对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 {
    @Override
    protected 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");
    }

    @Override
    protected 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{

    @Override
    protected 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();
    }

    @Override
    protected 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 {
    @Override
    protected 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();
    }

    @Override
    protected 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()关闭该流对象,如果已经关闭则不作处理
时间: 2024-12-02 08:04:28

后台(11)——Servlet(3)的相关文章

ajaxFileUpload后台的servlet取不到值

问题描述 ajaxFileUpload后台的servlet取不到值 解决方案 你设置断点确定进了doPost吗? 是不是web.xml里面没有做servlet的配置?

后台(09)——Servlet(1)

探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View

后台(10)——Servlet(2)

探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View

后台(28)——文件下载

探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View

实例讲解Servlet的图象处理

我们在处理数据时,有时希望能用图象直观的表述,在这里有一个巧方法,能方便快捷的实现一些简单的图形(不能称之图象),比如条形图,我们不必去用 java来生成并显示图象,(java生成图象很慢),我们可以这样来作,先用作图工具作一个很小的你需要的图片,再根据你所处理的数据量来实时的加长它,就可以得到所要表述的图例.比如我们在数据库中得到了一组数据,我们从中找出最大的那一个,按比列设定其标签的长度,其它的数据图形则可与它相比,得到的长度,这样,一个简简单单的条形图就出来.但有时一些简单的图形已经不能解

Java技巧:实例讲解Servlet的图象处理

servlet|技巧 我们在处理数据时,有时希望能用图象直观的表述,在这里有一个巧方法,能方便快捷的实现一些简单的图形(不能称之图象),比如条形图,我们不必去用 java来生成并显示图象,(java生成图象很慢),我们可以这样来作,先用作图工具作一个很小的你需要的图片,再根据你所处理的数据量来实时的加长它,就可以得到所要表述的图例.比如我们在数据库中得到了一组数据,我们从中找出最大的那一个,按比列设定其标签的长度,其它的数据图形则可与它相比,得到的长度,这样,一个简简单单的条形图就出来.但有时一

可以自动跳转到出错页面的servlet/jsp框架

js|servlet|页面|自动跳转 jsp有一个指令可以定义jsp的错误页面,并在此jsp页面出错时跳转到该页面输出出错日志.如下的例子:<%@ page errorPage="errorPage.jsp" %>errorPage.jsp的代码如下所示:.....<%@ page isErrorPage="true" %>....//输出出错日志<%= exception.getMessage() %> 但是,这只能在jsp页面

我自己用java写好了后台,现在APP那边叫我提供接口。

问题描述 我自己用java写好了后台,现在APP那边叫我提供接口. 我怎么提供? 纠结死了 可以在我自己的后台程序里写接口提供(可以的话,给个例子),还是另外搭一个程序专门提供啊? 解决方案 接口就是 比如servlet 你把你的地址给他就行了,比如图片中的就是接口地址,本地测试加上你的ip 解决方案二: 你把参数传给他就行了,,, 解决方案三: 接口其实就是告诉人家需要给你传什么参数,用什么格式传,如果是web应用的话,就是告诉他你的servlet访问地址,以及需要哪些参数,一般是通过url的

spring-我要实现在前端提交数值到后台,然后进行相应数据的修改controller文件怎样写?

问题描述 我要实现在前端提交数值到后台,然后进行相应数据的修改controller文件怎样写? 我要实现在前端提交数值到后台,后台怎么获取前端提交的值然后进行相应数据的修改,应该用什么方法,controller文件怎样写? 解决方案 //用js传值:例如: function text(){ String name=document.getelementById(""name""); location.href=""servlet?name=&qu