1、Requst获得请求的数据(各自方法和通用方法)和通用方法的中文乱码 || 2、Request请求转发

1、Requst获得请求的数据(各自方法和通用方法)和通用方法的中文乱码 || 2、Request请求转发要得到他俩的请求内容当然要先继承

Requst获取请求数据

在这里插入图片描述

请求的数据分为两种getpost,要得到他俩的请求内容当然要先继承HttpServlet类,并且重写doGetdoPost方法

  • get请求的数据是直接显示在请求行中
  • post是显示在请求体中,所以需要通过表单,再在网页输入内容后才可以看到请求的内容

看注释:下面主要写的是get方法获得请求数据,post方法相关的写的比较少

package com.ittomcatpojo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;

@WebServlet("/Demo05")
public class ServletDemo05 extends HttpServlet { 
   
    public void doGet(HttpServletRequest request ,HttpServletResponse response){ 
   
    	//想知道当前数据的请求方式是啥,是get还是post
        String method=request.getMethod();
        System.out.println(method);
        //获得虚拟路径目录,就是上图中请求行中的第二个‘/’中的内容
        String contextPath=request.getContextPath();
        System.out.println(contextPath);
        //获得当前项目的进行Requst请求的类的直接路径
        StringBuffer requestURL=request.getRequestURL();
        System.out.println(requestURL);
        //获得相对的地址
        String requestURI=request.getRequestURI();
        System.out.println(requestURI);
        //获得请求参数,就是我们在进行操作的时候输入的参数,
        //现在我想看看当时输入的是什么
        String queryString=request.getQueryString();
        System.out.println(queryString);
        //查看请求头,这里着重显示了我当前用的是哪个浏览器,
        //来呈现当前项目的效果
        String header=request.getHeader("user-agent");
        System.out.println(header);
    }

	//想要获取post的一些内容得先在网页上填东西,
	//就是关于表单的那个访问方法
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
   
    	//获得请求参数,就是我们在进行操作的时候输入的参数,
        //现在我想看看当时输入的是什么
        BufferedReader reader=req.getReader();
        String readLine=reader.readLine();
        System.out.println(readLine);
        StringBuffer requestURL =req.getRequestURL();
        System.out.println(requestURL);
    }
}

对了,一定要看看这个
url和uri的区别
如果还是迷糊getpost就看这个——>>>post和get怎样简单操作

Request获得请求参数的通用方法:

见名知意,不用区分getpost方法:
1、Requst获得请求的数据(各自方法和通用方法)和通用方法的中文乱码 || 2、Request请求转发
是将请求数据打包成Map集合

  • 方法一是将集合遍历,那么所有的数据都会打印出来,想要的不想要的都会打印出来
  • 方法二是将想知道的数据,通过获取键来得到相对应的所有值,即想要取得一个键的所有对应值
  • 方法三是只想取得一个值时,就用它,即所获取的键的值只有一个,不像方法二中的一样滥情,一个键中贼多值

a.html:表单:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/tomcat-demo01/Demo06" method="post">
    <input name="username" type="text">
    <input name="password" type="password">
    <input name="interest" type="checkbox" value="1">游泳
    <input name="interest" type="checkbox" value="2">骑行<br>
    <input type="submit">
</form>
</body>
</html>

继承了HttpServlet类的实现类:

package com.ittomcatpojo;

import javax.servlet.ServletException;
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.Map;

@WebServlet("/Demo06")
public class ServletDemo06 extends HttpServlet { 
   
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
   

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
   
        Map<String, String[]> map = req.getParameterMap();
        for (String s:map.keySet()) { 
   
            System.out.print(s+": ");
            String[] v=map.get(s);
            for (String a:v) { 
   
                System.out.print(a+" ");
            }
        }

        System.out.println();

        //获取表单中的interest的一个值,这个值取决于前端页面选的啥
        String[] reqParameterValues=req.getParameterValues("interest");
        for (String b:reqParameterValues) { 
   
            System.out.print(b+": ");
        }

        System.out.println("_____________________________________________________");

        //直接获取表单中指定的元素的值
        String reqParameter=req.getParameter("username");
        System.out.println(reqParameter);
    }
}

