• Servlet 中,out.print()与out.write()的区别


    最近刚学习了Ajax,其中有通过$.getJSON的实现方式

    由于前后端传递值的时候会通过流的方式进行传递,这就不得不涉及到这方面的知识了

    PrintWrite out=response.getWrite;

    而流输出的时候有两种方法

    out.write()和out.print()

    out.write()是字节输出流的方法 
    out.print()是字符输出流的方法 
    一、区别 
    1.

    print方法是子类JspWriter,write是Writer类中定义的方法; 
    2.

    write():仅支持输出字符类型数据,字符、字符数组、字符串等

    print():可以将各种类型(包括Object)的数据通过默认编码转换成bytes字节形式,这些字节都通过write(int c)方法被输出

    3.

    JspWriter类型的out对象使用print方法和write方法都可以输出字符串,但是,如果字符串对象的值为null时,print方法将输出内容为“null”的字符串,而write方法则是抛出NullPointerException异常。

    二、用法

    详见https://blog.csdn.net/workinghardboy/article/details/80556735(为防止对方突然删除了....所以下方copy一份)

    因此传输数据时,write,print都可以使用

    1.PrintWriter可以直接调用write()或print()方法,把字符串作为参数写入,这样就可以写入json格式的数据了。如:

    PrintWriter out = response.getWriter();
    String info = gson.toJson(arraylistUsers);
    out.write(info);


    通过这种方式,客户端就可以接受到数据了。客户端读取数据有多种方式,可以通过ajax读,也可以通过GetPostUtil来读取返回的数据。

    package com.example.newsweb.activity;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.List;
    import java.util.Map;
    
    public class GetPostUtil
    {
    
    public static String sendGet(String url, String params)
    {
    String result = "";
    BufferedReader in = null;
    try
    {
    String urlName = url + "?" + params;
    URL realUrl = new URL(urlName);
    // 打开和URL之间的连接
    URLConnection conn = realUrl.openConnection();
    // 设置通用的请求属性
    conn.setRequestProperty("accept", "*/*");
    conn.setRequestProperty("connection", "Keep-Alive");
    conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
    // 建立实际的连接
    conn.connect();
    // 获取所有响应头字段
    Map<String, List<String>> map = conn.getHeaderFields();
    // 遍历所有的响应头字段
    for (String key : map.keySet())
    {
    // System.out.println(key + "--->" + map.get(key));
    }
    // 定义BufferedReader输入流来读取URL的响应
    in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String line;
    while ((line = in.readLine()) != null)
    {
    result += line;
    }
    }
    catch (Exception e)
    {
    System.out.println("发送GET请求出现异常!" + e);
    e.printStackTrace();
    }
    // 使用finally块来关闭输入流
    finally
    {
    try
    {
    if (in != null)
    {
    in.close();
    }
    }
    catch (IOException ex)
    {
    ex.printStackTrace();
    }
    }
    return result;
    }
    
    /**
    * 向指定URL发送POST方法的请求
    * 
    * @param url
    * 发送请求的URL
    * @param params
    * 请求参数,请求参数应该是name1=value1&name2=value2的形式。
    * @return URL所代表远程资源的响应
    */
    public static String sendPost(String url, String params)
    {
    PrintWriter out = null;
    BufferedReader in = null;
    String result = "";
    try
    {
    URL realUrl = new URL(url);
    // 打开和URL之间的连接
    URLConnection conn = realUrl.openConnection();
    // 设置通用的请求属性
    conn.setRequestProperty("accept", "*/*");
    conn.setRequestProperty("connection", "Keep-Alive");
    conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
    // 发送POST请求必须设置如下两行
    conn.setDoOutput(true);
    conn.setDoInput(true);
    // 获取URLConnection对象对应的输出流
    out = new PrintWriter(conn.getOutputStream());
    // 发送请求参数
    out.print(params);
    // flush输出流的缓冲
    out.flush();
    // 定义BufferedReader输入流来读取URL的响应
    in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String line;
    while ((line = in.readLine()) != null)
    {
    result += "
    " + line;
    }
    }
    catch (Exception e)
    {
    System.out.println("发送POST请求出现异常!" + e);
    e.printStackTrace();
    }
    // 使用finally块来关闭输出流、输入流
    finally
    {
    try
    {
    if (out != null)
    {
    out.close();
    }
    if (in != null)
    {
    in.close();
    }
    }
    catch (IOException ex)
    {
    ex.printStackTrace();
    }
    }
    return result;
    }
    }

    2.print方法和write方法是有区别的,最大的区别就是上述提到的,print可以写入对象,而write不行。

    3.print和write都可以写入html代码,来进行页面的跳转,并在一段时间后跳回到原来的页面,以此来达到提醒的作用。如:

    PrintWriter out = response.getWriter();
    out.println("<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">");
    out.println("<HTML>");
    out.println(" <HEAD><TITLE>登录出错</TITLE>");
    out.println("<meta http-equiv="refresh" charset='utf-8' content="3;url=" + truePath + "">");
    out.println("</HEAD>");
    out.println(" <BODY>");
    out.print("<div align="center">");
    out.print("您输入的书名不存在或书名有错误,请重试");
    out.print("</div>");
    out.println(" </BODY>");
    out.println("</HTML>");
    // flush()表示强制将缓冲区中的数据发送出去,不必等到缓冲区满
    out.flush();
    out.close();


    效果如图:

    4.PrintWriter不能PrintWriter  out = new PrintWriter(),因为这样,out不能找到输出的对象,导致输出失败。

    5.out.flush()表示强制将缓冲区中的数据发送出去,不必等到缓冲区满。所以一般先flush()再close(),否则容易导致数据丢失

  • 相关阅读:
    fibonacci封闭公式及矩阵连乘
    fibonacci封闭公式
    fibonacci高精度加法
    fibonacci数列的和取余(1)
    fibonacci数列的和取余(2)
    [html][javascript]父子窗体传值
    [转]父子页面之间跨域通信的方法
    [转]批处理遍历文件夹生成 html 文件
    [原]DataGridView 回车不换行代码 AND 编辑时的字符控制
    [转]身份证从 15 >> 18
  • 原文地址:https://www.cnblogs.com/wcxcc/p/10693438.html
Copyright © 2020-2023  润新知