request
request获取请求消息内容
请求行
请求头
请求参数(体)
request概述
用户通过浏览器访问服务器时,Tomcat将HTTP请求中所有的信息都封装在Request对象中
作用:开发人员可以通过request对象方法,来获取浏览器发送的所有信息.
request体系结构
ServletRequest
|
HttpServletRequest
|
org.apache.catalina.connector.RequestFacade(由tomcat厂商提供实现类)
Request获取Http请求信息
获取请求行信息
相关API:
- 获取请求方式
String getMrthod() - 获取项目的虚拟路径
String getContextPath() - 获取URI(统一资源标识符,范围广)
String getRequestURI() - 获取URL(统一资源定位符,确定某一个地址)
StringBuffer getRequestURL() - 获取协议和版本号
String getProtocol() - 获取客户端的IP地址
String getLocalAddr()
@WebServlet("/requestDemo1")
public class RequestDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("请求方式" + req.getMethod());
System.out.println("虚拟路径" + req.getContextPath());
System.out.println("获取URI" + req.getRequestURI());
System.out.println("获取URL" + req.getRequestURL());
System.out.println("获取协议和版本号" + req.getProtocol());
System.out.println("获取客户端IP" + req.getLocalAddr());
}
结果为:
请求方式GET
虚拟路径/day09_request
获取URI/day09_request/requestDemo1
获取URLhttp://localhost:8080/day09_request/requestDemo1
获取协议和版本号HTTP/1.1
获取客户端IP0:0:0:0:0:0:0:1
获取请求头信息
相关API
- 获取知道请求头名称对应的值,不区分大小写
String getHeader(String name) - 获取所以请求头的信息
Enumeration getHeaderNames()
案例
视频防盗链
@WebServlet("/referRequest")
public class ReferRequest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
//获取请求的来源,如果是浏览器地址直接访问的话,referer就是null
String header = req.getHeader("referer");
//判断是不是自家的网站发起的请求
if (header != null && header.startsWith("http://localhost:8080")) {
resp.getWriter().write("正常播放视频");
} else {
resp.getWriter().write("来优酷吧");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
浏览器兼容性问题
@WebServlet("/userAgentServlet")
public class UserAgentServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//获取浏览器版本信息
String header = request.getHeader("user-agent");
//判断浏览器版本
if (header.contains("Chrome")) {
response.getWriter().write("浏览器是谷歌");
} else if (header.contains("Firefox")) {
response.getWriter().write("浏览器是火狐");
} else {
response.getWriter().write("其他浏览器");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
获取请求参数(体)
API
- 获取指定参数名的值(例如:姓名)
String getParameter(String name) - 获取指定参数名的值,返回的是一个数组(例如:爱好)
String [ ]getParameterValues(String name) - 获取所有参数名和对应值数组,参数名 name,值数组 value,封装map集合
Map<String ,String [ ]>getParametermap
注意:中文乱码问题
get:在tomcat8及以上版本,内部URL编码(UTF-8)
post:编码解码不一致,造成乱码现象
客户端(浏览器)编码:UTF-8
服务器默认 解码:ISO-8859-1 拉丁文
指定解码:void setCharacterEncoding(String env) 注:必须在方法内行首
@WebServlet("/requestDemo3")
public class RequestDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//手动获取
System.out.println("手动获取");
String username = req.getParameter("username");
System.out.println("用户:" + username);
String password = req.getParameter("password");
System.out.println("密码:" + password);
String[] hobbies = req.getParameterValues("hobby");
System.out.println("爱好:" + Arrays.toString(hobbies));
//自动
System.out.println("自动获取");
Map<String, String[]> map = req.getParameterMap();
map.forEach((k, v) -> {
System.out.println(k + "=" + Arrays.toString(v));
});
//将前端的表单数据赋值到user对象中,保存到数据库中
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//指定post的解码方式
req.setCharacterEncoding("UTF-8");
System.out.println("post提交方法,再去调用get");
this.doGet(req, resp);
}
}
BeanUtils
是由Apache组织,提供的一套工具类,简化参数的封装,即:将前端提交的数据,直接封装到想要的JavaBean中
- 导入架包
lib目录必须在WEB-INF之下 - 使用工具类进行封装
案例实现
//获取请求参数
@WebServlet("/requestDemo4")
public class RequestDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
// 使用BeanUtils快速封装数据到 User对象中
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//指定post的解码方式
req.setCharacterEncoding("UTF-8");
//获取所有参数的map集合
Map<String, String[]> parameterMap = req.getParameterMap();
//创建对象
User user = new User();
//调用工具,实现封装
try {
BeanUtils.populate(user, parameterMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println(user);
}
}
request其他功能
请求转发
一种在服务器内部的资源跳转方式
API
- 通过request对象,获得转发器对象
RequestDispatcher getRequestDispatcher(String path) - 通过转发器对象实现转发的功能
void forward(ServletRequest request, ServletResponse response)
特点:
浏览器:发了一次请求、地址栏:没有发生改变、只能转发到服务器内部的资源
链式编程:request.getRequestDispatcher("/bServlet").forward(reqeust,response)
域对象(共享数据)
域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于一次请求中转发的多个资源中共享数据
-
API
-
设置数据
void setAttribute(String name, Object o) -
获取数据
Object getAttribute(String name) -
删除数据
void removeAttribute(String name)
-
-
生命周期
-
何时创建?
用户发送请求时,创建request -
何时销毁
服务器返回响应是,销毁request -
作用范围?
一次请求,包含多次转发
-
练习
需求:
实现用户的登录功能
登录成功跳转到SuccessServlet展示:登录成功!xxx,欢迎您
登录失败跳转到FailServlet展示:登录失败,用户名或密码错误
代码实现:
- 创建web项目
- 导入BeanUtils工具类
- 编写index.xml文件
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<h4>用户登录</h4>
<form action="/day09_login/loginServlet" method="post">
用户:<input type="text" name="username"> <br>
密码:<input type="password" name="password"> <br>
<input type="submit" value="登录">
</form>
</body>
</html>
- User实体类
// 用户对象
public class User {
private String username;// 用户名
private String password;// 密码
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
- LoginServlet
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置解码方式
request.setCharacterEncoding("utf-8");
//获取浏览器请求参数,map集合
Map<String, String[]> parameterMap = request.getParameterMap();
//使用BeanUtils工具类,封装user对象
//将对象信息写死
User user = new User("jack","123");
try {
BeanUtils.populate(user, parameterMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
if ("jack".equals(user.getUsername()) && "123".equals(user.getPassword())) {
// 正确
request.setAttribute("user", user);
request.getRequestDispatcher("/successServlet").forward(request, response);
} else {
// 错误
request.getRequestDispatcher("/failServlet").forward(request, response);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
- SuccessServlet
@WebServlet("/successServlet")
public class SuccessServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从request域获取对象
User user = (User) request.getAttribute("user");
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("登录成功");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
- FailServlet
@WebServlet("/failServlet")
public class FailServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("登录失败");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}