1.HttpServletRequest及其作用
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。
1、概念:
HttpServletRequest对象代表客户端的请求,封装了请求信息;
2、request工作原理图
3、小结
1、HttpServletRequest对象:HttpServletRequest对象代表了客户端的请求,封装了请求信息;
2、HttpServletRequest对象的作用:封装请求数据(请求行,请求头和请求体)以及一些API;
2.Request常用API
request对象将请求数据封装并且提供了获取这些请求数据的API,这些API可以分为以下几类:
1. 获取请求行信息:请求方式,url和HTTP版本。
2. 获取请求头信息:浏览器类型,ip地址等。
3. 获取请求参数:url后面拼接的参数或者请求体中提交的参数;
2.1获取请求行信息
请求行中包含请求方式,url和协议/版本信息,以下API可或者这些信息。
方法 | 说明 |
---|---|
String getMethod() | 获取请求方式的类型 |
StringBuffer getRequestURL() | 获取客户端发出请求完整URL |
String getRemoteAddr() | 获取IP地址 |
String getProtocol() | 获取当前协议的名称和版本 |
步骤:
1、创建一个Servlet类:RequestRowServlet;
2、设置映射路径为:/requestRowServlet;
3、在doGet方法中分别调用request的以下方法,并打印;
getMethod():获取请求方式
getRequestURL():获取请求的url
getRemoteAddr():获取请求的ip地址
getProtocol():获取当前协议的名称和版本
4、访问/requestRowServlet查看控制台上的打印信息:
实现: 使用request对象获取请求头信息
1、创建一个Servlet类:RequestRowServlet;
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;
/**
* @author suyi
* @version v1.0
* @date 2018/12/8 20:34
* @description TODO
**/
@WebServlet(urlPatterns = "/requestRowServlet")
public class RequestRowServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
2、设置映射路径为:/requestRowServlet;
3、在doGet方法中分别调用request的以下方法,并打印;
getMethod():获取请求方式
getRequestURL():获取请求的url
getRemoteAddr():获取请求的ip地址
getProtocol():获取当前协议的名称和版本
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求行的请求方式
String method = request.getMethod();
System.out.println("method = " + method);
//获取请求行的请求URL
StringBuffer requestURL = request.getRequestURL();
System.out.println("requestURL = " + requestURL);
//获取请求行的请求IP
String remoteAddr = request.getRemoteAddr();
System.out.println("remoteAddr = " + remoteAddr);
//获取请求行的协议版本号
String protocol = request.getProtocol();
System.out.println("protocol = " + protocol);
}
4、启动tomcat,访问这个servlet,查看控制台打印信息;
method = GET
requestURL = http://localhost:8080/httpRequestServlet
remoteAddr = 0:0:0:0:0:0:0:1
protocol = HTTP/1.1
小结:
1、获取请求行的API:
获取请求方式:getMethod()
获取请求url:getRequestURL()
获取请求的ip:getRemoteAddr()
获取请求的协议/版本号:getProtocol()
2、注意事项:
当请求的ip为localhost的时候,getRemoteAddr方法获取的是IPv6的格式。
2.2 获取请求头信息
浏览器的请求头信息是由很多:形式的数据组成的。HttpServletRequest对象给我们提供了两个方法用来获取请求的头信息。
方法 | 作用 |
---|---|
String getHeader(String name) | 根据请求头的k关键字获取请求头信息 |
Enumeration getHeaderNames() | 返回此请求包含的所有头信息的枚举 |
【说明】请求头的k关键字如下表所示:
请求头key | 请求头value |
---|---|
referer | 浏览器通知服务器,当前请求来自何处,如果是直接访问,则不会有这个头。常用于:防盗链 |
cookie | 与会话有关技术,用于存放浏览器缓存的cookie信息。 |
user-agent | 浏览器通知服务器,客户端浏览器与操作系统相关信息 |
host | 请求的服务器主机名 |
… | … |
步骤:
1、创建一个Servlet类RequestHeaderServlet,设置映射地址为/requestHeaderServlet;
2、在doGet方法中获取请求头user-agent的值和所有的请求头的name值;
3、将获取的结果打印输出到控制台上;
4、启动tomcat,访问该Servlet;
实现: 使用request对象获取常用请求头信息
1、创建一个Servlet类RequestHeaderServlet,设置映射地址为/requestHeaderServlet;
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.Enumeration;
/**
* @author suyi
* @version v1.0
* @date 2018/12/8 21:09
* @description TODO
**/
@WebServlet(urlPatterns = "/requestHeaderServlet")
public class RequestHeaderServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
2、在doGet方法中获取请求头user-agent的值和所有的请求头的name值;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//请求头学习
//获取user-agent 对应value值
String header = request.getHeader("user-agent");
System.out.println("user-agent = " + header);
//获取所有请求key信息
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()){
System.out.println(headerNames.nextElement());
}
}
3、将获取的结果打印输出到控制台上;
4、启动tomcat,访问该Servlet,查看控制台上的打印信息;
user-agent = Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
host
connection
cache-control
upgrade-insecure-requests
user-agent
accept
accept-encoding
accept-language
cookie
小结:
1、获取指定请求头的信息: request.getHeader("name");
2、获取所有的请求头的key值:request.getHeaderNames();
3、常用请求头:user-agent
2.3 获取请求数据【重要】
由于get和post请求提交数据的格式都是name=value,request给我们提供了getParameter(name)方法,获取指定name属性值的标签提交的value值。
request获取请求数据的API如下:
方法名 | 描述 |
---|---|
String getParameter(String name) | getParameter获得指定参数名对应的值。如果没有返回null,如果只有多个获得第一个。 例如:username=jack |
String[] getParameterValues(name) | getParameterValues[] 获取请求数据key相同的多个数据 |
request.getParameterMap(); | 获得所有表单的数据,封装到map中 |
步骤:
1、编写注册页面register.html;
2、编写Servlet类接收注册页面提交的数据;
3、在Servlet类中分别使用上述3个API获取表单提交的数据,并打印到控制台上;
4、启动tomcat,访问注册页面,填写数据并提交。在后台控制台中查看打印信息;
实现: 使用request对象的API获取表单提交的数据
1、编写注册页面register.html;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/registerServlet" method="post">
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
爱好:<input type="checkbox" name="hobby" value="basketball"/>篮球
<input type="checkbox" name="hobby" value="football"/>足球
<input type="checkbox" name="hobby" value="pingpang"/>乒乓球<br/>
学历:<select name="education">
<option value="gaozhong">高中</option>
<option value="dazhuan">大专</option>
<option value="benke">本科</option>
</select>
<br>
<input type="submit" value="post提交"/>
</form>
</body>
</html>
2、编写Servlet类接收注册页面提交的数据;
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.Arrays;
import java.util.Map;
/**
* @author suyi
* @version v1.0
* @date 2018/12/8 21:33
* @description TODO
**/
@WebServlet(urlPatterns = "/registerServlet")
public class RegisterServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//非常重要API 请求参数/请求体API
//获取用户名
System.out.println("============getParameter方法获取指定name的value值===================");
String username = request.getParameter("username");
System.out.println("username = " + username);
String password = request.getParameter("password");
System.out.println("password = " + password);
//请求爱好
System.out.println("===============getParameterValues根据name获取多个value值===================");
String[] hobbies = request.getParameterValues("hobby");
String s = Arrays.toString(hobbies);
System.out.println("s = " + s);
//获取表单所有信息
System.out.println("===============getParameterMap获取所有的数据封装到map中==================");
Map<String, String[]> parameterMap = request.getParameterMap();
//获取用户输入所有值
for (String key : parameterMap.keySet()) {
System.out.println(key+"="+Arrays.toString(parameterMap.get(key)));
}
}
}
3、在Servlet类中分别使用上述3个API获取表单提交的数据,并打印到控制台上;
4、启动tomcat,访问注册页面,填写数据并提交。在后台控制台中查看打印信息;
小结:
1、根据name值获取value值: request.getParameter();
2、根据name值获取多个value值:request.getParameterValues();
3、获取所有的请求数据,封装到map中:request.getParameterMap();
注意事项:
请求数据的获取都是根据表单项的name值获取,如果表单项中没有name属性,数据将不会被提交到服务器,后台也就无法获取。
【注意事项】中文乱码问题
描述:post请求提交的中文数据,在Servlet中获取会乱码
1、POST请求提交数据乱码问题:
原因:tomcat接收post请求数据采用的编码是ISO-8859-1,而我们的整个编码环境都是UTF-8。所以会导致乱码。
解决方法:
1、将tomcat编码改为UTF-8;
2、Servlet中获取数据前,将request编码设置为UTF-8:request.setCharacterEncoding("UTF-8");
2、GET请求提交的中文数据乱码问题已经被tomcat处理: