博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaWEB开发08——Response
阅读量:5875 次
发布时间:2019-06-19

本文共 5823 字,大约阅读时间需要 19 分钟。

1.HttpServletResponse概述

  • 我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
  • service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大。

2.response的运行流程

图片描述

3.通过抓包工具抓取Http响应

因为response代表响应,所以我们可以通过该对象分别设置Http响应的响应行,响应头和响应体。

图片描述

4.通过response设置响应行

//手动设置http响应行的状态码response.setStatus(404);

5.通过response设置响应头

addHeader(String name, String value) addIntHeader(String name, int value) addDateHeader(String name, long date)//重点setHeader(String name, String value) setDateHeader(String name, long date) setIntHeader(String name, int value)
Date date = new Date();//设置响应头response.addHeader("name", "zhangsan");response.addIntHeader("age", 28);response.addDateHeader("hirthday", date.getTime());//add代表添加,set代表重置response.addHeader("name", "lisi");response.setHeader("name", "wangwu");
  • 设置重定向
/*//没有响应的资源,告知客户端去重定向到2//1.设置状态码 302response.setStatus(302);//2.设置响应头Locationresponse.setHeader("Location","/javaweb/servlet2");*///封装成一个重定向的方法sendRedirect(url)response.sendRedirect("/javaweb/servlet2");
  • js实现浏览器跳转
    
注册页面 恭喜你注册成功,5秒后跳转,如不跳转点击这里!

6.通过response设置响应体

  • 响应体设置文本

    • PrintWriter writer = response.getWriter();
    • 获得字符流,通过字符流的write(String s)方法可以将字符串设置到response 缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览 器端。
  • 设置默认编码

    • response.setContentType("text/html,charset=UTF-8");
    • 上面的代码不仅可以指定浏览器解析页面时的编码,同时也内含 setCharacterEncoding的功能,所以在实际开发中使用。
//设置response查询的码表//response.setCharacterEncoding("UTF-8");//通过一个头Content-Type告知客户端使用何种码表解码,写一种就行//response.setHeader("Content-Type", "text/html;charset=UTF-8");response.setContentType("text/html,charset=UTF-8");//响应体设置文本PrintWriter writer = response.getWriter();writer.write("hello response!");writer.write("中国");
  • 响应头设置字节

    • ServletOutputStream out = response.getOutputStream();
    • 获得字节流,通过该字节流的write(byte[] bytes)可以向response缓冲区中写入字节,在由Tomcat服务器将字节内容组成Http响应返回给浏览器。
//使用response获得字节输出流ServletOutputStream out = response.getOutputStream();//获得服务器上的图片String realPath = this.getServletContext().getRealPath("img.jpg");InputStream in = new FileInputStream(realPath);int len = 0;byte[] buffer = new byte[1024];while ((len=in.read(buffer))>0){    out.write(buffer, 0, len);}in.close();out.close();

7.案例-完成文件下载