通用方法简便写法:

将上面实现类的方法写入doGet()方法中,然后在doPost()方法中写调用doGet()方法,因为上面这套是两种请求方式通用的方法,所以不用全部单独的每一个方法写一个
通过post来进入,这种更安全

package com.ittomcatpojo;

import javax.servlet.ServletException;
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.Map;

@WebServlet("/Demo06")
public class ServletDemo06 extends HttpServlet { 
   
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
   
        req.setCharacterEncoding("UTF-8");
        Map<String, String[]> map = req.getParameterMap();
        for (String s:map.keySet()) { 
   
            System.out.print(s+": ");
            String[] v=map.get(s);
            for (String a:v) { 
   
                System.out.print(a+" ");
            }
        }

        System.out.println();

        //获取表单中的interest的一个值,这个值取决于前端页面选的啥
        String[] reqParameterValues=req.getParameterValues("interest");
        for (String b:reqParameterValues) { 
   
            System.out.print(b+": ");
        }

        System.out.println("_____________________________________________________");

        //直接获取表单中指定的元素的值
        String reqParameter=req.getParameter("username");
        System.out.println(reqParameter);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
   
        this.doGet(req,resp);
    }
}

用post方法:

  • 表单不用变,method仍然是post
  • 老方法获得请求的数据

控制台结果:

username: bbc password: 123 interest: 1 
1: _____________________________________________________
bbc

用get方法:

直接根据实现类中所需要的键值对,来在网页上输入拼接字符串
在这里插入图片描述

控制台结果:

三月 27, 2023 11:00:46 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-bio-8080"]
username: changxuejia password: 123 interest: 1 
1: _____________________________________________________
changxuejia

通用方法时的中文乱码:

  • 浏览器的编码为UTF-8,TomCat的解码方式为ISO-8859-1,所以在浏览器输入的如果是中文,那么想获得请求数据的时候就会在控制台获得乱码
  • 注: 从TomCat8就不会出现这种问题了,其将编码默认格式改成了UTF-8,但是xml文件里面只有最高到7的版本,所以得用本地集成TomCat
  • 通用方式:ISO-8859-1UTF-8两个编码方式的底层的二进制都是一样的,即字节都是一样的,所以可以将从浏览器获得的经过ISO=8859-1解码之后的数据转换成字节数组,再将字节数组转换为String字符类型,然后输出出来

post:

doget()方法中的第一行添加代码,将编码格式设置为为UTF-8:req.setCharacterEncoding("UTF-8");,然后网页上输入中文也 OK

get:

使用上面提到的通用方式:输出结果显示中文乱码消失了

package com.ittomcatpojo;

import javax.servlet.ServletException;
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.nio.charset.*;

@WebServlet("/Demo06")
public class ServletDemo06 extends HttpServlet { 
   
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
   


        //直接获取表单中指定的元素的值
        String reqParameter=req.getParameter("username");
        //用ISO编码的方式将上面的ISO解码之后的数据转换为字节文件
        byte[] bytes=reqParameter.getBytes(StandardCharsets.ISO_8859_1);
        将字节数组装换为字符,其中用到了utf-8进行解码
        String s=new String(bytes,"UTF-8");
        System.out.println(s);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
   
        this.doGet(req,resp);
    }
}

Request请求转发

数据一般需要经过多个处理才能得到需要的结果,于是就得在TomCat服务器的范围内进行跳转

在这里插入图片描述

图片中的请求转发资源间共享数据:

  • 先将数据存储到request域中(输入表单中想要的键值对),(然后再将实现方式写一下,就是这块上面的那个实现方式,意思是建立了两个类之间的连接)
  • 获得存入的数据(一般用在被传递的类中)
  • 删除存入的数据(一般用在被传递的类中)

请求转发:

  • 网页的地址不用变,里面的转换由TomCat服务器来完成
  • 转发不可以跳出当前的TomCat服务器

今天的文章1、Requst获得请求的数据(各自方法和通用方法)和通用方法的中文乱码 || 2、Request请求转发分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/80774.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注