Requst获取请求数据
请求的数据分为两种
get
和post
,要得到他俩的请求内容当然要先继承HttpServlet类,并且重写doGet
和doPost
方法
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的区别
如果还是迷糊get
和post
就看这个——>>>post和get怎样简单操作
Request获得请求参数的通用方法:
见名知意,不用区分
get
和post
方法:
是将请求数据打包成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-1
和UTF-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