一、HttpServletRequest类
1、作用:
每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的信息。
2、常用方法:
getRequestURI() | 获取请求的资源路径 |
getRequestURL() | 获取请求的统一资源定位符(绝对路径) |
getRemoteHost() | 获取客户端的 ip 地址 |
getHeader() | 获取请求头 |
getParameter() | 获取请求的参数 |
getParameterValues() | 获取请求的参数(多个值的时候使用) |
getMethod() | 获取请求的方式GET 或POST |
setAttribute(key, value) | 设置域数据 |
getAttribute(key) | 获取域数据 |
getRequestDispatcher() | 获取请求转发对象 |
@WebServlet("/RequestAPIServlet")
public class RequestAPIServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求资源路径
String requestURI = req.getRequestURI();
System.out.println("requestURI = " + requestURI);
//获取请求资源路径---绝对路径
StringBuffer requestURL = req.getRequestURL();
System.out.println("requestURL = " + requestURL);
//获取客服端的IP地址
String remoteHost = req.getRemoteHost();
System.out.println("remoteHost = " + remoteHost);
//获取请求头
String accept = req.getHeader("Accept");
String cookie = req.getHeader("Cookie");
System.out.println("accept = " + accept);
System.out.println("cookie = " + cookie);
//获取请求参数,获取客服端发送的数据,他是实现最多的一个方法,没有之一
//使用post请求的时候会产生乱码
req.setCharacterEncoding("utf-8");//这段代码是先转化在接收,不能写在下面这两句代码的下面
String myname = req.getParameter("myname");
String mypass = req.getParameter("mypass");
System.out.println("mypass = " + mypass);
System.out.println("myname = " + myname);
//获取请求参数,获取客服端发送的数据,获取多个数据
// String hobby = req.getParameter("hobby");
String[] hobbies = req.getParameterValues("hobby");
/* for (String a:
hobbies) {
System.out.println("hobby = " + a);
}*/
Arrays.stream(hobbies).forEach(System.out::println);
}
}
二、请求转发
1、定义:
服务器收到请求后,从一次资源跳转到另一个资源的操作
2、特点:
(1)、浏览器地址没有变化
(2)、他们是一次请求
(3)、他们共享Request域中的数据
(4)、可以转发到WEB-INF目录下
(5)、不可以访问工程以外的资源
@WebServlet("/servlet1")
public class servlet1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
// 获取请求的参数(办事的材料)查看
String username = req.getParameter("username");
System.out.println("在 Servlet1(柜台 1)中查看参数(材料):" + username);
// 给材料 盖一个章,并传递到Servlet2(柜台 2)去查看
req.setAttribute("key1","柜台 1 的章");
// 问路:Servlet2(柜台 2)怎么走
/**
* 请求转发必须要以斜杠打头,/ 斜杠表示地址为:http://ip:port/工程名/ , 映射到IDEA 代码的web 目录
<br/>
*
*/
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
//这是不能跳转到百度的
// RequestDispatcher requestDispatcher = req.getRequestDispatcher("http://www.baidu.com");
/**
* forward(req,resp)
*/
// 走向Sevlet2(柜台 2)
requestDispatcher.forward(req,resp);
// 重定向跳转(他会改变地址栏的数据)
//这个地方的斜杠不能加,会使得客户端一样解析
// resp.sendRedirect("servlet2");
}
}
@WebServlet("/servlet2")
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(柜台 2)中查看参数(材料):" + username);
// 查看 柜台1 是否有盖章
Object key1 = req.getAttribute("key1");
System.out.println("柜台 1 是否有章:" + key1);
// 处理自己的业务
System.out.println("Servlet2 处理自己的业务 ");
}
}
三、重定向跳转
1、定义:
通过各种方法将各种网络请求重新定个方向转到其它位置
2、特点
(1)、重定向是两次请求、两次响应
(2)重定向前后,浏览器的地址栏地址会发生变化。
(3)重定向前后的request对象不是同一个
(4)重定向前后的两个资源可以是来自不同的web应用,甚至可以是来自不同的服务器。