一篇让你全面认识Servlet,对知识点进行通俗化
制作不易,如果觉得不错,请点赞收藏 !!!
目录
6.@GetMapping和HttpServlet的doGet()方法有什么异同
7.@WebServlet(urlPattern=""),urlPattern配置规则
1.Servlet定义
Servlet是Java编写的服务器端程序,用于处理客户端的请求并生成响应。它运行在支持Java Servlet规范的Web服务器上,如Apache Tomcat。Servlet可以接收来自客户端的HTTP请求,
并根据请求生成动态的HTML页面或其他类型的响应。
再讲简单点就是
Servlet是java提供的一门动态web资源开发技术,就是通过后端的逻辑判断,可以根据不同请求,动态响应不同数据在页面上
相当于前端html,css等静态web资源开发技术
2.Servlet的主要特点
①. 独立于平台和协议:Servlet可以在不同的操作系统和Web服务器上运行,并且可以处理不同的协议,如HTTP、HTTPS等。
②. 动态生成内容:Servlet可以根据客户端请求的不同动态生成内容,例如生成HTML页面、XML数据等。
③. 多线程支持:Servlet容器会为每个请求创建一个线程,使得多个请求可以并发处理。
④. 生命周期管理:Servlet具有自己的生命周期,包括初始化、服务处理和销毁等阶段。
Servlet通常用于开发Web应用程序的后端逻辑,例如处理用户登录、注册、数据查询等功能。它可以与数据库进行交互、调用其他Java类库,并生成相应的响应返回给客户端。
3.Servlet执行流程
Servlet是一个接口,实现这个接口必须重写里面5个方法,其中一个重要的方法是service(ServletRequest req, ServletResponse res),这个方法是由tomcat创建Servlet对象并且调用
4.Servlet生命周期
①.加载和实例化:默认情况下,当Servlet第一次被访问时调用,由容器创建Servlet对象
②.初始化:在Servlet实例化后,容器将调用Servlet的init()方法初始化这个对象,完成一些加载配置文件.该方法只被调用一次
③.请求处理:每次发送请求Servlet是,容器就会调用Servlet的service()方法对请求进行处理
④.服务终止:当需要释放内存和容器关闭时,容器就会调用Servlet实例调用destory()方法,该方法只调用一次.destory()方法被调用后,容器会释放Servlet实例,
该实例会被垃圾回收机制回收
5.HttpServlet原理
获取请求方式,并根据不同的请求方式,调用不同的doXxx方法,继承HttpServlet,重写里面的doXxx方法
6.@GetMapping和HttpServlet的doGet()方法有什么异同
①.所属框架/类别
@GetMapping是Spring框架中的注解,用于处理Spring MVC中的请求映射;
doGet()方法是HttpServlet类中的方法,用于处理Java Servlet中的HTTP GET请求。
②.使用方式
@GetMapping注解需要标注在Controller类的方法上,指定处理特定请求路径的方法;
HttpServlet中的doGet()方法是覆盖了HttpServlet中的方法,用于处理GET请求。
③.参数传递
@GetMapping注解可以通过@RequestParam注解来获取请求参数;
对于HttpServlet中的doGet()方法,可以通过HttpServletRequest对象来获取请求参数。
7.@WebServlet(urlPattern=""),urlPattern配置规则
@WebServlet(urlPattern="")
urlPattern配置规则(优先级:精确路径 > 目录路径 > 拓展名路径 > /* > /)
①.精确匹配(/user/aa)
②.目录匹配(/user/*)
③.拓展名匹配(*.aa)注意*前面不能加/
④.任意匹配(/或者/*)可以匹配多级目录
8.Request和Response重点
Request:获取请求数据 发送请求时,tomcat会解析这个请求,并把请求封装到Request对象
Response:设置响应数据 服务端处理这次请求,然后设置响应的数据封装到Response对象,然后tomcat响应时会读取这个对象,然后在响应给浏览器
HttpServletRequest是一个接口,HttpServletRequest的实现类是由tomcat提供,因为打印System.out.println(request)是tomcat的实现类,
因此查看源码只需查HttpServletRequest
9.Request
9.1 请求三要素
请求行:请求方式 + 请求路径 + 协议 + 版本号
http://localhost:8080/request-demo/req1?username=zhangsan&password=123
request.getMethod(); 获取请求方式 get
request.getContextPath(); 获取虚拟目录(项目访问路径) /request-demo
request.getRequestURL(); 获取URL(统一资源定位符) http://localhost:8080/request-demo/req1
request.getRequestURI(); 获取URI(统一资源标识符) /request-demo/req1
request.getQueryString(); 获取请求参数(GET方式) username=zhangsan&password=123
请求头:客户端浏览器名称以及版本
request.getHeader(String name),比如:getHeader("user-agent")获取浏览器版本信息
请求体:Post请求存储的数据
request.getReader(); 获取字符输入流,如果前端发送的是纯文本数据
request.getInputStream(); 获取字节输入流,如果前端发送的是字节数据,比如传递的是文件数据,则使用该方法
9.2 请求转发
请求转发(forward):一种服务器内部资源的跳转方式
实现方式:req.getRequest("另外一个资源的路径").forward(req,resp);
请求转发资源共享数据:使用request对象
setAttribute(String name,Object o):存储数据到request域中
getAttribute(String name) :根据key,取值
removeAttribute(String name) :根据key,删掉数据
资源转发特点:
①.浏览器地址栏不发生改变
②.只能转发到当前服务器的内部资源
③.一次请求,可以在转发资源间进行request数据共享
10.Response
10.1 响应三要素
响应行:协议 + 响应状态码 + 状态码描述
setStatus(int sc) 设置响应状态码
响应头:响应数据格式(key-value)
setHeader(String name,String value) 设置响应头键值对
响应体:
response.getWriter(); 获取字符输出流
response.getOutputStream(); 获取字节输出流
设置响应类型,以及支持中文编码
response.setContentType("text/html;charset=utf8");
注意:不需要关闭流,因为随着响应结束,response对象销毁,由服务器关闭
10.2 重定向
重定向(Redirect):一种资源跳转方式
实现方式:resp.setStatus(302); 302就是告诉浏览器是重定向
resp.setHeader("location","资源B的URI");
简化版: resp.sendRedirect("资源B的URI");
重定向特点:
①.浏览器地址栏发生变化
②.可以重定向到任意位置的资源(服务器内部、外部都可以)
③.两次请求,不能在多个资源使用request资源共享
路径问题:
浏览器使用:需要加上虚拟目录
服务端使用:不需要加虚拟目录