HttpServletRequest类
一、作用
每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。
然后传递到service方法(doGet 和 doPost)中给我们使用。
可以通过HttpServlerRequest对象,获取到所有请求的信息
二、常用方法
- getRequestURI() —> 获取请求的资源路径
- getRequestURL() —> 获取请求的统一资源定位符(绝对路径)
- getRemoteHost() —> 获取客户端ip地址
- getHeader() —> 获取请求头
- getParameter() —> 获取请求的参数
- getParameterValues() —> 获取请求的参数(多个值的时候使用)
- getMethod() —>获取请求的方式GET 或 POST
- setAttribute(key,value) —>设置域数据
- getAttribute(key) —>获取域数据
- getRequestDispatcher() —> 获取请求转发对象
演示代码:
package servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RequestAPIServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//i. getRequestURI() 获取请求的资源路径
System.out.println("URI->"+req.getRequestURI());
//ii. getRequestURL() 获取请求的统一资源定位符(绝对路径)
System.out.println("URL->"+req.getRequestURL());
//iii. getRemoteHost() 获取客户端的 ip 地址
/*
* 在IDEA中,使用localhost访问时 得到的客户端ip地址是0:0:0:0:0:0:0:1
* 如果使用真实ip访问时,得到的客户端ip地址是真实的客户端ip地址
* */
System.out.println("客户端IP地址:"+req.getRemoteHost());
//iv. getHeader() 获取请求头
System.out.println("请求头User-Agent-->"+req.getHeader("User-Agent"));
//v. getParameter() 获取请求的参数
//vi. getParameterValues() 获取请求的参数(多个值的时候使用)
//vii. getMethod() 获取请求的方式 GET 或 POST
System.out.println("请求的方式:"+req.getMethod());
}
}
三、获取请求参数
1. 新建html文件,创建表单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="http://localhost:8080/07_servlet/parameterServlet" method="post">
username: <input type="text" name="username"><br>
password: <input type="password" name="password"><br>
hobby: <input type="checkbox" name="hobby" value="cpp">C++
<input type="checkbox" name="hobby" value="Java">Java
<input type="checkbox" name="hobby" value="JS">JS
<input type="submit">
</form>
</body>
</html>
2. 创建java类获取请求参数
package servlet;
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.Arrays;
public class ParameterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobby = req.getParameterValues("hobby");
System.out.println("密码:"+password);;
System.out.println("用户名:"+username);
System.out.println("爱好:"+ Arrays.asList(hobby));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求体的字符集为UTF-8,从而解决post请求的中文乱码问题,也要在获取请求参数之前调用才有效
req.setCharacterEncoding("UTF-8");
System.out.println("----------doPost");
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobby = req.getParameterValues("hobby");
System.out.println("用户名:"+username);
System.out.println("密码:"+password);
System.out.println("爱好:"+ Arrays.asList(hobby));
}
}
四、请求转发
定义:指服务器收到请求后,从一次资源跳转到另一次资源的操作
请求转发过程解析:
- 客户端通过 http://ip:port/工程名/servlet1 访问 servlet1程序
- servlet1程序执行如下操作:
- 获取请求的参数
- 处理完业务,给请求的参数设置一个object 让servlet2知道是从servlet1转发过来的
- 通过servlet1找到servlet2的程序地址
- 跳转到servlet2
- servlet2程序执行如下操作:
- 获取请求参数
- 检验servlet1的标记(object)
- 处理业务
演示代码:
servlet1中的代码:
package servlet;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求的参数
String username = req.getParameter("username");
System.out.println("在Servlet1中查看参数:"+username);
//给请求的参数设置object,并传递到Servlet2去查看
req.setAttribute("Key","柜台1的章");
//设置Servlet2的地址
/*
请求转发必须要以斜杠开始,斜杠表示地址为;http://ip:port/工程名/, 映射到IDEA代码的web目录
* */
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
//跳转servlet2
requestDispatcher.forward(req,resp);
}
}
servlet2中的代码:
package servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
System.out.println("在servlet2中查看参数:"+username);
//查看servlet1是否有“章”
Object key1 = req.getAttribute("key1");
System.out.println("servlet1是否有章:"+ key1);
//处理自己的业务
System.out.println("servlet2处理自己的业务");
}
}