• java_第一年_JavaWeb(4)


    HttpServletResponse对象

    向客户端发送数据的方法:

    • 通过getOutputStream()方法得到OutputStream对象,再通过write发送
    • 通过getWriter()方法得到PrintWriter对象,再通过write发送

    发送响应头的方法:

    • addDateHeader(java.lang.String name, long data)
    • addHeader(java.lang.String name,String value)
    • addIntHeader(java.lang.String name,int value)
    • setDateHeader(java.lang.String name, long data)
    • setHeader(java.lang.String name,String value)
    • setIntHeader(java.lang.String name,int value)
    • setStatus(int sc)

    使用OutputStream流

    String data = "lzj";
    OutputStream outputStream = response.getOutputStream();
    response.setHeader("content-type","texy/html;charset = UTF-8");
    byte[] dataByteArr = data.getBytes("UTF-8");//将字符转换成字节数组,指定以UTF-8编码进行转换;
    outputStream.write(dataByteArr);

    使用PrintWriter流

    String data = "lzj";
    response.setHeaderEncoding("content-type","hext/html;charset = UTF-8");//控制响应头以UTF-8的编码显示数据。
    PrintWriter out = response.getWriter();
    out.write(data);

    比较这两种像客户端输出的方式不难发现平时使用PrintWriter向浏览器输出字符数据会比较方便,省去了转换字节的步骤;

    且需要注意的是这两种方法是相互排斥的,即调用其中一个后,就不能调用另一个了;

    在输出数据是数字时也要以字符串的方式输出:

    OutputStream.write(1);
    PrintWriter.write(1);//这两种方式都不会输出数字1到浏览器
    
    
    OutputStream.write(1+"");
    PrintWriter.write(1+"");//其中1加上一个空字符串后,数字 1就变成字符串1,可以成功输出到浏览器中;

    使用Response实现文件下载

    在编写文件下载功能时,最好使用OutputStream流,因为OutputStream流是转化为字节流,可以处理任何类型的数据,而PrintWriter流是字符流,只能处理字符类型数据,如处理字节类型数据容易导致数据丢失;

    实现文件下载的步骤:

    • 获取下载文件的绝对路径
    • 获取下载的文件名
    • 设置content-disposition响应头控制浏览器以下载的方式打开文件
    • 获取要下载文件的输出流
    • 创建缓冲区
    • 创建OutputStream流
    • 将输入流写入缓冲区
    • 使用缓冲区的数据通过OutputStream输出到浏览器中
    String realPath = this.getServletContext.getRealPath("/xxxx/1.jsp");//获取下载文件的绝对路径
    String fileName = realPath.substring(realPath.lastIndexOf("\")+1);//获取下载文件名
    response.setHeader("content-disposition","attachment;filename =" +URLEncoder.encode(fileName,"UTF-8") );//设置content-disposition响应头控制浏览器以下载形式打开文件,并且让文件名以UTF-8形式显示
    InputStream in = new FileInputStream(realPath);//获取文件的输入流
    byte[] buffer = new byte[1024];//创建缓冲区
    OutputStream out = response.getOutputStream();//创建OutputStream流
    //将输入流写入缓冲区
    int len = 0;
    while ((len = in.read(buffer))>0){
        out.write(buffer,0,len);
    }//使用缓冲区的数据通过OutputStream输出到浏览器中
    in.close();

    response常用的响应头设置

    response.setDateHeader("expries",-1);//禁止浏览器缓存当前的文档内容
    response.setHeader("refresh","x");//设置refresh控制浏览器每隔x秒刷新一次
    response.setStatus("xxx");//设置状态码
    response.sendRedirect(String location);//调用response对象中的sendRedirect()方法实现重定向;

    web工程“/”代表的位置

    若是给服务器使用,代表当前的web工程;如:

    • ServletContext.getRealPath(String path);路径的第一个“/”代表的是web工程
    • this.getServletContext().getRequestDispatcher("/xxxx").forward(request,response);实现转发,forward是给服务器用的,所以“/”表示web工程
    • 使用include指令或<jsp.include>标签引入页面时
      <%@include file = "/xxx/xxx/xxx.jsp" %>
      <jsp:include page = "xxx/xxx/xxx.jsp" />

    若是给浏览器使用,则代表webapps目录;如:

    • response.sendRedirect("/xxx/xxx/xxx");重定向是给浏览器使用的,所以其中第一个“/”是表示webapps目录;
    • 使用超链接
      <a href = "/xxx/xxx/xxx.jsp">xxx<a>
    • Form表单提交
      <form action = "/xxx/xxx/xxx" method = "post">
    • js脚本和css样式的引用

    通常我们使用request.getContextPath()来替代web项目名,即request.getContextPath()等价于“/项目名”,这样即使我们修改项目名,开发的代码也不需要改动,比较灵活;

  • 相关阅读:
    SugarCRM SupPanel删除键不好用
    SugarCRM 一个页面控制两个模块(editview.php)
    使用组策略去除每次打开IE7的”自定义您的设置”
    SugarCRM SupPanel表头显示不正确
    SugarCRM 去掉 模块标题左边的 问号 和 帮助
    SugarCRM 在Html中增加超连接按钮
    C#中设置状态栏(statusStrip)的布局
    poj2418 Hardwood Species *
    算法导论15.54
    算法导论9.37
  • 原文地址:https://www.cnblogs.com/lzj-learn/p/11608994.html
Copyright © 2020-2023  润新知