使用Servlet发送服务器端响应信息

  Servlet API中定义一个专门的接口类javax.servlet.http.HttpServletResponse用于创建HTTP响应,包括HTTP协议的状态行、响应头以及消息体;

HTTP响应示例

设置响应状态行

  - 状态行分为HTTP协议、状态码和状态描述三个部分

  - 状态描述与状态码直接相关

  - HTTP协议由服务器确定

  - 通过设置状态码来实现许多重要功能(可以把用户重定向到另一个网站,可以指示附加的文档是图片、PDF或HTML……)

HTTP状态码:

  100-199:表示信息性代码,标示客户端应该采取的其他动作,请求正在进行。

  200-299:表示客户请求成功。

  300-399:表示用于已经移走的资源文件,指示新的地址。

  400-499:表示由客户端引发的错误。

  500-599:表示由服务器端引发的错误。

设置状态码

  - 使用HttpServletResponse的setStatus()方法

//setStatus方法的参数是一个整数 

//使用HttpServletResponse中的常量

setStatus(HttpServletResponse.SC_NOT_FOUND );

  - 设置状态代码返回描述信息

response设置状态码为404

未找到文件web服务器返回404应答

HTTP的响应信息是由状态行、响应头、空行和消息体(内容文档)按照次序组成并以流的方式向浏览器发送的。

HTTP响应信息按次序组成并向浏览器发送数据流

提示:在Servlet规范中没有规定Servlet必须缓存消息体,因而要在使用PrintWriter输出消息体前设置状态码。

HttpServletResponse为两种常见的情形提供了专用的方法:

  - sendError方法

  public void sendError(int code,String message)

  该方法生成一个404应答,同时生成一个简短的HTML错误信息文档发生给客户。

  response.sendError(404,"路径错误");

sendError结果示意图

  -sendRedirect方法

  Public void sendRedirect(String url)

  该方法生成一个302应答,同时在Location头中指示新文档的URL路径(类似a标签跳转效果,会产生两次请求和响应)。

设置响应头

  HttpServletResponse对象用于操纵响应的HTTP头

  - containsHeader(String name):返回一个布尔值,指示是否设置了指定的响应头。

  - setHeader(String name,String value):用一个给定的名称和字符串设置响应头的通用方式。如果响应头已经被设置,新的值将覆盖当前的值。在设置值之前可以用containsHeader判断头是否存在;

  - setIntHeader(String name,int value):用一个给定的名称和整型值设置响应头。如果响应头已经被设置,新的值将覆盖当前的值。在设置值之前可以用containsHeader判断头是否存在;

  - setDateHeader(String name,long date): 用一个给定的名称和日期值设置响应头。这里的日期值应该是反映自1970-1-1日(GMT)以来的精确到毫秒的长整型。如果响应头已经被设置,新的值将覆盖当前的值。在设置值之前可以用containsHeader判断头是否存在;

  - addHeader(String name,String value):在response中添加一个给定名称和字符串值的响应头,而不管是否已经存放在同名的响应头。该方法允许响应头有多个值。

  - addIntHeader(String name,intvalue):在response中添加一个给定名称和整型值的响应头。该方法允许响应头有多个值。

  - addDateHeader(String name,long value):在response中添加一个给定名称和日期值设置响应头。这里的日期值应该是反映自1970-1-1日(GMT)以来的精确到毫秒的长整型。该方法允许响应头有多个值。

  - setContentType(String mimeType):用于设置返回给客户端内容内容的MIME类型。

  - addCookie(Cookie cookie):用于向set-Cookie插入一个Cookie。由于在HTTP响应中会存在多个Set-Cookie行,所以没有对应的setCookie方法。

目的用于告诉客户端

  - 发送回来的内容的类型

  - 有多少内容正被发送

  - 发送内容的服务器的类型

设置响应消息体

  - HttpServletResponse对象负责将信息返回给客户端

  - HttpServletResponse对象只产生一个空的HTTP响应

  - 传回自定义的内容需要使用getWriter()或者getOutputStream()方法

  - getWriter()传送普通文本

  - getOutputStream()传送二进制内容

传递文本流

  getWriter()方法用于得到一个输出流

PrintWriter out = response.getWriter();

//与写HTML一样,不过需要println和print方法去拼写

out.println("<html>");

out.println("<head>");

out.println("<title>Hello World!</title>”);

out.println("</html>");

out.println("</head>");

传递二进制流

  getOutputStream()方法可以对发送到客户端的信息进行更多控制

  该方法返回javax.servlet. ServletOutputStream对象

  ServletOutputStream允许开发者写原始字节

  OutputStream比使用PrinterWriter发送文本效率更高

  可以动态地创建任何形式的数字内容


package com.java.downLoad;



import java.io.IOException;


import java.io.InputStream;



import javax.servlet.ServletContext;


import javax.servlet.ServletException;


import javax.servlet.ServletOutputStream;


import javax.servlet.http.HttpServlet;


import javax.servlet.http.HttpServletRequest;


import javax.servlet.http.HttpServletResponse;



/**


* Servlet implementation class DownLaod


*/


public class DownLaod extends HttpServlet {


private static final long serialVersionUID = 1L;



protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

  doPost(request, response);

}


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


    //获取文件名字


    String filename = request.getParameter("filename");


    //设置文件MIME类型


    ServletContext sc = this.getServletContext();


    response.setContentType(sc.getMimeType(filename));


//设置Content-Disposition,名字为当前时间毫秒数


InputStream fiels = null;


response.setHeader("Content-Disposition", "attachment;filename="+System.currentTimeMillis());


    //获取文件并且转化为流


fiels = sc.getResourceAsStream("/downLoad/"+filename);


    //传输流


    ServletOutputStream out = response.getOutputStream();


    byte[] buf = new byte[1024];


    int length = 0;


    while((length=fiels.read(buf))!=-1){


      out.write(buf, 0 ,length);


    }


    //关闭流


    if(out!=null){


      out.close();


      out.flush();


    }


    if(fiels!=null){


      fiels.close();


    }


  }


}

