HttpServletRequest类
a)HttpServletRequest类有什么作用
| 每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。 |
| 然后传递到service方法(doGet和doPost)中给我们使用。我们可以通过HttpServletRequest对象,获取到所有请求的信息。 |
b)HttpServletRequest类的常用方法
| 1.getRequestURI() 获取请求的资源路径 |
| 2.getRequestURL() 获取请求的统一资源定位符(绝对路径) |
| 3.getRemoteHost() 获取客户端的主机名(底层代码有去做dns查询的动作,使用该方法的功能模块速度可能会特别慢) |
| getRemoteAddr() 获取客户端的ip地址 |
| 4.getHeader(String name) 根据header参数名称获取值 |
| 5.getParameter() 获取请求的参数 |
| 6.getParameterValues() 获取请求的参数(多个值的时候使用) |
| 7.getMethod() 获取请求的方式GET或POST |
| 8.setAttribute(key,value); 设置域数据 |
| 9.getAttribute(key); 获取域数据 |
| 10.getRequestDispatcher() 获取请求转发对象 |
| 11.getContextPath() 获取工程路径 |
| 12.getServerName() 获取web应用服务器主机名 |
| 13.getServerPort() 获取web应用的访问端口 |
| 14.getScheme() 获取请求的协议名 如:http |
| 15.getServletPath() 获取工程路径之后到请求参数之前的这部分字符串 如:/login.do |
| 16.getParameterMap() 获取请求参数对应的map |
| 17.getHeaderNames() 获取header里面的参数名称(多个值的时候使用) |
常用API示例代码:
| public class RequestAPIServlet extends HttpServlet{ |
| @Override |
| protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{ |
| |
| System.out.println("URI=>"+req.getRequestURI()); |
| |
| System.out.println("URL=>"+req.getRequestURL()); |
| |
| |
| |
| |
| |
| |
| |
| System.out.println("客户端ip地址=>"+req.getRemoteHost()); |
| |
| |
| System.out.println("请求头User-Agent==>>"+req.getHeader("User-Agent")); |
| |
| System.out.println("请求的方式==>>"+req.getMethod()); |
| } |
| } |
c)如何获取请求参数
表单:
| <body> |
| <form action="http://localhost:8080/07_servlet/parameterServlet" method="get"> |
| 用户名:<input type="text"name="username"><br/> |
| 密码:<input type="password"name="password"><br/> |
| 兴趣爱好:<input type="checkbox"name="hobby"value="cpp">C++ |
| <input type="checkbox"name="hobby"value="java">Java |
| <input type="checkbox"name="hobby"value="js">JavaScript<br/> |
| <input type="submit"> |
| </form> |
| </body> |
Java代码:
| 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("用户名:"+username); |
| System.out.println("密码:"+password); |
| System.out.println("兴趣爱好:"+Arrays.asList(hobby)); |
| } |
| } |
doGet请求的中文乱码解决:
| |
| String username = req.getParameter("username"); |
| |
| |
| username = new String(username.getBytes("iso-8859-1"),"UTF-8"); |
d)POST请求的中文乱码解决
| @Override |
| protected void doPost(HttpServletRequest req,HttpServletResponse resp)throws ServletException, |
| IOException{ |
| |
| |
| 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)); |
| } |
e)请求的转发
| 什么是请求的转发? |
| 请求转发是指,服务器收到请求后,从一个资源跳转到另一个资源的操作叫请求转发。 |
| |
| 特点: |
| 1.浏览器地址栏没有变化 |
| 2.它们是一次请求 |
| 3.它们共享Request域中的数据 |
| 4.可以转发到WEB-INF目录下 |
| 5.不可以访问工程以外的资源 |

