request代表了请求

response代表响应

HttpServletResponse

setStatus();----->发送状态码

setHeader();---->发送响应头

getWriter();和getOutputStream();------>发送数据

addHeader();---->添加一个头

containsHeader();--->包含几个头

HttpServletResponse细节一-------》码表的对应设置charset=UTF-8

  1. ResponseDemo1

  1.  
  1. 如果不加:
  1. response.setHeader("Content-type","text/html;charset=UTF-8");
  1.  

浏览器读出涓球,默认国标读,不是utf-8

  1. package cn.itcaste.web.servlet;
  2.  
  3. import java.io.IOException;
  4. import java.io.OutputStream;
  5. import java.io.UnsupportedEncodingException;
  6.  
  7. import javax.servlet.ServletException;
  8. import javax.servlet.annotation.WebServlet;
  9. import javax.servlet.http.HttpServlet;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12.  
  13. @WebServlet("/ResponseDemo1")
  14. public class ResponseDemo1 extends HttpServlet {
  15.  
  16. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  17.  
  18. // test2(response);
  19.  
  20. //test1(response);
  21. }
  22.  
  23. private void test2(HttpServletResponse response) throws IOException, UnsupportedEncodingException {
  24. //用html技术中的meta标签模拟http响应头,来控制浏览器的行为
  25. String data="中国";
  26. OutputStream out=response.getOutputStream();
  27.  
  28. out.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>".getBytes());
  29. out.write(data.getBytes("UTF-8"));
  30. }
  31.  
  32. private void test1(HttpServletResponse response) throws IOException, UnsupportedEncodingException {
  33. //以什么编码发就用什么编码读
  34. response.setHeader("Content-type","text/html;charset=UTF-8");
  35. String data="中国";
  36. OutputStream out=response.getOutputStream();
  37. out.write(data.getBytes("UTF-8"));
  38. }
  39.  
  40. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  41. // TODO Auto-generated method stub
  42. doGet(request, response);
  43. }
  44.  
  45. }

如下demo字符流输出:浏览器显示??---------理由在下张图

  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2.  
  3. String data="中国";
  4. PrintWriter out=response.getWriter();
  5. out.write(data);
  6. }

先把中国写入respone,因为respone是外国人发明的,查找的是iso8859这个码表,查找不到所以显示??

如下代码可以改变所查码表和浏览器所读取时查询码表:

  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. // response.setCharacterEncoding("UTF-8");//控制写入response时所查询的码表
  3. // response.setHeader("content-type", "text/html;charset=UTF-8");//控制浏览器输出时时所查询的码表
  4. response.setContentType("text/html;charset=UTF-8");//这句话可以代替上两句话
  5. String data="中国";
  6. PrintWriter out=response.getWriter();
  7. out.write(data);//writer流只能写字符串!
  8. }

HttpServletResponse细节二-------》response实现(中文)文件下载

ResponseDemo3:

  1. package cn.itcaste.web.servlet;
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7.  
  8. import javax.imageio.stream.FileCacheImageInputStream;
  9. import javax.servlet.ServletException;
  10. import javax.servlet.annotation.WebServlet;
  11. import javax.servlet.http.HttpServlet;
  12. import javax.servlet.http.HttpServletRequest;
  13. import javax.servlet.http.HttpServletResponse;
  14.  
  15. import org.apache.taglibs.standard.tag.common.core.OutSupport;
  16.  
  17. /**
  18. * 文件下载案例
  19. */
  20. @WebServlet("/ResponseDemo3")
  21. public class ResponseDemo3 extends HttpServlet {
  22.  
  23. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  24. String path=this.getServletContext().getRealPath("/download/1.jpg");//获取绝对路径
  25. String filename=path.substring(path.lastIndexOf("\\")+1);//获取文件名称
  26. response.setHeader("content-disposition", "attachment;filename="+filename );//设置成按下载方式读取的响应头
  27. InputStream in=null;
  28. OutputStream out=null;
  29. try {
  30. in=new FileInputStream(path);
  31. int len=0;
  32. byte buffer[]=new byte[1024];
  33. out=response.getOutputStream();
  34. while((len=in.read(buffer))>0){//读取到缓冲区的总字节数,如果没有更多的数据,因为文件的结尾已经到达,则为-1
  35. out.write(buffer,0,len);//将该输入流中的len个字节数据读入一个字节数组
  36. }
  37. }
  38. finally {
  39. if (in!=null) {
  40. try {
  41. in.close();
  42. } catch (Exception e) {
  43. // TODO Auto-generated catch block
  44. e.printStackTrace();
  45. }
  46. }
  47. }
  48.  
  49. }
  50.  
  51. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  52. doGet(request, response);
  53. }
  54.  
  55. }

