新建项目,创建一个Servlet接口实现类OneServlet,重写doGet方法。
在方法体内,通过请求对象request读取请求行内的【URL】信息和【Method】信息。
package com.tsccg.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author: TSCCG
* @Date: 2021/08/13 17:56
*/
public class OneServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.通过请求对象,读取【请求行】里的【URL】信息
String url = request.getRequestURL().toString();
//2.通过请求对象,读取【请求行】里的【Method】信息
String method = request.getMethod();
System.out.println("url:" + url);
System.out.println("method:" + method);
}
}
通过浏览器向服务器发送一次请求,在后台成功读取到请求的URL和Method信息。
什么是URI?
URI:资源文件精准定位地址。
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.通过请求对象,读取【请求行】里的【URL】信息
String url = request.getRequestURL().toString();
//2.通过请求对象,读取【请求行】里的【Method】信息
String method = request.getMethod();
//3.通过请求对象,读取【URI】信息
String uri = request.getRequestURI();
System.out.println("url:" + url);
System.out.println("method:" + method);
System.out.println("uri:" + uri);
}
通过浏览器访问OneServlet后读取到结果:
url:http://localhost:8080/MyWeb/one
method:GET
uri:/MyWeb/one
新建一个Servlet接口实现类TwoServlet,重写doGet方法,在方法中完成如下操作:
package com.tsccg.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
/**
* @Author: TSCCG
* @Date: 2021/08/13 21:40
* 通过请求对象,获取获取【请求头】或【请求体】中的【请求参数】
*/
public class TwoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.通过请求对象,获取【请求头】中【所有请求参数名】
Enumeration paramNames = request.getParameterNames();//将所有请求参数名保存到一个枚举对象中并返回
//遍历所有请求参数名,遍历方式类似于迭代器
while (paramNames.hasMoreElements()) {
//获取当前请求参数名
String paramName = (String)paramNames.nextElement();
//2.通过请求对象,获取请求参数值,需要请求参数名
String value = request.getParameter(paramName);
System.out.println("请求参数名:" + paramName + " 请求参数值:" + value);
}
}
}
启动服务器,在浏览器地址栏内输入【请求地址】并携带【请求参数】。
http://localhost:8080/MyWeb/two?username=zhangsan&password=123
回车。
后台读取到的信息:
请求参数名:username 请求参数值:zhangsan
请求参数名:password 请求参数值:123
凡是通过浏览器地址栏发送的请求,【请求方式】都是GET,【请求参数信息】会存在【请求头】中。
新建一个Servlet接口实现类ThreeServlet,重写doGet和doPost方法。
分别在两个方法体内读取请求参数信息:
package com.tsccg.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author: TSCCG
* @Date: 2021/08/13 22:29
*/
public class ThreeServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过请求对象,获取【请求体】里的请求参数值
String password = request.getParameter("password");
System.out.println("从请求体里获取的请求参数值:" + password);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过请求对象,获取【请求头】里的请求参数值
String username = request.getParameter("username");
System.out.println("从请求头里获取的请求参数值:" + username);
}
}
目前,post方式只有通过表单设置,所以需要写一个页面。
在web目录下创建一个html文件:Three.html
编写两个表单标签,分别通过get和post方式访问ThreeServlet,且通过文本框携带请求参数信息。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>访问ThreeServlet</title>
</head>
<body>
<!-- 通过get方式请求访问ThreeServlet -->
<form action="http://localhost:8080/MyWeb/three" method="get">
用户名:<input type="text" name="username"><br/>
<input type="submit" value="使用get方式请求访问ThreeServlet">
</form>
<!-- 通过post方式请求访问ThreeServlet -->
<form action="http://localhost:8080/MyWeb/three" method="post">
密码:<input type="text" name="password"><br/>
<input type="submit" value="使用post方式请求访问ThreeServlet">
</form>
</body>
</html>
开启服务器,通过浏览器访问Three.html页面。
先使用get方式访问:
再通过post方式访问:
可见,通过post方式访问,所携带的请求参数信息并没有储存在请求头中,而是存储在请求体内。
当我们在Three.html中表单内:
在使用get方式访问ThreeServlet的文本框中写入中文时,后台能读取到正常请求参数信息
在使用post方式访问ThreeServlet的文本框中写入中文时,后台显示乱码。
问题:
当以GET方式发送中文参数内容时,得到正常结果【张三】
当以POST方式发送中文参数内容时,得到乱码【??????】
原因:
当浏览器以GET方式发送请求时:
当浏览器以POST方式发送请求时:
解决方法:
在POST请求方式下,在读取请求体内容之前,通知请求对象使用【utf-8】字符编码集对请求体内容进行一次重新解码。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通知请求对象,使用utf-8字符集对请求体内的二进制内容进行一次重新解码
request.setCharacterEncoding("utf-8");
//通过请求对象,获取【请求体】里的请求参数值
String password = request.getParameter("password");
System.out.println("从请求体里获取的请求参数值:" + password);
}
JavaWeb-03-Servlet-05-HttpServletRequest接口
原文:https://www.cnblogs.com/TSCCG/p/15139524.html