目录
每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。然后传递到service方法(doGet和doPost)中给我们使用。我们可以通过HttpServletRequest对象,获取到所有请求的信息。
- <servlet>
- <servlet-name>RequestAPIServletservlet-name>
- <servlet-class>servlet.RequestAPIServletservlet-class>
- servlet>
- <servlet-mapping>
- <servlet-name>RequestAPIServletservlet-name>
- <url-pattern>RequestAPIServleturl-pattern>
- servlet-mapping>
- <servlet>
- <servlet-name>ParameterServletservlet-name>
- <servlet-class>servlet.ParameterServletservlet-class>
- servlet>
- <servlet-mapping>
- <servlet-name>ParameterServletservlet-name>
- <url-pattern>/ParameterServleturl-pattern>
- servlet-mapping>
获取请求的资源路径
- // 获取请求的资源路径
- System.out.println("URI=>"+req.getRequestURI());
结果: URI=>/web_Tomcat_war_exploded/RequestAPIServlet
获取请求的统一资源定位符(绝对路径)
- // 获取请求的统一资源定位符(绝对路径)
- System.out.println("URL=>"+req.getRequestURL());
结果: URL=>http://localhost:8080/web_Tomcat_war_exploded/RequestAPIServlet
获取客户端的ip地址
- // 获取客户端的ip地址
- System.out.println("获取客户端的ip地址=>"+req.getRemoteHost());
结果: 获取客户端的ip地址=>127.0.0.1
补充:
使用localhost访问时,得到的客户端ip地址是 127.0.0.1
使用127.0.0.1访问时,得到的客户端ip地址是 127.0.0.1
使用真实ip地址访问时,得到的客户端ip地址是 真实客户端的ip地址
获取请求头
- // 获取请求头
- System.out.println("获取请求头User-Agent=>"+req.getHeader("User-Agent"));
结果:获取请求头User-Agent=>Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0
获取请求的参数
- 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.getParameter("hobby");
- // 有多个值的话要使用这个方法
- String[] hobby2 = req.getParameterValues("hobby");
-
- System.out.println("username=>"+username);
- System.out.println("password=>"+password);
- System.out.println("hobby=>"+hobby);
- System.out.println("hobby=>"+ Arrays.toString(hobby2));
- }
- }
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Titletitle>
- head>
- <body>
- <form action="http://localhost:8080/web_Tomcat_war_exploded/ParameterServlet" method="get">
- 用户名: <input type="text" name="username"/> <br/>
- 密码: <input type="password" name="password"/> <br/>
- 兴趣爱好: <input type="checkbox" name="hobby" value="java"/> Java
- <input type="checkbox" name="hobby" value="c++"/>C++
- <input type="checkbox" name="hobby" value="js"/> JavaScript
- <br/>
- <input type="submit">
- form>
-
- body>
- html>

结果:

我们发现当选择兴趣爱好的时候,会有多个选择,如果再用getParameter()方法只会出现一个值,但这其实不是很符合我们的要求。
当我们需要获取多个值的时候,我们可以使用getParameterValues()
获取请求的参数(多个值的时候使用)
- // 有多个值的话要使用这个方法
- String[] hobby2 = req.getParameterValues("hobby");
参数上面那个方法
获取请求的方式GET或POST
- // 获取请求方式是get还是post
- System.out.println("获取请求方式=>"+req.getMethod());
结果:获取请求方式=>GET
设置域数据
看10
获取域数据
看10
获取请求转发对象

- public class Servlet11 extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- // 获取请求的参数(办事的材料)查看
- String username = req.getParameter("username");
- System.out.println("在Servlet1(柜台1)中查看参数(材料)"+username);
-
- // 给材料“盖一个章”,并传递到Servlet2(柜台2)去查看
- req.setAttribute("key1","柜台1的章");
-
- // 问路: Servlet2怎么走(柜台2)
- // 请求转发必须要以斜杠打头,斜杠表示地址为;http://ip:port/工程名/ 映射到IDEA代码的web目录
- RequestDispatcher requestDispatcher= req.getRequestDispatcher("/Servlet22");
-
- // 走向Servlet2(柜台2)
- requestDispatcher.forward(req,resp);
- }
- }
- public class Servlet22 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是否盖章
- // 这里的参数一定要和Servlet1中的参数一致(两遍一致)
- Object key1 = req.getAttribute("key1");
- System.out.println("柜台1是否有章:"+key1);
-
- // 处理自己的业务
- System.out.println("servlet2处理自己的任务");
- }
- }

我们首先看下面这个例子
- public class ForwardC extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- System.out.println("经过了ForwardC程序");
- // 请求转发必须要以斜杠打头,斜杠表示地址为;http://ip:port/工程名/ 映射到IDEA代码的web目录
- RequestDispatcher requestDispatcher= req.getRequestDispatcher("/a/b/c.html");
- requestDispatcher.forward(req,resp);
- }
- }
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Titletitle>
- head>
- <body>
- 这是a下的b下的c.html
- <a href="../../index.jsp">这是web下的index.html页面a>
- body>
- html>

- <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
- html>
- <html>
- <head>
- <title>JSP - Hello Worldtitle>
- head>
- <body>
- 这是Web下的index.html <br/>
- <a href="a/b/c.html" > a/b/c.htmla> <br/>
- <a href="http://localhost:8080//web_Tomcat_war_exploded/ForwardC">请求转发a/b/c.htmla>
- body>
- html>

我们上面生成了两个页面,当我们通过点击每个页面的第一个超链接(a标签)的时候,可以实现两个页面的相互跳跃,但是当我们点击“请求转发a/b/c.html”此超链接进项相互跳跃的时候,我们发现可以跳过去,但是跳不回来,那原因是什么呢?
如下图所示,这就是为什么使用请求转发的时候无法完成相互跳跃

其实我们不难发现是因为往回跳的时候参照路径发生了改变,导致跳不回来
那怎么解决这个问题呢?
我们只需要给下面的页面设置一个相对路径工作时的参照地址,使用base标签
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Titletitle>
- <base href="http://localhost:8080//web_Tomcat_war_exploded/a/b/c.html">
- head>
- <body>
- 这是a下的b下的c.html
- <a href="../../index.jsp">这是web下的index.html页面a>
- body>
- html>