发布服务后浏览器显示:

下面我们来尝试中文:美女.jpg

demo

  1. package cn.itcaste.web.servlet;
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7. import java.net.URLDecoder;
  8. import java.net.URLEncoder;
  9.  
  10. import javax.imageio.stream.FileCacheImageInputStream;
  11. import javax.servlet.ServletException;
  12. import javax.servlet.annotation.WebServlet;
  13. import javax.servlet.http.HttpServlet;
  14. import javax.servlet.http.HttpServletRequest;
  15. import javax.servlet.http.HttpServletResponse;
  16.  
  17. import org.apache.taglibs.standard.tag.common.core.OutSupport;
  18.  
  19. /**
  20. * 文件下载案例
  21. */
  22. @WebServlet("/ResponseDemo3")
  23. public class ResponseDemo3 extends HttpServlet {
  24.  
  25. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  26. //如果下载名是中文,要经过url编码
  27. String path=this.getServletContext().getRealPath("/download/美女.jpg");//获取绝对路径
  28. String filename=path.substring(path.lastIndexOf("/")+1);//获取文件名称
  29. filename=URLEncoder.encode(filename, "UTF-8");//按理说这样就不会中文乱码,但是只有谷歌生效了,safari不行,我还在寻找办法
  30. System.out.println(filename);
  31. System.out.println(URLDecoder.decode(filename, "UTF-8"));
  32. // response.setHeader("content-type", "charset=UTF-8");//控制浏览器输出时时所查询的码表
  33. response.setHeader("content-disposition", "attachment;filename=" +filename ); //设置成按下载方式读取的响应头
  34. InputStream in=null;
  35. OutputStream out=null;
  36. try {
  37. in=new FileInputStream(path);
  38. int len=0;
  39. byte buffer[]=new byte[1024];
  40. out=response.getOutputStream();
  41. while((len=in.read(buffer))>0){//读取到缓冲区的总字节数,如果没有更多的数据,因为文件的结尾已经到达,则为-1
  42. out.write(buffer,0,len);//将该输入流中的len个字节数据读入一个字节数组
  43. }
  44. }
  45. finally {
  46. if (in!=null) {
  47. try {
  48. in.close();
  49. } catch (Exception e) {
  50. // TODO Auto-generated catch block
  51. e.printStackTrace();
  52. }
  53. }
  54. }
  55.  
  56. }
  57.  
  58. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  59. doGet(request, response);
  60. }
  61.  
  62. }

浏览器显示:

HttpServletResponse细节三-------》response实现输出随机图片

先来看效果:------》目的在于防止恶意注册

