Java Web学习day08------request、response

请求对象

1. 获取请求行数据

(1)方法:
  getMethod()获取请求方式
  getContextPath()获取虚拟目录
在这里插入图片描述

2. 获取请求头数据

  getHeader(请求头) 获取指定的请求头中的数据

3. 获取请求体数据

  注意:在servlet中请求对象request使用字节流或者字符流读取数据的时候,浏览器就必须发送post请求才行,get请求流无法获取到数据。
    getReader() 通过请求对象获取字符流对象(可以操作浏览器传过来的文本数据)
    getInputStream()通过请求对象获取字节流对象(可以操作浏览器传过来的所有数据)

4. 获取表单提交的数据[重]

1、常用方法
  request.getParameter(name属性的值) 获取表单提交的数据(根据参数的名称获取参数的值)
  request.getParameterValues(name属性的值) 根据参数的名称获取参数的值的数组(复选框)
  request.getParameterMap() 获取表单提交数据的map集合
2、封装方式
  手动封装,适合少量的数据
  反射封装,几乎不用
  工具类封装,常用(BeanUtils)
3、post请求乱码问题
  根源
    前后编码不一致
      表单提交数据:UTF-8
      服务器接收到数据并转成字符串,用的默认是ISO-8859-1(不支持中文)
  解决
    request.setCharacterEncoding(“utf-8”);

5. 域对象临时存储数据[重要]

1、范围
  时间范围:一次请求开始到结束
  空间范围:当前的请求中
2、方法
  setAttribute()
  getAttribute()
  removeAttribute()

6. 实现请求转发和包含[重要]

1、目的
  一个资源需要多个servlet协同处理,就可以使用请求转发或者包含
2、步骤
(1)首先获取请求的分发器
  RequestDispatcher r = request.getRequestDispatcher("/路径");
(2)转发
  r.forward(request,response);
(3)包含(用的少)
  r.include(request,response);
3、特点
  浏览器的地址不会发生改变
  转发 对于源组件为"留头不留体",目标组件为"留体不留头"(头:请求头 体:响应体, 作为了解)
  包含 对于源组件为"留头又留体",目标组件为"留体不留头"(头:请求头 体:响应体, 作为了解)
  本质都是一次请求,共享了请求和响应对象

响应对象

1. 设置响应行

(1)void setStatus(int sc) 设置状态码
(2)常见的状态码描述
  a) 1XX:浏览器发送的请求不完善,需要浏览器进一步补充资料
  b) XX:响应正常完成
  c) 3XX:本次请求已经完成,但是需要浏览器进一步操作
  d) 4XX:请求资源错误 404:资源找不到 405:请求方式没有对应的方法
  c) 5XX:服务器范的错

2. 设置响应头

1、通用的方法
  setHeader()
2、可以设置不同的头,来实现不同的功能
(1)设置缓存时间
  response.setDateHeader(“Expires”,0) 不缓存页面
(2)设置定时刷新(定时跳转)
  设置Refresh头
    a) response.setHeader(“Refresh”,“3”)每3秒刷新一次(当前页面) 炒股,直播
    b) response.setHeader(“Refresh”,“3;url=路径”)3秒之后跳转到指定页面
(3)实现重定向(立即跳转)
  a) 设置location头
    response.setHeader(“location”,“路径”); response.setStatus(302)
    简化写法 response.sendRedirect(“路径”)
  b) 和转发的区别
    aa) 请求响应的次数
      转发:一次请求,一次响应
      重定向:两次请求,两次响应
    bb)浏览器的地址
      转发:地址栏保持初值不变
      重定向:改为重定向之后的地址
    cc) 作用范围
      转发:只能在同一个项目中
      重定向:可以定位到其他项目或者其他服务器
    dd) url的路径
      转发:不需要加上虚拟目录
      重定向:需要加上虚拟目录
    ee) 变量的作用域
      转发:可以使用request域对象可以共享数据
      重定向:因为重新发了一个请求,不能用request域对象可以共享数据
    ff) 各自的优点
      转发:相对的高效,可以共享同一个请求对象,可以隐藏实际的链接地址
      重定向:能够访问其他项目或者服务器上的资源
(4)实现文件下载

3. 设置响应体

1、获取流:
  response.getOutputStream()获取字节流对象,用于在页面中展示音视频,图片等
  response.getWriter().获取字符流对象,用于在页面中展示文本数据
2、显示乱码根源:前后编码不一致
  服务器发送数据:UTF-8
  浏览器接收数据并解析:GBK(中文的IE浏览器)
3、解决:response.setContentType(“text/html;charset=UTF-8”);
  告诉浏览器,我会以utf-8的编码去发送数据,将来浏览器接收到数据之后就会使用utf-8的格式去解码

4. 文件下载

1、两个头
  content-type : 文件类型/流的类型
  content-disposition: attachment 以附件的形式下载
2、两个流
  读服务器上的图片输入流
  把图片数据写到浏览器输出流
3、一对接
  循环读写

5. 路径问题

1、相对路径(把相同的去掉)
  http://localhost:8080/login.html 访问登录页面
  http://localhost:8080/LoginServlet 访问LoginServlet页面

  如果把login.html放在user文件夹下
    http://localhost:8080/user/login.html 访问登录页面
    http://localhost:8080/LoginServlet 访问LoginServlet页面
    现在的正确路径应该改为 …/LoginServlet
  不建议使用相对路径,因为你总是要确定两个路径之间的相对位置
2、使用绝对路径(以/开头)
  /LoginServlet(其实是省略了协议和ip和端口号)

  研究什么时候需要加上虚拟目录
    给客户端使用(从客户端跳到服务器端)
      需要加上虚拟目录(超链接,form表单,img标签的src属性,重定向,刷新)
    给服务器端使用(在当前项目内跳转)
      不需要加上虚拟目录(转发,包含)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值