使用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. 通过windows powershell 修改 Office 365默认的 35MB 的邮件大小限制

    附件下载: 通过windows powershell 修改 Office 365默认的 35MB 的邮件大小限制

  2. Eclipse 控制台视图和服务器视图中停止Web服务器的差别

    Eclipse 控制台视图和服务器视图中停止Web服务器的差别 (1)console视图里面, "红色方形图标" 是terminate, 也会关闭web服务器!!!!!!!!这个, ...

  3. The operation names in the portType match the method names in the SEI or Web service implementation class.

    The Endpoint validation failed to validate due to the following errors: :: Invalid Endpoint Interfac ...

  4. MyEclipse 智能提示设置

    在实际的开发当中,编译器没有智能提示,确实是效率很低,下面我就给大家讲一下在MyEclipse中设置智能提示,方便大家的开发,希望能帮到大家. 方法一:首先,在MyEclipse的菜单栏中找到wind ...

  5. September 25th 2017 Week 39th Monday

    No man is rich enough to buy back his own past. 没有人富有到可以赎回自己的过去. Those rich are not willing to buy b ...

  6. [BZOJ 5252][LOJ 2478][九省联考2018] 林克卡特树

    [BZOJ 5252][LOJ 2478][九省联考2018] 林克卡特树 题意 给定一个 \(n\) 个点边带权的无根树, 要求切断其中恰好 \(k\) 条边再连 \(k\) 条边权为 \(0\) ...

  7. 事后诸葛亮之Alpha十天冲刺之失败总结

    参考自构建之法p341页的模板 首先自己预计了一下,项目gg的可能有百分之50这里面有百分之80是我的责任.冲刺失败我承担主要责任. 1.设想和目标: 1.计划实现类似华为云的小功能之团队合作开发功能 ...

  8. Chrome新发现

    昨晚写代码的时候惊喜的发现Chrome中能直接使用一些ES6的语法: let, const, 箭头函数等已经能直接使用. 酷酷的. 另外我的Chrome版本还是比较旧的,并不需要最新版本.

  9. 1864. [ZJOI2006]三色二叉树【树形DP】

    Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. Sample ...

  10. 【洛谷】【堆+模拟】P2278 操作系统

    from HNOI2003 [题目描述:] 写一个程序来模拟操作系统的进程调度.假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的.其中运行优先级用自然数表示,数字越大,则 ...