Java学习第55天---response操作响应正文,请求头,请求行,请求参数,请求参数中文乱码问题,转发,request作为对象

1_response操作响应正文(重点)
基本概念:响应正文就是浏览器显示的主体内容
常用方法:response.getWriter().write();操作响应正文

注意:服务器向浏览器传递数据的时候不是直接传递,而是通过字节,Tomcat服务器编码为iso8859-1,而浏览器的解码格式为utf-8,因此会出现乱码情况
在这里插入图片描述
因此,操作响应正文中文乱码问题,不仅要告诉服务器编码格式,也要告诉浏览器解码格式,如下:

  • 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格式解码响应正文

02_request操作请求行
常用方法:

 //获取请求路径
        String requestURI = request.getRequestURI();
        System.out.println(requestURI);
        //获取请求方式
        String method = request.getMethod();
        System.out.println(method);
        //获取请求ip
        String remoteAddr = request.getRemoteAddr();
        System.out.println(remoteAddr);
        //获取请求端口
        int port = request.getLocalPort();
        System.out.println(port);
        //获取请求网址后的请求参数
        String queryString = request.getQueryString();
        //在网址后的请求参数,如果要使用,需要做字符串的拆分!!
        System.out.println(queryString);
        //SpringMVC:前后端交互使用的是json字符串,json解析 --> java对象!!

03_request操作请求头
getHeader():获取指定请求头的值

4_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);
        }

5_请求参数中文乱码之post
本质:请求正文中的中文参数乱码
在这里插入图片描述
浏览器的编码和服务器的解码不一致导致的

解决方案 1
告诉服务器应该以utf-8解码请求正文

request.setCharacterEncoding("utf-8")

解决方案 2
逆向,将乱码以iso8859-1解码成字节,再将字节以utf-8解码成字符串
在这里插入图片描述

username = new String(username.getBytes("iso8859-1"),"utf-8");

注意:将tomcat容器的URIEncoding=“utf-8”,对Query String中的请求参数有效,对请求正文中无效,对post请求下的中文乱码无效!

6_请求参数中文乱码之get
get方式没有请求正文,所以通过以上方式不能解决,本质为Query String中的中文参数乱码

解决方案 1:逆向,将乱码以iso8859-1解码成字节,再将字节以utf-8解码成字符串

username = new String(username.getBytes("iso8859-1"),"utf-8");

解决方案 2:
修改tomcat容器的URIEncoding=“utf-8”

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           URIEncoding="utf-8"
           redirectPort="8443" />

修改方式:
在这里插入图片描述
在这里插入图片描述
验证是否修改成功:
在这里插入图片描述
在这里插入图片描述
注意:request.setCharacterEncoding(“utf-8”)对get请求无效,告诉服务器应该以utf-8来解码请求正文,跟Query String 没有关系!

7_请求参数中文乱码终极解决方案
方案:tomcat8.5
相当于是tomcat7.0修改了URIEncoding=“utf-8”–就解决了get请求参数中文乱码问题
request.setCharacterEncoding(“utf-8”)–就解决了post请求参数中文乱码问题
在这里插入图片描述

8_request操作请求转发

请求转发: 服务器中,从一个资源跳转到另外一个资源
代码:

request.getRequestDispatcher("转发路径").forward(request,response);

流程:

  • 浏览器发起请求,请求Demo01Servlet
  • Demo01Servlet,请求转发到Demo02Servlet
  • 在服务器内部,直接从Demo01Servlet跳转到了Demo02Servlet
    在这里插入图片描述
    注意事项: 转发只有一次请求

9_请求转发和重定向的区别

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

10_request作为域对象
域对象: 可以存储数据的对象

回顾:ServletContext域对象的作用范围–
不同设备、当前项目中的任意一个资源都可以访问ServletContext域中的数据!

request域对象的作用范围

  • request对象的生命周期
    • 发起请求时,request初始化
    • 响应时,request销毁
  • request域对象的作用范围在一次请求中!

request在重定向和转发中使用!

  • 重定向中不能使用request域对象
  • 转发中可以使用request域对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值