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

1、Requst获得请求的数据(各自方法和通用方法)和通用方法的中文乱码 || 2、Request请求转发该文章介绍了如何在 JavaServlet 中处理 GET 和 POST 请求 包括获取请求数据 请求头信息以及请求参数

大家好,欢迎来到IT知识分享网。

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

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服务器

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/122091.html

(0)
上一篇 2025-10-19 13:00
下一篇 2025-10-19 13:15

相关推荐

发表回复

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

关注微信