Servlet入门

Servlet概述

Servlet(server applet):用JAVA编写的运行在服务器端的小程序,作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

  • 狭义上:指java语言实现的一个接口
  • 广义上:指任意一个实现了这个Servlet接口的类。
  • 作用:由服务器执行对象创建,方法调用,主要用于交互式地浏览和修改数据生成Web内容,可充当MVC模式中的控制器。

MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。

  • Model(模型) 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
  • View(视图) 视图代表模型包含的数据的可视化。
  • Controller(控制器) 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。

MVC 模式以JSP+JavaBean+Servlet模式为例,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据。

Servlet的创建步骤

  1. 创建JavaEE项目
  2. 定义一个类实现Servlet接口,及接口中的所有抽象方法
    package cn.simplek9.web;
    import javax.servlet.*;
    import javax.servlet.annotation.WebServlet;
    import java.io.IOException;
    public class servlet2 implements Servlet {
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
    
        }
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("Servlet来了...");
        }
        @Override
        public String getServletInfo() {
            return null;
        }
        @Override
        public void destroy() {
    
        }
    }
    
    
  3. 配置Servlet

路径定义规则:

  1. /xxx:路径匹配
  2. /xxx/xxx:多层路径,目录结构
  3. *.do:扩展名匹配
  • 方法一:在项目的web/WEB-INF/web.xml的根标签中配置
    <servlet>
        <servlet-name>demo1</servlet-name><!--给该servlet所起的名字-->
        <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class> <!--src下的全类名-->
    </servlet>
    
    <servlet-mapping>
        <servlet-name>demo1</servlet-name>
        <url-pattern>/demo1</url-pattern><!--servlet对应的资源路径-->
    </servlet-mapping>
    ```
    
  • 方法二:类前使用@WebServlet("资源路径")注解配置,可以不需要web.xml(需要Servlet3.0及以上)
@WebServlet("/demo2")
//@WebServlet(urlPatterns="/demo2")
//@WebServlet(value="/demo2")
//@WebServlet(urlPatterns="/d2","/dd2","/ddd2")定义多个路径

Servlet执行原理

alt1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径 2. 查找web.xml文件,是否有对应的标签体内容。

  1. 如果有,则再找到对应的全类名
  2. tomcat会将字节码文件加载进内存,并且创建其对象
  3. 调用其方法

Servlet的生命周期

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:

  • Servlet 通过调用 init () 方法进行初始化。
  • Servlet 调用 service() 方法来处理客户端的请求。
  • Servlet 通过调用 destroy() 方法终止(结束)。
  • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

生命周期的方法

  1. init方法:在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。(一次)
    • Servlet默认创建于用户第一次调用对应于该 Servlet 的 URL 时,但是也可以指定 Servlet 在服务器第一次启动时被加载。
      • 可在web.xml的标签下配置
        <!--第一次被访问时-->
        <load-on-startup>的值为负数
        <!--在服务器启动时-->
        <load-on-startup>的值为0或正整数
        
    • Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
      • 多个用户同时访问时,可能存在线程安全问题。
      • 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值
  2. service方法:每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。(多次)
    • 每次访问Servlet时,Service方法都会被调用一次。
    • 单实例多线程
  3. destroy方法:服务器关闭时,调用destroy方法释放资源,servlet对象被标记为垃圾回收,然后由JVM 的垃圾回收器销毁Servlet(一次)
  4. getServletConfig方法:获取ServletConfig对象,即Servlet的配置对象
  5. getServletInfo方法:获取Servlet的一些信息,如版本,作者等等 alt

Servlet的体系结构

Servlet -- 接口 | GenericServlet -- 抽象类 | HttpServlet -- 抽象类

  • 用继承以下两个抽象类来实现Servlet的方式可以不用初始实现接口中的所有抽象方法,选择性的只实现service方法
  • GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
    • 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
  • HttpServlet:对http协议的一种封装,简化操作
    1. 定义类继承HttpServlet
    2. 复写doGet/doPost方法
@WebServlet("/demo4")
public class servlet4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet...");//在浏览器URL输入路径直接请求是get方式
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost...");
    }
}