• JavaWeb总结(四)


    使用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" );

     

    我不作恶

    但有权拒绝为善

    我不赞同

    但是我捍卫你不为善的权力

  • 相关阅读:
    Java内存模型
    BigDecimal踩过的大坑
    Java开发小技巧
    多线程同步辅助工具类
    ReentrantLock中的公平锁与非公平锁
    ReentrantLock与synchronized的区别
    推荐一个Java设计模式写的很好的博客
    线程池ThreadPoolExecutor工作原理
    支付系统架构设计转载
    linux 部署脚本
  • 原文地址:https://www.cnblogs.com/HackerBlog/p/5949049.html
Copyright © 2020-2023  润新知