文件下载的实质就是文件拷贝,将文件从服务器端拷贝到浏览器端。所以文件下载需要IO技术将服务器端的文件使用InputStream读取到,在使用ServletOutputStream写到response缓冲区中。
//获得要下载的文件的名称String filename = request.getParameter("filename");//要下载的这个文件的类型-客户端通过文件的mime类型去区分类型response.setContentType(this.getServletContext().getMimeType(filename));//告诉客户端文件不是解析,而是已附件形式打开(下载)response.setHeader("Content-Disposition", "attachment;filename="+filename);//获取文件的绝对路径String path = this.getServletContext().getRealPath("/download/" + filename);//获得文件的输入流InputStream in = new FileInputStream(path);//获得输出流-通过response获得的输出流,用于向客户端写内容。ServletOutputStream out = response.getOutputStream();//文件拷贝的模板代码int len = 0;byte[] buffer = new byte[1024];while ((len=in.read(buffer))>0){    out.write(buffer,0, len);}in.close();//out.close();//会自动关闭
但是,如果下载中文文件,页面在下载时会出现中文乱码或不能显示文件名的情况, 原因是不同的浏览器默认对下载文件的编码方式不同,ie是UTF-8编码方式,而火狐浏览器是Base64编码方式。所里这里需要解决浏览器兼容性问题,首先要辨别访问者是ie还是火狐(其他),通过Http请求体中的一个属性可以辨别。
package net.allidea.content;import sun.misc.BASE64Encoder;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.net.URLEncoder;@WebServlet(name = "DownloadServlet2")public class DownloadServlet2 extends HttpServlet {    @Override    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        doGet(request, response);    }    @Override    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        //******************文件名是中文的********************                //获得要下载的文件的名称//???.jpg        String filename = request.getParameter("filename");        //解决获得中文参数乱码问题 //美女.jpg        //filename = new String(filename.getBytes("ISO8859-1"),"UTF-8");        //获得请求头中的User-Agent        String agent = request.getHeader("User-Agent");        //根据不同浏览器进行不同的编码        String filenameEncoder = "";        if (agent.contains("MSIE")) {            // IE浏览器            filenameEncoder = URLEncoder.encode(filename, "utf-8");            filenameEncoder = filenameEncoder.replace("+", " ");        } else if (agent.contains("Firefox")) {            // 火狐浏览器            BASE64Encoder base64Encoder = new BASE64Encoder();            filenameEncoder = "=?utf-8?B?"                    + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";        } else {            // 其它浏览器            filenameEncoder = URLEncoder.encode(filename, "utf-8");        }        //要下载的这个文件的类型-客户端通过文件的mime类型去区分类型        response.setContentType(this.getServletContext().getMimeType(filename));        //告诉客户端文件不是解析,而是已附件形式打开(下载)-filename="+filename客户端解码        response.setHeader("Content-Disposition", "attachment;filename="+filenameEncoder);        //获取文件的绝对路径        String path = this.getServletContext().getRealPath("download/" + filename);        //获得文件的输入流        InputStream in = new FileInputStream(path);        //获得输出流-通过response获得的输出流,用于向客户端写内容。        ServletOutputStream out = response.getOutputStream();        //文件拷贝的模板代码        int len = 0;        byte[] buffer = new byte[1024];        while ((len=in.read(buffer))>0){            out.write(buffer,0, len);        }        in.close();        //out.close();    }}
  • response细节点:

    • response获得的流不需要手动关闭,Tomcat容器会帮助我们关闭
    • getWriter和getOutputStream不能同时调用

8.实现验证码功能

    
用户登录
用户名:
密码:
验证码:

转载地址:http://kikix.baihongyu.com/

你可能感兴趣的文章
leetcode 110 Balanced Binary Tree
查看>>
python活用isdigit方法显示系统进程
查看>>
项目开发总结
查看>>
知行合一
查看>>
jmeter插件之jsonpath提取响应结果和做断言
查看>>
发布支持多线程的PowerShell模块 —— MultiThreadTaskRunner
查看>>
Ubuntu ctrl+alt会导致窗口还原的问题
查看>>
第四十期百度技术沙龙笔记整理
查看>>
推荐系统那点事 —— 基于Spark MLlib的特征选择
查看>>
linux 下RTL8723/RTL8188调试记录(命令行)【转】
查看>>
開始新的征程
查看>>
SpringMVC案例1——对User表进行CRUD操作
查看>>
看雪CTF第十四题
查看>>
模拟生命_吸烟致癌?
查看>>
[Contiki系列论文之1]Contiki——为微传感器网络而生的轻量级的、灵活的操作系统...
查看>>
Android 网络编程 记录
查看>>
微软同步发行Windows 10和Windows 10 Mobile系统更新
查看>>
Maven 传递依赖冲突解决(了解)
查看>>
Zeppelin的入门使用系列之使用Zeppelin运行shell命令(二)
查看>>
[Spark][Python]Spark Join 小例子
查看>>