10.request和response

1. response

  • 作用:往浏览器写东西
  • 组成部分:响应行 响应头 响应体

1.1 操作响应行

格式:协议/版本 状态码 状态码说明
状态码:
1xx:已发送请求
2xx:已完成响应
    200:正常响应
3xx:还需浏览器进一步操作
    302:重定向 配合响应头:location
    304:读缓存
4xx:用户操作错误
    404:用户操作错误.
    405:访问的方法不存在
5xx:服务器错误
    500:内部异常
常用方法:
setStatus(int 状态码):针对于 1 2 3 
sendError(int 状态码):针对于 4xx和5xx

1.2 操作响应头

格式:key/value(value可以是多个值)
1.2.1 常用的方法:
setHeader(String key,String value):设置字符串形式的响应头
了解:setIntHeader(String key,int value):设值整形的响应头
了解:setDateHeader(String key,long value):设值时间的响应头

addHeader(String key,String value):添加置字符串形式的响应头 之前设置过则追加,若没有设置过则设置
了解:addIntHeader(String key,int value):添加整形的响应头
了解:addDateHeader(String key,long value):添加时间的响应头
1.2.2 常用的响应头:
  • location:重定向
  • refresh:定时刷新
  • content-type:设置文件的mime类型,设置响应流的编码及告诉浏览器用什么编码打开
  • content-disposition:文件下载
重定向:
方式1:
    ★response.sendRedirect("/day10/loc2");
方式2:
    response.setStatus(302);
    respooen.setHeader("location","/day10/loc2");
定时刷新:
方案1:设置头 refresh 
    respooen.setHeader("refresh","秒数;url=跳转的路径");
方案2:http的meta标签
    <meta http-equiv="refresh" content="3;url=/day10/refresh2.html">

1.3 操作响应体:页面上要展示的内容

1.3.1 常用方法:
Writer getWriter():字符流
ServletOutputStream getOutputStream() :字节流

自己写的东西用字符流,其他一概用字节流.
1.3.2 处理响应中文乱码:
方式1:★
    response.setContentType("text/html;charset=utf-8");
方式2:理解
    response.setHeader("content-type", "text/html;charset=utf-8");
注意:
两个流互斥
当响应完成之后,服务器会判断一下流是否已经关闭,若没有关闭,服务器会帮我们关闭.(底层使用的缓冲流)

文件下载

  1. 设置文件的mime类型

    String mimeType=context.getMimeType(文件名)
    response.setContentType(mimeType);
    
  2. 设置下载头信息 content-disposition

    response.setHeader("content-disposition", "attachment;filename="+文件名);
    
  3. 提供流

    response.getOutputStream();
    
  4. 文件名乱码

    String filename = request.getParameter("name");
    filename = new String(filename.getBytes("iso8859-1"), "utf-8");
    
扩展:使用commons-io工具类
//方式3 使用工具类编码
    String _filename = DownLoadUtils.getName(request.getHeader("user-agent"), filename);
    response.setHeader("content-disposition","attachment;filename="+_filename );
对拷流:IOUtils.copy(is,os);
实例代码
String filename = request.getParameter("name");

//注意中文乱码
filename = new String(filename.getBytes("iso8859-1"), "utf-8");

ServletContext context = this.getServletContext();
context.getMimeType(filename);
InputStream is = context.getResourceAsStream("/download/"+filename);
//获取输出流
    ServletOutputStream os = response.getOutputStream();
IOUtils.copy(is,os);
os.close();
is.close();

2. request(请求)

  • 作用:获取浏览器发送过来的数据
  • 组成部分:请求行 请求头 请求体

2.1 操作请求行

  • 格式:请求方式 请求资源 协议/版本
2.1.1 常用方法:HttpServletRequest
掌握
    String getMethod():获取请求方式
    String getRemoteAddr():获取ip地址
    String getContextPath() :在java中获取项目名称  (/day10)

了解:
    getRequestURI():获取的是 从项目名到参数之前的内容  /day10/regist
    getRequestURL():获取的带协议的完整路径   http://localhost/day10/regist
    String getQueryString():get请求的所有参数   username=tom&password=123
    String getProtocol():获取协议和版本

例如:请求行
GET /day10/row?username=tom&password=123 HTTP/1.1   

2.2 操作请求头

  • 格式:key/value(value可以是多个值)
2.2.1 常用方法:
String getHeader(String key):通过key获取指定的value (一个)

了解:
    Enumeration getHeaders(String name) :通过key获取指定的value(多个)
    Enumeration getHeaderNames() :获取所有的请求头的名称
    int getIntHeader(String key):获取整型的请求头
    long getDateHeader(String key):获取时间的请求头
2.2.2 重要的请求头:
user-agent:浏览器内核 msie firefox chrome
referer:页面从那里来 防盗链

2.3 操作请求参数

username=tom&password=123&hobby=drink&hobby=sleep
2.4 常用方法:
String getParameter(String key):获取一个值
String[] getParameterValues(String key):通过一个key获取多个值
Map<String,String[]> getParameterMap():获取所有的参数名称和值

2.3 请求的中文乱码:

  • 对于get请求:参数追加到地址栏,会使用utf-8编码,服务器(tomcat7)接受到请求之后,使用iso-8859-1解码,所以会出现乱码
  • 对于post请求,参数是放在请求体中,服务器获取请求体的时候使用iso-8859-1解码,也会出现乱码
2.3.1 通用的方法:
new String(参数.getBytes("iso-8859-1"),"utf-8");
针对于post请求来说:只需要将请求流的编码设置成utf-8即可
    request.setCharacterEncoding("utf-8");
处理中文响应乱码
response.setContentType("text/html;charset=utf-8");

3. 域对象:

3.1 request:

  • 创建:一次请求来的时候
  • 销毁:响应生成的时候
  • 作用:一次请求里面的数据
  • 请求转发(请求链,请求串)

    request.getRequestDispatcher("内部路径").forward(request,response);
    

4. 封装对象:apache提供的一个工具类,BeanUtils

  • 封装数据
  • 使用步骤:

    • 导入jar包(commons-beanutils-1.8.3.jar)
    • 调用 BeanUtils.populate(Object bean,Map<> 参数);

      BeanUtils.populate(user, request.getParameterMap());
      

请求转发和重定向区别:

  • 重定向发送两次请求,请求转发一次请求

  • 重定向地址栏发生改变,请求转发不变

  • 重定向是从浏览器发送,请求转发是服务器内部

  • 重定向不存在request域对象,请求转发可以使用request域对象

  • 重定向是response的方法,请求转发是request的方法

  • 重定向可以请求站外资源,请求转发不可以,如跳转到银行页面

    request.getRequestDispatcher("/内部路径").forward(request,response);
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值