千锋逆战班学习日志Day55


千锋逆战班学习第55天
努力或许没有收获,但不努力一定没收获,加油。
今天我学习了request与response。

response操作响应正文(重点)

  • 响应正文
    • 就是浏览器显示的主体内容
  • 常用方法
    • response.getWriter().write():操作响应正文
  • 注意事项
    • 响应正文中文乱码
      • 本质原因,服务器的编码和浏览器的解码,格式不同!
      • setCharacterEncoding(“utf-8”):
        • 告诉服务器,应该以utf-8格式编码响应正文
      • setHeader(“Content-Type”,“text/html;charset=utf-8”):
        • 告诉浏览器 , 响应正文是文本+html标签,应该以utf-8格式解码响应正文
      • setContentType(“text/html;charset=utf-8”)
        • 告诉服务器,应该以utf-8格式编码响应正文
        • 告诉浏览器 , 响应正文是文本+html标签,应该以utf-8格式解码响应正文

request操作请求行

  • 常用方法
    • getRequestURI
      • 获取请求路径
    • getMethod
      • 获取请求方式
    • getRemoteAddr
      • 获取请求ip
    • getLocalPort
      • 获取请求端口
    • getQueryString
      • 请求网址"?"后面的路径

request操作请求头

  • getHeader()
    • 获取指定请求头的值

request操作请求参数(重点)

  • 请求正文
    • post+请求参数
  • 请求参数
    • 不管是get请求 还是 post请求 都有!!!
  • 常用方法
    • getParameter
      • 获取指定请求参数值
    • getParameterNames
      • 获取所有请求参数名称
    • getParameterValues(String parameterName)
      • 获取指定请求参数所有值
    • getParameterMap
      • 键,获取所有请求参数名称 , 相当于getParameterNames方法
      • 值,获取指定请求参数所有值,相当于getParameterValues方法
  • 代码实现
  //获取指定参数值
              String username = request.getParameter("username");
              String password = request.getParameter("password");
              System.out.println("username : " + username + " , password : " + password);
              System.out.println("---------------");
              //获取所有请求参数名称
              Enumeration<String> parameterNames = request.getParameterNames();
              while (parameterNames.hasMoreElements()) {
                  String parameterName = parameterNames.nextElement();
                  String parameterValue = request.getParameter(parameterName);
                  System.out.println("name : " + parameterName + " , value : " + parameterValue);
              }
              System.out.println("---------------");
              //获取指定请求参数所有值
              String[] usernames = request.getParameterValues("username");
              System.out.println(usernames[0]);
              String[] hobbys = request.getParameterValues("hobbys");
              for (String hobby : hobbys) {
                  System.out.println(hobby);
              }
              System.out.println("---------------");
              //获取请求参数对应的map :Map(String,String[])
              //键:请求参数名称  相当于 getParameterNames
              //值:一组请求参数值 相当于 getParameterValues
              Map<String, String[]> parameterMap = request.getParameterMap();
              Set<Map.Entry<String, String[]>> entrySet = parameterMap.entrySet();
              for (Map.Entry<String, String[]> entry : entrySet) {
                  //键 - 请求参数名称
                  String parameterName = entry.getKey();
                  //值 - 一组请求参数值
                  String[] values = entry.getValue();
                  StringBuffer valueStr = new StringBuffer();
                  for (String value : values) {
                      valueStr.append(value + " ");
                  }
                  System.out.println("参数名称 : "+ parameterName + " , 参数值 : " + valueStr);
              }

请求参数中文乱码之post

  • 本质
    • 请求正文中的中文参数乱码
  • 解决方案
    • request.setCharacterEncoding(“utf-8”)
      • 告诉服务器应该以utf-8解码请求正文
    • 逆向,先编码在解码
      • 先将乱码字符串以iso8859-1编码成字节
      • 将字节以utf-8解码成字符串
        username = new String(username.getBytes(“iso8859-1”),“utf-8”);
  • 注意事项
    • 将tomcat容器的URIEncoding=“utf-8”,对Query String中的请求参数有效,对请求正文中无效,对post请求下的中文乱码无效!

请求参数中文乱码之get

  • 本质
    • Query String中的中文参数乱码
  • 解决方案
    • 逆向,先编码在解码
      • 先将乱码字符串以iso8859-1编码成字节
      • 将字节以utf-8解码成字符串
        username = new String(username.getBytes(“iso8859-1”),“utf-8”);
    • 修改tomcat容器的URIEncoding=“utf-8”
  • 注意事项
    • request.setCharacterEncoding(“utf-8”)对get请求无效,告诉服务器应该以utf-8来解码请求正文,跟Query String 没有关系!

请求参数中文乱码终极解决方案

  • 方案
    • tomcat8.5
      • 相当于是tomcat7.0修改了URIEncoding=“utf-8”
      • 就解决了get请求参数中文乱码问题
    • request.setCharacterEncoding(“utf-8”)
      • 就解决了post请求参数中文乱码问题

request操作请求转发

  • 请求转发
    • 服务器中,从一个资源跳转到另外一个资源
  • 流程
    • 浏览器发起请求,请求Demo01Servlet
    • Demo01Servlet,请求转发到Demo02Servlet
    • 在服务器内部,直接从Demo01Servlet跳转到了Demo02Servlet
  • RequestDispatcher dispatcher = request.getRequestDispatcher(“demo09”);
  • dispatcher.forward(request,response)
  • 注意事项
    • 转发只有一次请求

请求转发和重定向的区别

  • 请求次数
    • 重定向有2次请求
    • 转发有1次请求
  • 跳转区别
    • 重定向既可以站内资源进行跳转,站外资源也可以进行跳转
    • 转发只能站内资源进行跳转
  • 路径区别
    • 要转发的资源的相对路径无区别
    • 要转发的资源的绝对路径有区别
      • 重定向,是从先从项目开始找,再找资源
      • 转发,是直接从项目中找资源

request作为域对象

  • 域对象
    • 可以存储数据的对象
  • 回顾ServletContext域对象的作用范
    • 不同设备、当前项目中的任意一个资源都可以访问ServletContext域中的数据!
  • request域对象的作用范围
    • request对象的生命周期
      • 发起请求时,request初始化
      • 响应时,request销毁
    • request域对象的作用范围在一次请求中!
  • request在重定向和转发中使用!
    • 重定向中不能使用request域对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值