设置请求重定向

  - 可以选择别的服务器端程序来处理请求

  - 把请求重定向到一个完全不同的URL上

重定向原理

浏览器发送HTTP请求

Servlet把302响应码和Location响应头发送给客户端和浏览器

浏览器根据Location头中新的URL重新发出HTTP请求

设置自动刷新和等待页

  - 在指定时间内自动刷新当前页或到一个新的页面

  - 根据时间来控制响应

  - 想在响应中有一个短时间的暂停

response.setHeader("Refresh", "time; URL=url" );

JavaWeb总结(四)的更多相关文章

  1. JavaWeb总结(四)—JSP深入解析

    一.JSP域对象 1.JSP属性范围(域对象范围) JSP提供了四个域对象,分别是pageContext.request.session.application. pageContext: 属性范围仅 ...

  2. JavaWeb 后端 <四> 之 Cookie HttpSession 学习笔记

    一.会话管理概述 1.什么是会话? 好比一次通话.打开浏览器,点击多次链接(发出多次请求和收到多次的响应),关闭浏览器,这个过程就是一次会话. 有功能 可以  文件 新建会话 2.解决的问题是什么? ...

  3. JavaWeb(四)JDBC操作Oracle

    JDBC:Java DataBase Connectivity(java数据库连接) SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC. jdbc是一套标准, ...

  4. JavaWeb(四)EL表达式

    前言 前面详细的说明了什么是JSP和它的一些元素,这篇给大家介绍一下的是EL表达式. 用EL表达式,能更好的使用JSP中的各种内置对象和作用域. 楼主作为大四狗马上要出去面试了,内心很紧张!!! 一. ...

  5. JavaWeb学习 (四)————Http协议

    一.什么是HTTP协议 HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的 ...

  6. JavaWeb(四)Servlet-1

    1.Servlet 简介 Java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中.Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet ...

  7. javaweb笔记四

    得到表单数据:1.String str = request.getParameter(String)//根据表单名得到表单值,如果是多个同名的键值,返回第一个值.2.String[] str= req ...

  8. java学习笔记-JavaWeb篇四

    86 文件上传基础 87 使用 fileupload 组件 88 文件上传案例_需求 89 文件上传案例_JS代码 90 文件上传案例_约束的可配置性 91 文件上传案例_总体步骤分析 92 文件上传 ...

  9. javaweb总结(四十)——编写自己的JDBC框架

    一.元数据介绍 元数据指的是"数据库"."表"."列"的定义信息. 1.1.DataBaseMetaData元数据 Connection.g ...

  10. javaweb(十四)——JSP原理

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

随机推荐

  1. 记开发个人图书收藏清单小程序开发(十)DB开发——新增图书信息

    昨晚完成了Web端新增图书信息的功能,现在就差DB的具体实现了. 因为我把Book相关的信息拆分的比较多,所以更新有点小麻烦. 首先,我需要创建一个Book Type的Matter: 然后,将图片路径 ...

  2. unbind() 移除事件内处理方法

    实例: 移除所有 p 元素的事件处理器: $("button").click(function(){ $("p").unbind(); }); 定义和用法: u ...

  3. 转: c# 字符串公式计算

    C# 自动计算字符串公式的值(三种方式) 从网络上找到这段源码,重新整理后测试通过. 有三种方式可自动计算字符串公式的值:1. 最简单的方式,由SQL语句计算2. 使用Microsoft.Javasc ...

  4. 动态将彩色图片动画过渡到黑白图片的BlackAndWhiteView

    动态将彩色图片动画过渡到黑白图片的BlackAndWhiteView 效果如下: BlackAndWhiteView.h 与 BlackAndWhiteView.m // // BlackAndWhi ...

  5. Entity Framework的基本操作

    一.使用基本的方法进行增删改查             二.使用状态进行增删改查,即使用基类对象进行操作                         三.多个表同时进行添加 添加数据后获取自动增长 ...

  6. centos7.4应用之KVM

    最小安装系统: 参考博客:https://www.cnblogs.com/chenjiahe/p/5911965.html 辅助命令 yum install make bison flex autom ...

  7. java StringBuilder案例

    实现输出字符串的长度,容量(容量不够则扩容),及内容 import java.util.Arrays; public class MyStringBuilderDemo { //任务:存储字符串并输出 ...

  8. spring中MessageSource的配置使用方法2--ReloadableResourceBundleMessageSource【转】

    本文转载仅供自己学习收录,不做任何商业用途,如有需要可访问原地址:http://blog.csdn.net/qyf_5445/article/details/8124362 如何在spring mvc ...

  9. Python全栈开发:list 、tuple以及dict的总结

    总结: 列表:增:append(),inset(),extend() 删:pop(),remove(),clear(),del 改:a.通过指定元素和切片重新赋值.b.可以使用repelace替换列表 ...

  10. 微信小程序的开发(一)

    我现在在学习,微信小程序开发,刚刚看看一篇对我特别有用的博客文章,我就把摘抄过来了,好好的学习一下. 序言 开始开发应用号之前,先看看官方公布的「小程序」教程吧!(以下内容来自微信官方公布的「小程序」 ...