Servlet1代码:
/ 斜杠表示地址为:http://ip:port/工程名/, 映射到IDEA代码的web目录
| 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(柜台1)中查看参数(材料):" + username); |
| |
| |
| req.setAttribute("key1", "柜台1的章"); |
| |
| |
| |
| |
| |
| |
| RequestDispatcher dispatcher = req.getRequestDispatcher("/servlet2"); |
| |
| dispatcher.forward(req,resp); |
| } |
| } |
因为转发将req请求也转发到Servlet2,所以请求域中的值在Servlet2中也可以取到。
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); |
| |
| Object key1 = req.getAttribute("key1"); |
| System.out.println("柜台1是否有章:" + key1); |
| |
| |
| System.out.println("Servlet2处理自己的业务"); |
| } |
| } |
f)base标签的作用

base标签写在title标签下
base标签最后的标签名是可以省略的,
| 例如:http://localhost:8080/07_servlet/a/b/a.html 可以是 http://localhost:8080/07_servlet/a/b/ |
| 但是最后的 / 斜杠不能省略 |
| <!DOCTYPE html> |
| <html lang="zh_CN"> |
| <head> |
| <meta charset="UTF-8"> |
| <title>Title</title> |
| |
| |
| |
| <base href="http://localhost:8080/07_servlet/a/b/"> |
| |
| </head> |
| <body> |
| 这是a下的b下的c.html页面<br/> |
| <a href="../../index.html">跳回首页</a><br/> |
| </body> |
| </html> |
g)Web中的相对路径和绝对路径
| 在javaWeb中,路径分为相对路径和绝对路径两种: |
| 相对路径是: |
| . 表示当前目录 |
| .. 表示上一级目录 |
| 资源名 表示当前目录/资源名 |
| |
| 绝对路径: |
| http: |
| |
| 在实际开发中,路径都使用绝对路径,而不简单的使用相对路径。 |
| 1、绝对路径 |
| 2、base+相对 |
h)web中/ 斜杠的不同意义
| 在web中/ 斜杠是一种绝对路径。 |
| |
| / 斜杠如果被浏览器解析,得到的地址是:http: |
| <ahref="/">斜杠</a> |
| |
| / 斜杠如果被服务器解析,得到的地址是:http://ip:port/工程路径 |
| 1、<url-pattern>/servlet1</url-pattern> |
| 2、servletContext.getRealPath(“/”); |
| 3、request.getRequestDispatcher(“/”); |
| |
| 特殊情况:response.sendRediect(“/”); 把斜杠发送给浏览器解析。得到http: |
HttpServletResponse类
a)HttpServletResponse类的作用
| HttpServletResponse类和HttpServletRequest类一样。每次请求进来,Tomcat服务器都会创建一个Response对象传 |
| 递给Servlet程序去使用。 |
| HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息, |
| 我们如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象来进行设置 |
b)两个输出流的说明
| 字节流 getOutputStream(); 常用于下载(传递二进制数据) |
| 字符流 getWriter(); 常用于回传字符串(常用) |
| |
| 两个流同时只能使用一个。 |
| 使用了字节流,就不能再使用字符流,反之亦然,否则就会报错。 |

c)如何往客户端回传数据
要求:往客户端回传字符串数据。
| public class ResponseIOServlet extends HttpServlet{ |
| @Override |
| protected void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{ |
| |
| PrintWriter writer = resp.getWriter(); |
| writer.write("response'scontent!!!"); |
| } |
| } |
d)响应的乱码解决
解决响应中文乱码方案一(不推荐使用):
| |
| resp.setCharacterEncoding("UTF-8"); |
| |
| resp.setHeader("Content-Type","text/html;charset=UTF-8"); |
解决响应中文乱码方案二(推荐):
此方法一定要在获取流对象之前调用才有效
| |
| |
| resp.setContentType("text/html;charset=UTF-8"); |
e)请求重定向
| 请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求重定向(因为之前的地址可能已经被废弃)。 |
| |
| 重定向特点: |
| 1.浏览器地址栏会发生变化 |
| 2.两次请求 |
| 3.不共享Request域中数据 |
| 4.不能访问WEB-INF下的资源 |
| 5.可以访问工程外的资源 |

请求重定向的第一种方案:
| |
| resp.setStatus(302); |
| |
| resp.setHeader("Location","http://localhost:8080"); |
请求重定向的第二种方案(推荐使用):
| resp.sendRedirect("http://localhost:8080"); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)