java request怎么定义_JavaWeb之 request

response简介

response是响应对象,用来在Servlet的service()方法中向客户端响应数据。

response的功能如下:设置响应头

发送状态码

设置响应正文

重定向

相关方法

状态码相关:200表示成功、302表示重定向、404表示客户端错(访问的资源不存在)、500表示服务器端错

sendError(int sc) --发送错误状态码,例如404、500

sendError(int sc, String msg) --也是发送错误状态码,还可以带一个错误信息! setStatus(int sc) --发送成功的状态码,可以用来发送302

响应头相关:

Content-Type、Refresh、Location

等等 头就是一个键值对!可能会存在一个头(一个名称,一个值),也可能会存在一个头(一个名称,多个值!)

setHeader(String name, String value):适用于单值的响应头,例:response.setHeader("aaa", "AAA");

addHeader(String name, String value):适用于多值的响应头

response.addHeader("aaa", "A");

response.addHeader("aaa", "AA");

response.addHeader("aaa", "AAA");

setIntHeader(String name, int value):适用于单值的int类型的响应头

response.setIntHeader("Content-Length", 888);

addIntHeader(String name, int value):适用于多值的int类型的响应头

setDateHeader(String name, long value):适用于单值的毫秒类型的响应头

response.setDateHeader("expires", 1000 * 60 * 60 * 24);

addDateHeader(String name, long value):适用于多值的毫秒类型的响应头

response响应正文

响应体:通常是html、也可以是图片!

response的两个流:

ServletOutputStream,用来向客户端发送字节数据。

ServletOutputStream out = resopnse.getOutputStream();

PrintWriter,用来向客户端发送字符数据!需要设置编码。PrintWriter writer = response.getWriter();两个流不能同时使用!ServletOutputStream getOutputStream():用来向客户端响应字节数据; PrintWriter getWriter():用来向客户端响应字符数据;

response.getWriter().print("你好");//向客户端响应字符数据 response.getOutputStream().write(bytes);//向客户端响应字节数据

response字符编码

Tomcat响应数据默认使用ISO-8859-1 通常浏览器默认使用GBK编码 response.setCharacterEncoding("utf-8");//设置response.getWriter()的字符编码

1) response.getWriter().print("大家好"); 因为Tomcat默认使用的是ISO-8859-1编码,不支持中文。所以一定编码!

2) response.setCharacterEncoding("utf-8"); response.getWriter().print("大家好"); 因为已经设置了字符流编码为utf-8,所以响应给客户端的数据为utf-8编码! 但因为浏览器默认使用的是gbk来解析响应数据,所以乱码!如果浏览器使用utf-8编码,那么就不会乱码了。

3) response.setCharacterEncoding("gbk"); response.getWriter().print("大家好"); 因为设置了字符流编码为gbk,所以响应给客户端的数据为gbk编码! 因为浏览器默认使用gbk来解析数据,所以不会出现乱码!如果浏览器使用utf-8编码,那么就会出现乱码!

4) response.setContentType("text/html;charset=utf-8"); response.getWriter().print("大家好"); setContentType()方法有两个作用: 设置字符流编码。等同与调用了response.setCharacterEncoding("utf-8"); 设置Content-type响应头,即通知浏览器响应数据的编码为utf-8。 因为设置字符流的编码为utf-8,所以响应给客户端数据为utf-8编码 因为设置了Content-type头为utf-8,所以浏览器会使用utf-8来解析响应数据 没有乱码!

5) response.setContentType("text/html;charset=gbk"); response.getWriter().print("大家好"); 设置了字符流为gbk,所以响应给客户端的数据为gbk 设置了Content-type头为gbk,所以通知浏览器响应数据为gbk编码 没有乱码!

6) response.setHeader("Content-type", "text/html;charset=utf-8") 等同于 repsonse.setContentType("text/html;charset=utf-8")

7) response.getOutputStream().write("大家好".getBytes("gbk")); 响应的数据是gbk编码 客户端浏览器默认使用gbk编码 所以没有乱码

response字符流缓冲区

response字符流缓冲区大小为8KB,当向字符流中写入数据后,数据可能只在缓冲区中,而没有发送到浏览器。 可以调用response.flushBuffer()或response.getWriter().flush()方法刷新缓冲区,把数据发送到浏览器。

设置响应头

response.setHeader("Content-type", "text/html;charset=utf-8"); 等同于 response.setContentType("text/html;charset=utf-8");

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

指定状态码

response.setStatus(200):设置状态码为200 response.sendError(404, “您要查找的资源不存在”):设置状态码为404 repsonse.sendError(500, “服务器出氏了”):设置状态码为500

在调用sendError()方法时,不只是设置了状态码,而且还会给浏览器一个显示错误的页面。

重定向

response.sendStatus(302); repsonse.setHeader("Location", "http://www.baidu.com");

快捷的方法重定向:

response.sendRedirect("http://www.baidu.com");重定向是两次请求

重定向不局限与当前应用,也可以是其他应用,例如重定向到百度

重定向响应码为302,而且必须有Location响应头

重定向与response响应流同时使用。

有趣小案例

案例一【不让看访问到的资源】

/*** @author Yuan-9826*/

@WebServlet("/res/aservlet")

public class AServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {

System.out.println("成功访问.......");

response.sendError(404,"对不起,您访问的资源存在,但就是不给您看!");

}

}

案例二【禁止浏览器缓存页面】

response.setDateHeader("expires",-1);

案例三【演示重定向】

/*** 演示重定向* @author Yuan-9826*/

@WebServlet(name = "bservlet",value = "/res/bservlet")

public class BServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response) {

System.out.println("BServlet.............");

/*** 重定向* 1.设置Location* 2.发送302* 注意:跳转的servlet如果是同级目录下 就只写当前路径下后面那段servlet的URL*/

response.setHeader("Location","aservlet");

response.setStatus(302);

}

}

案例四【演示定时刷新/定时重定向】

package com.yuan.web.response;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

/*** @author Yuan-9826*/

@WebServlet("/res/cservlet")

public class CServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {

//发送响应体 response.getWriter().println("这就是响应体");

response.getWriter().println("This is responseBody");

response.setHeader("Refresh","5;URL=bservlet");

}

}

案例五【禁止浏览器缓存,并且刷新个不停】

package com.yuan.web.response;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.util.Date;

/*** @author Yuan-9826*/

@WebServlet("/res/dservlet")

public class DServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {

response.setHeader("Cache-Control", "no-cache");

response.setHeader("pragma", "no-cache");

response.setDateHeader("expires", -1);

System.out.println("DServlet................");

response.getWriter().println(new Date());

//这么做页面就会刷新个不停 response.setHeader("Refresh","0;URL=dservlet");

}

}

案例六【快捷重定向】

package com.yuan.web.response;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

/*** @author Yuan-9826*/

@WebServlet("/res/EServlet")

public class EServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {

System.out.println("EServlet..............");

//快捷从定向 response.sendRedirect("dservlet");

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值