精华内容
参与话题
问答
  • Response详解

    千次阅读 2017-11-22 22:18:17
    今天在来看一下Response容器的相关知识,其实这篇blog早就应该编写了,只是最近有点忙,所以被中断了。下面我们就来看一下Response容器的相关知识吧。Response和我们即将在后面说到的Request容器是一一对应的,他是...

    今天在来看一下Response容器的相关知识,其实这篇blog早就应该编写了,只是最近有点忙,所以被中断了。下面我们就来看一下Response容器的相关知识吧。Response和我们即将在后面说到的Request容器是一一对应的,他是web容器在用户每次请求服务端的时候,创建的一对容器对象,Response容器是服务端返还给客户机的一个响应内容对象容器,比如说:响应头,响应行,实体数据等信息,而Request容器对象是,代表用户请求服务端的的一个容器对象,比如客户机的请求头,请求行,以及携带的参数信息等。所以说Request容器对象和Response容器对象是一一对应的,他们两的生命周期也是一样的,就是在一次用户请求中。下面就来详细说一下Response容器对象的相关知识吧!


    下面先来看一下Response对象的相关方法吧:

    addCookie(Cookie cookie):这个方法是向Response容器中添加一个Cookie,然后服务器容器会自动的将这个Cookie回写给客户机的,至于Cookie的相关知识我们会在后面的文章中进行详解,这篇文章中这个方法暂时用不到。

    addDateHeader(String name ,long date):这个是向客户机添加一个时间值属性的响应头信息,比如那个缓存的响应头expires

    addHeader(String name,String value):这个是向客户机添加一个字符串值属性的响应头信息,比如重定向的响应头location

    addIntHeader(String name ,int value):这个是向客户机添加一个字符串属性的响应头信息

    containsHeader(String name):这个方法是判断是否含有这个响应头信息字段

    encodeURL(String name):这个方法是用于url改写的功能的,这个和session有关,等到说session那篇文章的时候在详细说明

    sendRedirect(String name):这个方法是用于请求重定向的,和响应头中的location字段的作用相同

    setHeader(String name,String value)/setIntHeader(String name,int value)/setDateHeader(String name,long date):这些方法和addHeader方法是相对应的,唯一和addHeader不同的是,addHeader是向Response中添加一个响应头信息,而setHeader是修改一个响应头信息的。

    setStatus(int value):通过这个方法是设置响应码的,比如:200,304,404等。

    getOutputStream():通过这个方法可以拿到一个字节流,然后可以向Response容器中写入字节数据,最后客户机向Response容器中拿去数据进行显示

    getWriter():通过这个方法可以拿到一个字符流(PrintWriter),然后可以向Response容器中写入字符数据,最后客户机向Response容器中拿去数据进行显示

    setContentLength():通过这个方法设置服务器向用户返回的数据长度,我们在HTTP协议详解这篇blog中的那个压缩数据的返回的例子中有说到

    setContentType():方法可以直接设置响应头content-type的内容



    下面我们就来详细介绍一下这些方法的使用吧:

    第一个例子:通过Response进行数据的输出,下面是一个测试的方法,这个方法只要在service方法中调用即可,传递一个HttpServletResponse对象,就可以进行输出的

    1. public void test(HttpServletResponse response) throws Exception{  
    2.     // 使用OutputStream字节流进行数据的输出  
    3.     response.getOutputStream().write("Hello World".getBytes());  
    4. }  

    这个例子很简单就是将字符串写到response容器中,然后客户机从容器中拿取数据进行显示即可,但是这里我们需要注意的,当我们在使用response.getOutputStream()这样获取一个OutputStream流的时候,我们在使用完之后,并不需要手动的去关闭,系统会自动关闭它,如果我们手动去关闭这个流的话,还会引发一些问题。


    这里我们输出的是"Hello World"英文,使用浏览器去访问的时候是没有乱码问题,下面我们在将代码改写一下,

    1. response.getOutputStream.write("中国".getBytes("utf-8"));  
    这时候我们使用浏览器去访问数据的时候,当然我们可能会看到"中国",也有可能看到的是乱码,原因很简单,如果浏览器使用的是gb2312码表打开的话,就是乱码,如果是使用utf-8码表打开的话,就是正常的数据。当然我们可以手动的去设置浏览器的打开码表,默认的是gb2312(系统默认码表),那么如果我们使用utf-8将数据写入到Response中,然后浏览器使用的是默认的码表去拿取数据进行显示,那肯定是乱码了,那么我们该怎么办呢?,让用户手动的去修改浏览器的打开码表,那貌似太恶心了,所以这里我们就要介绍一个响应头字段的作用了,Content-type:这个头就是告诉浏览器以什么方式打开数据,并且指定相应的码表,具体代码如下:

    1. response.setHeader("Content-type""text/html;charset=utf-8");  
    这样,我们就可以告诉浏览器以utf-8码表去显示数据,这样也就不会再有乱码的问题了。

    这里我们在扩展一下就是还有一种方式控制浏览器的打开码表,那就是使用<meta>标签来实现:

    1. response.getOutputStream().write("<meta http-equiv='content-type' content='text/html;charset=utf-8'>".getBytes());  
    这里我们组建了一个<meta>标签,并将这个标签写入到Response容器中,当客户机使用去拿取这段数据的时候,发现有html中的标签<meta>所以会通过一些处理会把上面的字符串当做是是html代码来显示。这里使用了<meat>标签来解决乱码问题的。


    上面使用的是字节流的方式来给客户机发送数据的,有时候我们可能会使用字符流来显示数据,因为字符流在特定场合下回比字节流更方便的输出,其实这里使用response.getWriter()来获取一个PrintWriter字符流对象,然后我们可以使用PrintWriter对象的write方法直接写字符串数据,但是这里也是需要来解决乱码的问题,而且这里的需要解决的问题比上面的字节流更麻烦。下面来看一下吧:

    1. response.getWriter.write("中国");  
    通过上面的方法进行输出,显示的是乱码,首先servlet将"中国"字符串写入到Response容器中,但是这里需要注意的一个问题就是,将"中国"写入到Response中,那么Response容器中是怎么存储"中国"字符串的,因为Response这些技术都是老外发明的,所以他们肯定是使用iso8859-1编码来进行存储字节数据的,所以这里就会有一个大问题,因为我们知道iso8859-1使用的是单个字节表示一个字符的,而gb2312使用的是两个字节,utf-8使用的是三个字节,所以Response将使用iso8859-1码表进行编码,那么存储的是两个乱码字节,所以,当客户机从Response容器中去拿取数据的时候显示的肯定是乱码,那么当我们使用

    1. response.setHeader("Content-type","text/html;charset=utf-8")  
    来设置浏览器的打开数据的码表,但是我们会发现还是显示两个??,这个也是很简单的,因为我们在编写JavaSE中,也会知道这个问题就是将utf-8这种多字节的码表转到低字节码表iso8859-1,当我这时候在将结果转成utf-8的数据,这时候是不可能在转回原始数据的。所以说我们应该去修改Response容器的码表,将其码表改成utf-8,这时候就可以"中国"写入到Response容器中,而且会以utf-8的码表进行存储的,当客户机在用utf-8码表打开的时候就不会有问题了,

    上面我们使用字节流来进行书写数据的时候,是没有问题的,因为是将"中国"的字节数据直接写到Response容器中的,所以不会涉及到Response容器编码的问题。


    所以说当我们在使用字符流写入数据的时候,我们一定要记得修改Response容器的编码,不然会出现乱码的

    1. response.setCharacterEncoding("utf-8");  
    2. response.setHeader("content-type""text/html;charset=utf-8");  
    所以要用这两行代码的,同时response对象中还有一个方法:setContentType,这个方法可以直接设置Content-type字段的值

    1. response.setContentType("text/html;charset=utf-8");  
    其实这一行代码就相当于上面的两行代码的效果,因为在setContentType方法中已经调用了setCharacterEncoding方法设置了Response容器的编码了。


    下面我们在来看一下怎么通过响应头实现下载的,这里我们只是来解决一下下载的文件名是中文的情况:

    下面图片就是我们没有去解决文件名是中文的问题。浏览器会过滤中文,并且浏览器会认为其是html类型的数据


    下面我们使用URLEncoder.encode(filename,"utf-8");来将中文名进行编码

    1. //实现下载  
    2. public void test3(HttpServletResponse response) throws Exception{  
    3.     /** 
    4.     * 这时候就需要通过url进行编码 
    5.     */  
    6.     ServletContext context = this.getServletContext();  
    7.     //通过context方式直接获取文件的路径  
    8.     String path = context.getRealPath("/download/美女.jpeg");  
    9.     //获取文件名  
    10.     String filename = path.substring(path.lastIndexOf("\\")+1);  
    11.     //将文件名进行URL编码  
    12.     filename = URLEncoder.encode(filename,"utf-8");  
    13.     //告诉浏览器用下载的方式打开图片  
    14.     response.setHeader("content-disposition""attachment;filename="+filename);  
    15.     //将图片使用字节流的形式写给客户机  
    16.     InputStream is = this.getServletContext().getResourceAsStream("/download/美女.jpeg");  
    17.     OutputStream out = response.getOutputStream();  
    18.     byte[] buffer = new byte[1024];  
    19.     int len = 0;  
    20.     while((len=is.read(buffer))!=-1){  
    21.         out.write(buffer, 0, len);  
    22.     }  
    23.           
    24. }  
    处理之后的效果:


    这次就可以正常显示文件名了,而且类型也是jpeg的类型


    下面在来看一个例子,就是使用response.getOutputStream流做一个验证码图片的实现案例:

    原理:首先我们使用BufferedImage对象获取一个特定高和宽的缓存图片,然后我们将对这个图片对象进行一些修饰加工

    setBorder()来设置图片的边框

    setBackground来设置图片的背景颜色

    drawRandomLine来设置随机线条

    drawRandomNumber来设置随机数字

    然后通过响应头Content-type告诉浏览器以图片的方式打开数据

    最后在使用ImageIO对象的write方法将图片写入到response.getOutputStream流中


    代码如下:

    1. <span style="white-space:pre">  </span>//实现随机图片的产生  
    2.     public void test4(HttpServletResponse response) throws Exception{  
    3.           
    4.         final int width = 120;//宽  
    5.         final int height = 35;//高  
    6.           
    7.         BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);  
    8.         Graphics g = image.getGraphics();  
    9.         //设置背景色  
    10.         setBackground(g,width,height);  
    11.         //设置边框  
    12.         setBorder(g,width,height);  
    13.         //设置随机线条  
    14.         drawRandomLine(g,width,height);  
    15.         //设置随机数  
    16.         drawRandomNumber((Graphics2D)g,width,height);  
    17.           
    18.         //不要缓存  
    19.         /*response.setDateHeader("expires", -1); 
    20.         //告诉所有浏览器不要缓存 
    21.         response.setHeader("Cache-control", "no-cache"); 
    22.         response.setHeader("Pragma", "no-cache");*/  
    23.         response.setHeader("content-type""image/jpeg");  
    24.           
    25.         ImageIO.write(image,"jpg",response.getOutputStream());  
    26.           
    27.     }  
    1. <span style="white-space:pre">  </span>/** 
    2.      * 设置背景色 
    3.      * @param g 
    4.      * @param width 
    5.      * @param height 
    6.      */  
    7.     public void setBackground(Graphics g,int width,int height){  
    8.         g.setColor(Color.WHITE);  
    9.         g.fillRect(00, width, height);  
    10.     }  
    11.       
    12.     /** 
    13.      * 设置随机线条 
    14.      * @param g 
    15.      * @param width 
    16.      * @param height 
    17.      */  
    18.     public void drawRandomLine(Graphics g,int width,int height){  
    19.         g.setColor(Color.GREEN);  
    20.         for(int i=0;i<5;i++){  
    21.             int x1 = new Random().nextInt(width);  
    22.             int y1 = new Random().nextInt(height);  
    23.             int x2 = new Random().nextInt(width);  
    24.             int y2 = new Random().nextInt(height);  
    25.             g.drawLine(x1, y1, x2, y2);  
    26.         }  
    27.     }  
    28.       
    29.     /** 
    30.      * 设置边框 
    31.      * @param g 
    32.      * @param width 
    33.      * @param height 
    34.      */  
    35.     public void setBorder(Graphics g,int width,int height){  
    36.         g.setColor(Color.BLUE);  
    37.         g.drawRect(11, width-2, height-2);  
    38.     }  
    39.       
    40.     /** 
    41.      * 设置随机数 
    42.      * @param g 
    43.      * @param width 
    44.      * @param height 
    45.      */  
    46.     public void drawRandomNumber(Graphics2D g,int width,int height){  
    47.         g.setColor(Color.RED);  
    48.         g.setFont(new Font("宋体",Font.BOLD,20));  
    49.           
    50.         //常见的中文字  
    51.         //[\u4e00-\u9fa5]  
    52.         String base = "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\u6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\u77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\u5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\u5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6";  
    53.         int x = 5;  
    54.         for(int i=0;i<4;i++){  
    55.             int degree = new Random().nextInt(61)-30;//new Random().nextInt()%30;//-30---30  
    56.             String content = base.charAt(new Random().nextInt(base.length()))+"";  
    57.             g.rotate(degree*Math.PI/180,x,20);  
    58.             g.drawString(content, x, 20);  
    59.             g.rotate(-degree*Math.PI/180, x, 20);  
    60.             x += 30;  
    61.         }  
    62.           
    63.     }  

    这里我们的随机图片中显示的是常见中文。

    这里我们看到了,但是我们这时候点击刷新的时候,发现图片是不变的,这个很纠结的,原因也很简单,因为浏览器去拿取缓存的图片的了,所以我们要解决这个问题,我们只需要告诉浏览器不要去拿取缓存:

    1. //不要缓存  
    2. response.setDateHeader("expires", -1);  
    3. //告诉所有浏览器不要缓存  
    4. response.setHeader("Cache-control""no-cache");  
    5. response.setHeader("Pragma""no-cache");  


    下面我们在来看一下缓存的问题:

    缓存的问题就是涉及到了几个字段,这里面的内容很多,所以在这篇文章中就不解释了,可以参考另外一篇blog:

    http://blog.csdn.net/jiangwei0910410003/article/details/22917645


    下面在来看一下重定向的问题:

    1. //请求重定向:能不用尽量不用,因为需要向服务器再发一次请求,加重server的压力,像用户登录完之后要跳转到首页、购物买完之后跳转到购物车页面  
    2. //从定向的特点:1.浏览器会向服务器发送两次请求,意味着就有2个request\response;2.用重定向技术,浏览器地址栏会发生变化  
    3.     public void test7(HttpServletResponse response) throws Exception{  
    4.         //使用Http响应头实现重定向  
    5.         response.setStatus(302);  
    6.         response.setHeader("location""/ServletDemo/index.jsp");  
    7.           
    8.         //使用以下的api也是可以的,相当于执行了上面的两行代码  
    9.         //response.sendRedirect("/ServletDemo/index.jsp");  
    10.     }  
    实现重定向的话,有两种方式,第一种是通过响应头字段location和响应状态码302来实现的,第二种是直接调用response的sendRedirect方法实现的,当然最重要的是要看重定向和转发的区别:

    重定向的特点:浏览器的地址栏会发生改变,用户是再次向服务器发送一次请求,这时候就相当于浏览器创建了两对Response/Request对象,

    转发的特点:浏览器的地址栏不会发生改变,还是在一个请求的范围内,所以服务器不会再去创建一对Response/Request对象,始终是在一个请求内。


    最后在来看一下在使用response对象的时候需要注意的问题:

    就是在使用response进行输出数据的时候,我们上面讲到了使用两种方式:一种是使用字节流,一种是使用字符流;但是这两种流是不能同时操作的,否在会报异常的,这个只是在使用同一个Response对象的时候会出现这样的问题,比如你在使用转发技术的时候,在一个servlet中使用字节流写数据,然后转发到另一个servlet,在这个servlet中使用字符流写数据,那这样就会有问题,但是如果你是使用了重定向的话,就不会有这样的问题了,因为重定向的话,是在两个Response对象中。


    博文转自:blog.csdn.net/jiangwei0910410003/article/details/22886847

    展开全文
  • Response的用法

    万次阅读 2018-09-17 10:47:05
    1. 设置响应行的状态码 ...response.setStatus(302); 2.设置响应头 addHeader(String name,String value) addIntHeader(String name,int value) addDateHeader(String name,long value) ...

    1. 设置响应行的状态码

    setStatus(int value)

    response.setStatus(302);
    

    2.设置响应头

    addHeader(String name,String value)
    addIntHeader(String name,int value)
    addDateHeader(String name,long value)

    public class HeaderServlet extends HttpServlet {
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		 Date date = new Date();
    		 response.addHeader("name", "xiaodingdang");
    		 response.addHeader("name", "daxiong");
    		 response.addIntHeader("age", 15);
    		 response.addDateHeader("birthday", date.getTime());
    		
    	}
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doGet(request, response);
    	}
    }
    

    这里写图片描述

    setHeader(String name,String value)
    setIntHeader(String name ,int value)
    setDateHeader(String name, long value)

    public class HeaderServlet extends HttpServlet {
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		 Date date = new Date();
    		 response.setHeader("name", "xiaodingdang");
    		 response.setHeader("name", "daxiong");
    		 response.setIntHeader("age", 15);
    		 response.setDateHeader("birthday", date.getTime());
    		
    	}
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doGet(request, response);
    	}
    }
    

    这里写图片描述

    注意了 要注意setHeader和addHeader的不同 一个是设置 一个是添加 设置只能是设置最后一个 但是添加可以添加很多个

    3.response实现重定向

    方法一:

    response.setStatus(302); //设置响应行的状态码为302 重定向
    response.setHeader("Location", "/Servlet/servlet2"); //设置响应头的属性 跳转到Servlet2
    

    方法二:

    response.sendRedirect("/Servlet/servlet2"); //利用response中的sendRedirect属性完成重定向
    

    4.response实现自动刷新跳转

    public class RefreshServlet extends HttpServlet {
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setHeader("refresh", "5;url=http://www.baidu.com"); //设置头 参数 数值5为
    		//秒 中间用分号间隔 url为要跳转的网址
    	}
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doGet(request, response);
    	}
    }
    

    使用JS来完成自动跳转

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <script type="text/javascript">
    	window.onload= function(){
    		var time = 3;
    		var second = document.getElementById("second");
    		timer = setInterval(function(){
    			second.innerHTML = time;
    			time--;
    			if(time==0){
    				location.href = "http://www.baidu.com";
    				clearInterval(timer);
    			}
    		},1000);
    	}
    </script>
    </head>
    <body>
    	恭喜你,登录成功,<span id="second" style="color: red">3</span>秒后将跳转,若不跳转 请点击<a href="http://www.baidu.com">这里</a>
    </body>
    </html>
    

    5.解决response中文乱码问题

    //方法一:
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setCharacterEncoding("UTF-8");
    		response.setHeader("content-Type", "text/html;charset=utf-8");
    		response.getWriter().write("小叮当");
    		
    	}
    //方法二:
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //		response.setCharacterEncoding("UTF-8");
    //		response.setHeader("content-Type", "text/html;charset=utf-8");
    		response.setContentType("text/html;charset=utf-8");
    		response.getWriter().write("中国");
    		
    	}
    //通常使用第二种方法解决乱码问题
    

    6.上传图片资源

    public class TestServlet extends HttpServlet {
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		ServletOutputStream outputStream = response.getOutputStream(); //获得字节输出流
    		String realPath = this.getServletContext().getRealPath("1.jpg"); //获得图片的真实路径
    		InputStream in = new FileInputStream(realPath); //获得服务器上的图片
    		
    		//使用高效的方法写入客户端图片
    		int len = 0;
    		byte[] buffer = new byte[1024];
    		while((len=in.read(buffer))>0) {
    			outputStream.write(buffer, 0, len);
    		}
    	}
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doGet(request, response);
    	}
    }
    

    Response中应注意的细节

    1.response获得的流OutputStream不需要手动关闭,Tomcat容器会帮助我们关闭
    但是InputStream需要手动关闭
    2.getWriter和getOutputStream不能同时调用

    展开全文
  • Http响应Response详解

    万次阅读 2018-12-06 10:35:33
      1. HttpServletResponse概述:  在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两...service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpSer...

     

     

    1. HttpServletResponse概述:

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

     

     

    2. response的运行流程

     

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

    4. http响应头信息详解 

             类似于请求消息中的请求头,其格式和请求头信息格式一样,即响应头:响应头值。

             1). Server :该响应头是服务器告诉浏览器,当前响应的服务类型和版本。

             2). Content-Type响应头:服务器告诉浏览器响应内容是什么类型,以及采用的是什么字符编码。该响应头的值现在为:text/html;charset=utf-8。说明响应信息的类型是文本类型中的html,使用的字符编码是utf-8。

             3). Content-Length响应头:服务器告诉浏览器,Content-Length响应头表明了响应实体的大小,该响应内容的长度现在是312个字节。

             4). Date响应头:表示是服务器是在什么时候响应回浏览器,注意这里的时间是按照美国时间来计算。

             5). Accept-Ranges: bytes - 该响应头表明服务器支持Range请求,以及服务器所支持的单位是字节(这也是唯一可用的单位).我们还能知道:服务器支持断点续传,以及支持同时下载文件的多个部分,也就是说下载工具可以利用范围请求加速下载该文件.Accept-Ranges: none 响应头表示服务器不支持范围请求.

             6). Last-Modified:服务器上文件的最后修改时间

      5 . 设置response内容

             response 代表响应, 可以通过该对象分别设置Http响应: 响应行  响应头  响应体

            1)  通过response设置响应行:
                  设置响应的状态码:    setStatus(int sc)

             2) 通过response设置响应头   

                    (其中,add表示添加,而set表示设置)                 

            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)
    

              3) 通过response设置响应体

     

     

                   响应体设置文本

                  PrintWriter getWriter()

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

    关于设置中文的乱码问题

    原因:response缓冲区的默认编码是iso8859-1,此码表中没有中文,可以通过  response的setCharacterEncoding(String charset) 设置response的编码

    但我发现客户端还是不能正常显示文字

    原因:我们将response缓冲区的编码设置成UTF-8,但浏览器的默认编码是本地系 统的编码,因为我们都是中文系统,所以客户端浏览器的默认编码是GBK,我们可以  手动修改浏览器的编码是UTF-8。

    还可以在代码中指定浏览器解析页面的编码方式,

    通过response的setContentType(String type)方法指定页面解析时的编码是UTF-8

    response.setContentType("text/html;charset=UTF-8");

    上面的代码不仅可以指定浏览器解析页面时的编码,同时也内含   setCharacterEncoding的功能,所以在实际开发中只要编写 response.setContentType("text/html;charset=UTF-8");就可以解决页面输出中文乱码问题。

    响应头设置字节

    ServletOutputStream  getOutputStream()

    获得字节流,通过该字节流的write(byte[] bytes)可以向response缓冲区中写入字 节,在由Tomcat服务器将字节内容组成Http响应返回给浏览器。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • JavaWeb response用法

    千次阅读 2018-07-12 20:29:40
    response封装了服务器所有的响应1、response可以通过setStatus()方法设置网页的状态码常用的有: 200 请求成功 302 重定向 404 网页未找到 500 服务器内部出错如在Servlet中设置404: protected void doGet(Ht...

    response封装了服务器所有的响应

    1、response可以通过setStatus()方法设置网页的状态码

    常用的有:    200 请求成功

                          302 重定向

                        404 网页未找到

                        500 服务器内部出错

    如在Servlet中设置404:

    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setStatus(404);
    	}

    结果:


    2、可以设置请求头,通过setHeader()方法

    请求头包含如下:


    是以键值对的方式存储

    如设置编码格式:

    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setHeader("Accept-Encoding", "utf-8");
    	}
    
    结果:



    可以设置几秒后刷新网页:

    response.setHeader("Refresh", "5;url=http://www.baidu.com);

    可以设置网页重定向

    response.sendRedirect()

    展开全文
  • Response

    2020-06-11 21:23:10
    2. Response对象 3. ServletContext对象 HTTP协议: 1. 请求消息:客户端发送给服务器端的数据 * 数据格式: 1. 请求行 2. 请求头 3. 请求空行 4. 请求体 2. 响应消息:服务器端发送给客户端的数据 * ...
  • response对象

    2020-11-18 15:18:01
    功能:设置响应消息 1.设置响应行 1.1.格式:HTTP/1.1 200 ok 1.2.设置状态码:setStatus(int sc) 2.设置响应头 setHeader(String name, String value) 3.设置响应体 使用步骤: 1.... 2....
  • response详解

    2018-08-23 09:31:13
    List&lt;Map&lt;String, Object&gt;&gt; mapList = this.onlineUserService.getFlowDetail(User);... response.setCharacterEncoding("UTF-8"); response.setContentType("appli...
  • Response对象及常用方法

    千次阅读 2018-08-25 13:17:52
    void addCookie(Cookie cookie)给客户端添加一个Cookie对象,以保存客户端的信息 void addDateHeader(String name,long value) 添加一个日期类型的HTTP首部信息,覆盖同名的HTTP首部 void addIntHeader... S...
  • request对象和response对象

    万次阅读 多人点赞 2012-02-14 20:05:59
    web服务器收到客户端的HTTP请求,会针对每一次请求分别...2、要向客户机输出数据,只需要找response对象就行了。 一、response对象 1.1向客户端发送数据,以字节为单位(一定要先设置编码方式,再输出) Stri
  • @responsebodyresponseentity的理解

    千次阅读 2017-10-31 15:21:36
    简单来说就是这样:@responsebody有没有这个区别我举个例子更清楚一点,如果有@responsebody这个注解,return “/ssyer/index”,返回数据就是字符/ssyer/index,没有经过视图处理器直接返回了,如果没有这个注解,...
  • 此时使用postman或者httprequester请求,响应状态码500,但是response中如下: ``` { "timestamp": 1489320286710, "status": 500, "error": "Internal Server Error", "exception": "java.lang....
  • 因此,我们可以使用它来完全配置HTTP响应,它是一个对象,而@ResponseBody和@ResponseStatus是注解,适合于简单直接的场合。 @ResponseBody一般与@Controller组合使用,用来返回JSON字符串: @Controller @...
  • 原文作者:yangbishang  来源:CSDN 原文地址:... 1.ResponseEntity的优先级高于@ResponseBody。在不是ResponseEntity的情况下才去检查有没有@ResponseBody注解。如果响应类型是ResponseEntity可以不写@Re...
  • 在传统的开发过程中,我们的控制CONTROLL层通常... SPRING MVC3的@ResponseBody使Controller直接返回数据,而不是直接指向具体的视图;同时通过MessageConverter和produces(如produces="text/plain;charset=U...
  • @ResponseBody ResponseEntity

    2018-12-09 19:48:00
    1、产生疑问 我们知道,如果在 Controller 的某个...其将方法的返回值通过适当的转换器转换为指定的格式之后,写入到 response 对象的 body 区,通常用来给客户端返回 JSON 数据或者是 XML 数据,当方法上面没有...
  • Controller中返回数据总结(ResponseEntity,@ResponseBody,@ResponseStatus) 在传统的开发过程中,我们的控制CONTROLLER层通常需要转向一个JSP视图;但随着WEB2.0相关技术的崛起,我们很多时候只需要返回数据即可...
  • @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML  数据,需要注意的呢,在使用此注解之后不会再走视图...
  • @ResponseBody详解

    万次阅读 多人点赞 2019-04-24 15:14:16
    @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。 注意:在使用此注解之后不会再走视图处理器,...
  • 28.ResponseEntity与ResponseBody注解的关系

    千次阅读 2017-11-21 16:41:17
    1.ResponseEntity的优先级高于@ResponseBody。在不是ResponseEntity的情况下才去检查有没有@ResponseBody注解。如果响应类型是ResponseEntity可以不写@ResponseBody注解,写了也没有关系。2.ResponseEntity中的body...
  • 1.ResponseEntity的优先级高于@ResponseBody。在不是ResponseEntity的情况下才去检查有没有@ResponseBody注解。如果响应类型是ResponseEntity可以不写@ResponseBody注解,写了也没有关系。2.ResponseEntity 是在 org...
  • 在传统的开发过程中,我们的控制CONTROLLER层通常需要转向一个JSP视图;但随着WEB2.0相关技术的崛起,我们很多时候只需要返回数据即可,而不是一个JSP页面。...@ResponseBody:返回json格式的结果 @ResponseSta...
  • @responsebody表示该方法的返回结果直接写入HTTP response body中。如果使用springMVC则视图解析器不会当做url处理然后进行重定向,而是直接写入HTTP response body。它的使用情况如下:1、一般在异步获取数据时使用...
  • 主要是想问ResponseEntity,之前没用过,网上的资料看不太清楚
  •  @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML  数据,需要注意的呢,在使用此注解之后不会再走...
  • 在springmvc中当返回值是String时,如果不加@ResponseBody的话,返回的字符串就会找这个String对应的页面,如果找不到会报404错误。 如果加上@ResponseBody注解的话,返回的就是json字符串,并且把这个json字符串...
  • 将方法的返回值通过适当的转换器转换为指定的格式之后,写入到 response 对象的 body 区),通常用来给客户端返回 JSON 数据或者是 XML 数据。 当方法上面没有写 ResponseBody 时,底层会将方法的返回值封装为 ...
  •  原因是@Responsebody 注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,返回值不会被解析为跳转路径,而是直接写入 HTTP 响应正文中,而注意Response.getWriter().print(JavaBean);...
  • 1 如果使用通用mapper的查数据库,查询数据库时控制台可以看到字段的false|ture,返回前端如果使用ResponseBody|ResponseEntity则可能存在前端获取缺少该字段,为什么是可能,因为刚开始运行好几次没问题,用着用着就...
  • @RequestMapping(value="/checkGetWriterError", produces = MediaType....@ResponseBody public ServiceResponse&lt;String&gt; checkGetWriterError(HttpServletResponse response) thr...
  •  @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML  数据,需要注意的呢,在使用此注解之后不会再走...

空空如也

1 2 3 4 5 ... 20
收藏数 1,423,256
精华内容 569,302
关键字:

response