- 什么是Request?
- 为什么要使用Request?
- 怎么使用Request?
- 其它功能
- 中文乱码问题解决
1. 什么是Request?
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。
2. 为什么要使用Request?
- 使用Request对象来分析出对应的Servlet去执行对应的业务逻辑
- 使用Request对象来获取、转发、数据共享等功能
3. 怎么使用Request?
根据HTTP协议我们可以得知,一次数据请求包含:
- 请求行:请求方式 请求url 请求协议/版本
- 请求头:客户端浏览器告诉服务器一些信息
- 请求空行:空行,就是用于分割POST请求的请求头,和请求体的。
- 请求体:封装POST请求消息的请求参数的
3.1 获取请求行数据
方法 | 说明 |
---|---|
String getMethod() | 获取请求方式 |
String getContextPath() | 获取虚拟目录 |
String getServletPath() | 获取Servlet路径 |
String getQueryString() | 获取get方式请求参数 |
String getRequestURI() | 获取请求URI |
String getRemoteAddr() | 获取客户机的IP地址 |
示例代码
@WebServlet("/demo")
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取虚拟目录
System.out.printf(req.getContextPath()+"\n");
//获取URI
System.out.printf(req.getRequestURI()+"\n");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
效果演示
image.png image.png补充
- URL:统一资源定位符 : http://localhost/day14/demo1 中华人民共和国
- URI:统一资源标识符 : /day14/demo1 共和国
3.2 获取请求头数据
方法 | 说明 |
---|---|
String getHeader(String name) | 通过请求头的名称获取请求头的值 |
Enumeration<String> getHeaderNames() | 获取所有的请求头名称 |
3.3 获取请求体数据
请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
步骤:
- 获取流对象
BufferedReader getReader():获取字符输入流,只能操作字符数据
ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
在文件上传知识点后讲解 - 再从流对象中拿数据
4. 其它功能
4.1 获取请求参数
获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
方法 | 说明 |
---|---|
String getParameter(String name) | 根据参数名称获取参数值 username=zs&password=123 |
String[] getParameterValues(String name) | 根据参数名称获取参数值的数组 hobby=xx&hobby=game |
Enumeration<String> getParameterNames() | 获取所有请求的参数名称 |
Map<String,String[]> getParameterMap() | 获取所有参数的map集合 |
示例代码
html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>用户登录</h1>
<form action="demo" method="POST">
用户名:<input type="text" name="username"/>
<br/>
密 码:<input type="password" name="password"/>
<br/>
<input type="checkbox" name="usertype" value="administrator"/>管理员
<input type="checkbox" name="usertype" value="user"/>普通用户
<br/>
<input type="submit" value="提交">
</form>
</body>
</html>
Servlet页面
@WebServlet("/demo")
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//防止中文乱码
req.setCharacterEncoding("utf-8");
//获取username的参数(输入值)
System.out.printf(req.getParameter("username")+ "\n");
//获取password的参数(输入值)
System.out.printf(req.getParameter("password")+ "\n");
//根据参数名称获取参数值的数组
String [] result= req.getParameterValues("usertype");
for (String s : result) {
System.out.println(s);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
演示结果
image.png4.2 请求转发
一种在服务器内部的资源跳转方式
4.2.1 步骤:
- 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
4.2.2. 特点:
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务器内部资源中。
- 转发是一次请求
示例代码
LoginServlet
@WebServlet("/demo")
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String user_name = req.getParameter("username");
if (user_name.equals("aaa")){
req.getRequestDispatcher("/failServlet").forward(req,resp);
}
}
}
FailServlet
@WebServlet("/failServlet")
public class FailServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码
resp.setContentType("text/html;charset=utf-8");
//输出
resp.getWriter().write("登录失败,用户名或密码错误");
}
}
效果展示
image.png image.png4.3 共享数据
- 域对象:一个有作用范围的对象,可以在范围内共享数据
- request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
方法 | 说明 |
---|---|
void setAttribute(String name,Object obj) | 存储数据 |
Object getAttitude(String name) | 通过键获取值 |
void removeAttribute(String name) | 通过键移除键值对 |
示例代码
LoginServlet
@WebServlet("/demo")
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String user_name = req.getParameter("username");
if (user_name.equals("aaa")){
//存放数据
req.setAttribute("shareData",user_name);
//转发
req.getRequestDispatcher("/failServlet").forward(req,resp);
}
}
}
FailServlet
@WebServlet("/failServlet")
public class FailServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码
resp.setContentType("text/html;charset=utf-8");
//获取存放数据
String data =(String) req.getAttribute("shareData");
//输出
resp.getWriter().write("登录失败,用户名或密码错误");
resp.getWriter().write("用户"+data+"不允许登录!");
}
}
效果显示
image.png image.png4.4 获取ServletContext
ServletContext getServletContext()
5. 中文乱码问题
中文乱码问题:
- get方式:tomcat 8 已经将get方式乱码问题解决了
- post方式:会乱码解决:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");
网友评论