HttpServletRequest Request对象:
1. request对象和response对象的原理.
1. request和response对象是由服务器创建的. 我们来使用他们.
2. request对象是来获取请求消息, response对象是来设置响应消息
2. request对象继承体系结构:
ServletRequest -- 接口
| 继承
HttpServletRequest -- 接口
| 实现
org.apache.catalina.connector.RequestFacade 类(Tomcat)
3. request功能:
1. 获取请求消息数据
1. 获取请求行数据
* GET /tomcat/demo1?name=zhangsan HTTP/1.1
* 方法:
1. 获取请求方式: GET
* String getMethod()
2. (重点)获取虚拟目录: /tomcat
* String getContextPath()
3. 获取Servlet路径: /demo1
* String getServletPath()
4. 获取get方式请求参数: name=zhangsan
* String getQueryString()
5. (重点)获取请求URI: /tomcat/demo1
* String getRequestURI(): /tomcat/demo1
* StringBuffer getRequestURL(): http://localhost/tomcat/demo1
* URI: 统一资源标识符: /tomcat/demo1
* URL: 统一资源定位符: http://localhost/tomcat/demo1
6. 获取协议及版本: HTTP/1.1
* String getProtocol()
7. 获取客户机的IP地址:
* String getRemoteAddr()
* 代码:
package cn.xiaoge.web.request;
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: HWB
* @DateTime: 2020/1/27 下午6:51
* @Description: 演示Request对象获取请求行数据
*/
@WebServlet("/requestDemo1")
public class RequestDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 1. 获取请求方式: GET
* * String getMethod()
* 2. (重点)获取虚拟目录: /tomcat
* * String getContextPath()
* 3. 获取Servlet路径: /requestDemo1
* * String getServletPath()
* 4. 获取get方式请求参数: name=zhangsan
* * String getQueryString()
* 5. (重点)获取请求URI: /tomcat/requestDemo1
* * String getRequestURI(): /tomcat/requestDemo1
* * StringBuffer getRequestURL(): http://localhost/tomcat/requestDemo1
* 6. 获取协议及版本: HTTP/1.1
* * String getProtocol()
* 7. 获取客户机的IP地址:
* * String getRemoteAddr()
*
* 浏览器访问路径: http://localhost:8080/tomcat/requestDemo1?name=zhangsan
*/
// 1. 获取请求方式: GET
String method = request.getMethod();
System.out.println(method); // GET
// 2. (重点)获取虚拟目录: /tomcat
String contextPath = request.getContextPath();
System.out.println(contextPath); // /tomcat
// 3. 获取Servlet路径: /requestDemo1
String servletPath = request.getServletPath();
System.out.println(servletPath); // /requestDemo1
// 4. 获取get方式请求参数: name=zhangsan
String queryString = request.getQueryString();
System.out.println(queryString); // name=zhangsan
// 5. (重点)获取请求URI: /tomcat/requestDemo1
String requestURI = request.getRequestURI();
System.out.println(requestURI); // /tomcat/requestDemo1
StringBuffer requestURL = request.getRequestURL();
System.out.println(requestURL); // http://localhost:8080/tomcat/requestDemo1
// 6. 获取协议及版本: HTTP/1.1
String protocol = request.getProtocol();
System.out.println(protocol); // HTTP/1.1
// 7. 获取客户机的IP地址:
String remoteAddr = request.getRemoteAddr();
System.out.println(remoteAddr); // 0:0:0:0:0:0:0:1 (ipv6, 这是自己访问自己)
}
}
2. 获取请求头数据
* 方法:
* (重点)String getHeader(String name): 通过请求头的名臣获取请求头的值
* Enumeration getHeaderNames(): 获取所偶遇的请求头名称
* 代码:
package cn.xiaoge.web.request;
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: HWB
* @DateTime: 2020/1/27 下午6:51
* @Description: 演示Request对象获取请求头数据
*/
@WebServlet("/requestDemo2")
public class RequestDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 演示获取请求头数据
Enumeration<String> headerNames = request.getHeaderNames();
// 遍历 Enumeration<String>就是个迭代器
while(headerNames.hasMoreElements()) {
// 键
String name = headerNames.nextElement();
// 值
String value = request.getHeader(name);
System.out.println(name + "----" + value);
}
}
}
// 运行结果
host----localhost:8080
connection----keep-alive
cache-control----max-age=0
upgrade-insecure-requests----1
user-agent----Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
sec-fetch-user----?1
accept----text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site----none
sec-fetch-mode----navigate
accept-encoding----gzip, deflate, br
accept-language----zh-CN,zh;q=0.9
cookie----JSESSIONID=7D78A3C4F80F9FF29948AB674BCFFFDF; Pycharm-abaea751=c588d849-c872-49ed-b318-b3fef725eeed; Idea-6310fadd=bf2d1837-2817-4f2e-8e3f-888e375ac004; JSESSIONID=C01EE10B142A1B9ACBE745C0EF7B8594
package cn.xiaoge.web.request;
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: HWB
* @DateTime: 2020/1/27 下午6:51
* @Description: 演示Request对象获取请求头数据
*/
@WebServlet("/requestDemo3")
public class RequestDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 演示获取请求头数据
String agent = request.getHeader("user-agent");
// 获取该字符串是否包含Chrome
if (agent.contains("Chrome")) {
System.out.println("谷歌来了..."); // 执行他, 因为我使用谷歌浏览器访问的该资源
} else if(agent.contains("Firefox")) {
System.out.println("火狐来了..");
}
}
}
// 结果
谷歌来了...
3. 获取请求提数据
* 请求体: 只有POST请求方式, 才有请求体, 在请求体中封装了POST请求的请求参数
* 步骤:
1. 获取流对象
* BufferedReader getReader(): 获取字符输入流, 只能操作字符数据
* 代码:
package cn.xiaoge.web.request;
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;
/**
* @Author: HWB
* @DateTime: 2020/1/27 下午6:51
* @Description: 演示Request对象获取请求体数据
*/
@WebServlet("/requestDemo5")
public class RequestDemo5 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取请求消息体--请求参数, 发送过来的数据username=zhangsan password=123456
// 1. 获取字符流
BufferedReader br = request.getReader();
// 2. 读取数据
String line = null;
// 每次遍历获取一行数据
while((line = br.readLine()) != null){
System.out.println(line); // username=zhangsan&password=123456
}
// 3. 这个流不用关闭, 因为是通过request获取到的
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
* ServletInputStream getInputStream(): 获取字节输入流, 可以操作所有类型数据
2. 在从流对象中拿数据
2. 其他功能:
1. 获取请求参数通用方式: 不论get还是post请求方式都可以使用下列方法来获取请求参数
1. String getParameter(String name): 根据参数名称获取参数值
2. String[] getParameterValues(String name): 根据参数名称获取参数值的数组
3. Enumeration<String> getParameterNames(): 获取所有请求的参数名称
4. Map<String, String[]> getParameterMap(): 获取所有参数的map集合
* 中文乱码问题:
* get方式: tomcat 8 已经将get方式乱码问题解决了
* post方式: 会乱码
* 解决: 在获取参数前, 设置request的编码request.setCharacterEncoding("utf-8");
* 代码:
package cn.xiaoge.web.request;
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;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;
/**
* @Author: HWB
* @DateTime: 2020/1/27 下午6:51
* @Description: 演示Request对象获取请求体数据
*/
@WebServlet("/requestDemo6")
public class RequestDemo6 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// post获取请求参数
// 设置流的编码
request.setCharacterEncoding("utf-8");
// 根据参数名臣获取值
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username+ ": " +password);
/*
传递参数: username=zhangsan password=123456
运行结果
zhangsan: 123456
*/
// 根据参数名臣获取参数值的数组
String[] hobby = request.getParameterValues("hobby");
for (String s : hobby) {
System.out.println(s);
/*
传递参数: hobby="游戏" hobby=学习
运行结果
游戏
学习
*/
}
// 获取所偶遇请求的参数名称
Enumeration<String> parameterNames = request.getParameterNames();
// 遍历
while(parameterNames.hasMoreElements()) {
// 获取传递键值对的键
String key = parameterNames.nextElement();
// 获取键值对的值
String value = request.getParameter(key);
System.out.println(key+ ": " +value);
/*
传递参数: username=zhangsan password=123456 hobby="游戏" hobby=学习
运行结果
username: zhangsan
password: 123456
hobby: 游戏 --> hobby的学习没遍历 因为这里用的getParameter用getParameterValues就好了
*/
}
System.out.println("----------------");
Map<String, String[]> parameterMap = request.getParameterMap();
Set<String> keys = parameterMap.keySet();
for (String name : keys) {
String[] values = parameterMap.get(name);
for (String value1 : values) {
System.out.println(name + ": " + value1);
}
}
/*
传递参数: username=zhangsan password=123456 hobby="游戏" hobby=学习
运行结果
username: zhangsan
password: 123456
hobby: 游戏
hobby: 学习
*/
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// get获取请求参数
this.doPost(request, response);
}
}
2. 请求转发: 一种在服务器内部的资源跳转方式
1. 步骤:
1. 通过request对象获取请求转发器对象: RequestDispatcher getRequestDispatcher(String path)
2. 使用RequestDispatcher对象来进行转发: forward(ServletRequest request, ServletResponse response)
2. 特点:
1. 浏览器地址栏路径不发生变化
2. 只能转发到当前服务器内部资源中.
3. 转发是一次请求
3. 代码:
package cn.xiaoge.web.request;
import javax.servlet.RequestDispatcher;
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;
import java.util.Map;
import java.util.Set;
/**
* @Author: HWB
* @DateTime: 2020/1/27 下午6:51
* @Description: 演示Request对象请求转发
*/
@WebServlet("/requestDemo7")
public class RequestDemo7 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo77777被访问了....");
// 转发到requestDemo8资源
/*
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/requestDemo8");
requestDispatcher.forward(request, response);
*/
request.getRequestDispatcher("/requestDemo8").forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// get获取请求参数
this.doPost(request, response);
}
}
3. 共享数据:
* 域对象: 一个有作用范围的对象, 可以在范围内共享数据
* request域: 代表一次请求的范围, 一般用于请求转发的多个资源中共享数据
* 方法:
1. void setAttribute(String name, Object obj): 存储数据
2. Object getAttribute(String name): 通过键获取值
3. void removeAttribute(String name): 通过键移除键值对
* RequestDemo7:
package cn.xiaoge.web.request;
import javax.servlet.RequestDispatcher;
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;
import java.util.Map;
import java.util.Set;
/**
* @Author: HWB
* @DateTime: 2020/1/27 下午6:51
* @Description: 演示Request对象请求转发
*/
@WebServlet("/requestDemo7")
public class RequestDemo7 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo77777被访问了....");
// 转发到requestDemo8资源
/*
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/requestDemo8");
requestDispatcher.forward(request, response);
*/
// 存储数据到request域中
request.setAttribute("msg", "hello");
request.getRequestDispatcher("/requestDemo8").forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// get获取请求参数
this.doPost(request, response);
}
}
* RequestDemo8:
package cn.xiaoge.web.request;
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;
import java.util.Map;
import java.util.Set;
/**
* @Author: HWB
* @DateTime: 2020/1/27 下午6:51
* @Description: 演示Request对象请求转发
*/
@WebServlet("/requestDemo8")
public class RequestDemo8 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取数据
Object msg = request.getAttribute("msg");
System.out.println(msg);
// 移除数据
request.removeAttribute("msg");
System.out.println("demo888888被访问了....");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// get获取请求参数
this.doPost(request, response);
}
}
* 运行结果
demo77777被访问了....
hello
demo888888被访问了....
4. 获取ServletContext:
* ServletContext getServletContext();
* 介绍: ServletContext对象在博客中https://blog.csdn.net/zsx1314lovezyf/article/details/104110544