demo:

  1. package cn.itcaste.web.servlet;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Font;
  5. import java.awt.Graphics;
  6. import java.awt.Graphics2D;
  7. import java.awt.image.BufferedImage;
  8. import java.io.IOException;
  9. import java.util.Random;
  10.  
  11. import javax.imageio.ImageIO;
  12. import javax.servlet.ServletException;
  13. import javax.servlet.annotation.WebServlet;
  14. import javax.servlet.http.HttpServlet;
  15. import javax.servlet.http.HttpServletRequest;
  16. import javax.servlet.http.HttpServletResponse;
  17.  
  18. /**
  19. * Servlet implementation class ResponseDemo4
  20. */
  21. @WebServlet("/ResponseDemo4")
  22. public class ResponseDemo4 extends HttpServlet {
  23. public static final int WIDTH=120;
  24. public static final int HEIGHT=35;
  25. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  26. //BufferedImage.TYPE_INT_RGB图像类型
  27. BufferedImage image=new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);//在内存中构建出一幅图像
  28. Graphics g=image.getGraphics();//得到图形!Graphics类是所有图形上下文的抽象基类,允许应用程序绘制在各种设备上实现的组件以及屏幕外图像。
  29.  
  30. //1.设置背景色
  31. setBackGround(g);
  32.  
  33. //2.设置边框
  34. setBorder(g);
  35.  
  36. //3.画干扰线
  37. drawRandomLine(g);
  38.  
  39. //4.画随机数
  40. drawRandomNum((Graphics2D)g);
  41.  
  42. //5.图形写给随机数
  43. response.setContentType("image/jpeg");
  44. //发头控制浏览器不要缓存
  45. response.setDateHeader("expries", -1);
  46. response.setHeader("Cache-Control", "no-cache");
  47. response.setHeader("Pragma ","no-cache" );
  48. ImageIO.write(image, "jpg", response.getOutputStream());
  49.  
  50. }
  51. /**
  52. * @param g
  53. * 设置背景色
  54. */
  55. private void setBackGround(Graphics g) {
  56. g.setColor(Color.WHITE);
  57. g.fillRect(0, 0, WIDTH, HEIGHT);
  58.  
  59. }
  60. /**
  61. * @param g
  62. * 设置边框
  63. */
  64. private void setBorder(Graphics g) {
  65. g.setColor(Color.RED);
  66. g.drawRect(0, 0, WIDTH-2, HEIGHT-2);
  67.  
  68. }
  69. /**
  70. * @param g
  71. * 画干扰线
  72. */
  73. private void drawRandomLine(Graphics g) {
  74. g.setColor(Color.GREEN);
  75. for(int i=0;i<5;i++){
  76. int x1=new Random().nextInt(WIDTH);
  77. int y1=new Random().nextInt(HEIGHT);
  78. int x2=new Random().nextInt(WIDTH);
  79. int y2=new Random().nextInt(HEIGHT);
  80. g.drawLine(x1, y1, x2, y2);
  81. }
  82. }
  83. /**
  84. * @param g
  85. * 画随机数
  86. */
  87. private void drawRandomNum(Graphics2D g) {
  88. g.setColor(Color.BLACK);
  89. String c1 = null;
  90. g.setFont(new Font("宋体", Font.BOLD, 18));
  91. for(int i=0;i<4;i++){
  92. int d=new Random().nextInt()%30;
  93. char c=(char) (0x4e00+(int)(Math.random()*(0x9fa5-0x4e00+1)));
  94. c1 = String.valueOf(c);
  95. g.rotate((d*3.14)/180,( WIDTH-(30*i)-30),(HEIGHT-20));
  96. g.drawString(c1,( WIDTH-(30*i)-30), (HEIGHT-15));
  97. g.rotate((-1*d*3.14)/180,( WIDTH-(30*i)-30),(HEIGHT-20));
  98.  
  99. }
  100. }
  101.  
  102. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  103. // TODO Auto-generated method stub
  104. doGet(request, response);
  105. }
  106.  
  107. }

点击图片换一张js:

HttpServletResponse细节二-------》response实现 refresh定时刷新页面以及特定情景

  1. /**
  2. * Servlet implementation class ResponseDemo5
  3. */
  4. @WebServlet("/ResponseDemo5")
  5. public class ResponseDemo5 extends HttpServlet {
  6. //控制浏览器定时刷新
  7. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  8. //假设这是一个用于处理登录的servlet
  9.  
  10. //假设程序运行到此,用户等录成功
  11.  
  12. //test1(response);
  13. response.setCharacterEncoding("UTF-8");
  14. response.setContentType("text/html;charset=UTF-8 ");
  15. response.getWriter().write("登录成功,三秒后将跳转到首页,如果没有,请点击<a href='/day04/ResponseDemo4'>超链接</a>");
  16. response.setHeader("refresh", "3;url='/day04/ResponseDemo4'");//每隔三秒拿一次数据
  17. }
  18.  
  19. private void test1(HttpServletResponse response) throws IOException {
  20. response.setHeader("refresh", "3");//每隔三秒拿一次数据
  21. String data=new Random().nextInt(10000)+"";
  22. response.getWriter().write(data);
  23. }
  24.  
  25. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  26. // TODO Auto-generated method stub
  27. doGet(request, response);
  28. }
  29.  
  30. }

浏览器先看到如下,不点击超链接则3秒后自动跳转,点击则立刻跳转:

HttpServletResponse细节三-------》控制浏览器要缓存

  1. /**
  2. * 控制浏览器要缓存
  3. */
  4. @WebServlet("/ResponsDemo6")
  5. public class ResponseDemo6 extends HttpServlet {
  6.  
  7. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  8. response.setDateHeader("expires", System.currentTimeMillis()+1000*3600);//设置缓存时间,当前时间加一秒乘3600=一天
  9. String data="aaaaaaaaa";
  10. response.getWriter().write(data);
  11. }
  12.  
  13. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  14. // TODO Auto-generated method stub
  15. doGet(request, response);
  16. }
  17.  
  18. }

HttpServletResponse细节四-------》重定向

  1. /**
  2. * 实现请求重定向
  3. * 地址栏会发生变化:适用于登录跳转首页,购物
  4. */
  5. @WebServlet("/ResponseDemo7")
  6. public class ResponseDemo7 extends HttpServlet {
  7.  
  8. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  9.  
  10. // response.setStatus(302);
  11. // response.setHeader("location", "/day04/1.jsp");
  12. response.sendRedirect("/day04/1.jsp");//这句可以代替上面两句,重定向等于发送两次请求
  13. }
  14.  
  15. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  16. // TODO Auto-generated method stub
  17. doGet(request, response);
  18. }
  19.  
  20. }

HttpServletResponse细节五-------》

response.getOutputStream();
        response.getWriter();

不能同时调用

Servlet------>response的更多相关文章

  1. JavaWeb基础:Servlet Response

    ServletResponse简介 ServletResponse代表浏览器输出,它提供所有HttpResponse的设置接口,可以设置HttpResponse的响应状态,响应头和响应内容. 生命周期 ...

  2. Servlet(Response,Request)

    1.response控制码表的3种方法:输出1; 2,文件下载 3.控制浏览器定时刷新网页(REFRESH) 4.控制浏览器缓存当前文档内容 5. 通过response实现请求重定向. 6.setHe ...

  3. servlet response 中文乱码

    先,response返回有两种,一种是字节流outputstream,一种是字符流printwrite. 申明:这里为了方便起见,所有输出都统一用UTF-8编码. 先说字节流,要输出“中国" ...

  4. Servlet response原理

    首先web服务器 接受到http请求后转交给相应的servlet进行处理这个过程可以他通过配置web.xml来进行确定,然后web服务器将相应的信息封装到request和response对象,由相应的 ...

  5. Servlet Response 重定向

    重定向 response.sendRedirect("index.jsp");       //登录用户名不存在,重定向到index.jsp 1重定向在客户端发挥作用,通过浏览器重 ...

  6. java map转json servlet response

    1.手写一个map转json的类 1.1 调用方式 //给前端放回json数据 Map<String, Object> map = new HashMap<>(); map.p ...

  7. Java EE之servlet实现用户登录

    1.在连接数据库的JAVA类中添加查询功能: 在这之前有一个连接数据库的方法: Connection conn=null; PreparedStatement stat=null;           ...

  8. Java EE之servlet处理表单提交的请求

    1.在源包下新建一个Servlet页,取名为LoginServlet: package weinidingServlet;                            //该Servlet所 ...

  9. Java中前台JSP请求Servlet实例(http+Servlet)

    1.前台jsp代码 himily.jsp,定义了用户名和密码两个输入框,使用post方式提交:/order-web/HimilyServlet其中order-web为站点名称,HimilyServle ...

  10. chain.doFilter(request,response)含义

    过滤器的生命周期一般都要经过下面三个阶段: 初始化 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Config 对象的引用.我们的过滤器实际上并 ...

随机推荐

  1. 【Android】13.0 第13章 创建和访问SQLite数据库—本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 Android 内置了三种数据存取方式:SQLite数据库.文件.SharedPreferences. 这一章我们 ...

  2. po vo

    一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象.使用Hibernate来生成PO是不错的选择. 二.VO:value object值对象.通常用于 ...

  3. Struts2初学 Struts2的action接收用户数据方式

    一.简介    开发Web应用程序,首先应会遇到对用户输入数据的接收,传统的Web应用程序是由开发人员调用HttpServletRequest的getparameter(String name)方法从 ...

  4. Nginx设置expires设定页面缓存时间 不缓存或一直使用缓存

    配置expires expires起到控制页面缓存的作用,合理的配置expires可以减少很多服务器的请求 要配置expires,可以在http段中或者server段中或者location段中加入 l ...

  5. js基本知识5

    1.1 复习 1. 按钮不可用 disabled = “disabled” || true 2. setTimeout 只执行一次 setInterval 执行很多次 3. 递归调用 : 函数自己调用 ...

  6. libcpmt.lib (xxx.obj) LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease' in XXX.obj

    问题描述: 这样的,我写了个NString类,然后用的VS2013的命令行编译的(NMAKE.exe),并用LNK.exe打包成了NString.lib 然后后来我在VS2013里面建了一个proje ...

  7. oracle 存储过程学习感悟

    1.跟大白话差不多 2.if...then.... else ....写的比较多 3.调用存储过程命令:execute procedure_name 4.调用存储函数命令:select '0' str ...

  8. docker 容器内ping不通外网

    其实只要重启docker就好了 systemctl restart docker https://blog.csdn.net/yangzhenping/article/details/43567155

  9. 终极方法,pjsip发起多方对讲出错Too many objects of the specified type (PJ_ETOOMANY)

    http://blog.csdn.net/zhangjm_123/article/details/26727221 —————————————————————————————————————————— ...

  10. Linux 高频工具快速教程

    全书分为三个部分: 第一部分为基础篇,介绍我们工作中常用的工具的高频用法: 第二部分为进阶篇,介绍的工具更多的适合程序员使用,分为程序构建.程序调试及程序优化: 第三部分是工具参考篇,主要介绍实用工具 ...