Servlet详细教程

文章目录

  • 1. Servlet 快速入门
    • 1.0Servlet介绍
    • 1.1创建项目导入依赖
    • 1.2定义类实现Servlet接口
    • 1.3配置:在类上使用注解
    • 1.4启动tomcat访问程序
  • 2. Servlet 执行流程
  • 3. Servlet 生命周期
    • 3.1生命周期概念
    • 3.2生命周期具体流程
    • 3.3代码演示
  • 4. Servlet 体系结构
  • 5. Servlet urlPattern配置
    • 5.1配置多个访问路径
    • 5.2配置规则
    • 5.3代码演示
      • 5.3.1配置多个访问路径
      • 5.3.2配置规则
  • 6. Xml 配置方式编写Servlet
    • 6.1编写Servlet类
    • 6.2在web.xml配置该Servlet
  • 7.总结

1. Servlet 快速入门

1.0Servlet介绍

servlet就是一个java应用程序,实现了servletAPI规范的java应用程序就是一个servlet,主要是用来处理来自web浏览器或者其他HTTP客户端的请求,常常跟我们的业务程序或者我们的数据对接,相当于一个中间层的作用,动态地生成内容给服务器;要部署和运行servlet,需要使用web容器(servlet容器),web容器本质上就是与servlet交互的web服务器组件,web容器负责管理servlet的生命周期,将URL映射到特定的servlet(具体在web.xml中配置)并确保URL请求者具有正确的权限。

1.1创建项目导入依赖

Servlet快速入门只需要四部就可以轻松入门,下面是步骤的一些说明,具体代码详见下面四步

①创建web项目,导入Servlet依赖坐标;

②定义一个类实现Servlet接口,并重写接口中所有方法,并在service方法中输入一句话

③在类上使用@WebServlet注解,配置Servlet访问路径

④启动tomcat,浏览器出入URL访问Servlet

Servlet详细教程_第1张图片

在maven项目pom.xml文件中导入javax.servlet-api坐标依赖

  <dependency>
      <groupId>javax.servletgroupId>
      <artifactId>javax.servlet-apiartifactId>
      <version>3.1.0version>
      <scope>providedscope>
    dependency>

1.2定义类实现Servlet接口

创建ServletDemo1类并实现Servlet接口

public class ServletDemo1 implements Servlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("helloWord1");
    }
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

1.3配置:在类上使用注解

Servlet详细教程_第2张图片

1.4启动tomcat访问程序

在浏览器输入以下网址,在控制台输出helloWorld即入门成功

http://localhost:8080/servlet_demo_war_exploded/demo1

控制台输出信息:

image-20220826121153662


注意:

​ 不会创建maven项目可以详见tomcat从入门到入坑这篇文章,手把手教你如何创建maven项目,

链接:https://blog.csdn.net/qq_52699757/article/details/126532387?spm=1001.2014.3001.5501

2. Servlet 执行流程

Servlet详细教程_第3张图片

3. Servlet 生命周期

3.1生命周期概念

对象的生命周期指一个对象从被创建到销毁的过程。

3.2生命周期具体流程

​ Servlet运行在Servlet容器(web服务器)中,其生命周期由容器来管理,分为四个阶段

1.加载和实例化

​ 默认情况下,当servlet第一次被访问时,由容器创建Servlet对象,当然也可以自己修改默认配置,如果想让服务器在启动时就创建Servlet对象,只需要在注解里面加入loadOnStartup=0或正整数即可,数字越小优先级越高,即**@WebServlet(urlPatterns=“/demo”,loadOnStartup=1)**

2.初始化

​ 在Servlet实例化后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件,创建连接等初始化的工作,该方法只调用一次。

3.请求处理

​ 每次请求Servlet时,Servlet容器都会调用Servlet的service方法对请求进行处理

4.服务终止

​ 当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法完成资源的释放,在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后就会被Java的垃圾收集器所回收

3.3代码演示

**
 * 测试Servlet生命周期
 */
@WebServlet("/demo2")
public class ServletDemo2 implements Servlet {

    /**
     * 初始化方法
     * 1.调用时机:默认情况下,Servlet被第一次访问。
     * 2.调用次数:1次
     * @param servletConfig
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init.....");
    }
    /**
     * 提供服务
     * 1.调用时机:每一次Servlet被访问的时候
     * 2.调用次数:多次
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("helloWord1");
    }
    /**
     * 销毁
     * 1.调用时机:内存释放或者服务器关闭的时候,Servlet对象会被销毁
     * 2.调用次数:1次
     */
    @Override
    public void destroy() {

    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    @Override
    public String getServletInfo() {
        return null;
    }
}

4. Servlet 体系结构

Servlet详细教程_第4张图片

由于直接继承Servlet需要实现里面的所有方法,每次写代码都需要判断服务器是get请求还是post请求,使得程序繁琐,所以我们在写程序的时候不再实现Servlet方法,直接继承HttpServlet类,来重写里面的doGet方法和doPost方法

代码如下:

Servlet详细教程_第5张图片


/**
 * 测试HttpServlet生命周期
 */
@WebServlet("/demo3")
public class ServletDemo3 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet.........");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

5. Servlet urlPattern配置

Servlet要想被访问,必须配置其访问路径(urlPattern)

5.1配置多个访问路径

@WebServlet(urlPattern={“/demo1”,“/demo2”})


5.2配置规则

Servlet详细教程_第6张图片

注意: /和/*区别:

​ 当我们的项目中Servlet配置了"/",会覆盖tomcat中的默认DefaultServlet,当其他的url-pattern都匹配不上时都会走这个Servlet,静态网页就不会显示

​ 当我们的项目中配置了"/*",意味着匹配任意访问路径

5.3代码演示

5.3.1配置多个访问路径

/**
 *  Servlet urlPattern配置
 *  1.配置多个访问路径
 *  在浏览器访问
 *      http://localhost:8080/servlet_demo_war_exploded/demo4 或
 *      http://localhost:8080/servlet_demo_war_exploded/demo5 都能访问成功
 *  2.配置规则(在后面讲)
 *      ①精准匹配
 *      ②目录匹配
 *      ③扩展名匹配
 *      ④任意匹配
 */
//
@WebServlet(urlPatterns = {"/demo4","/demo5"})
public class ServletDemo4 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo4AndDemo5");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

5.3.2配置规则

①精准匹配

/**
 *  2.配置规则
 *      ①精准匹配
 *          配置路径:@WebServlet("/user/select")
 *          访问路径:http://localhost:8080/servlet_demo_war_exploded/user/select
 *      ②目录匹配
 *      ③扩展名匹配
 *      ④任意匹配
 */

@WebServlet("/user/select")
public class ServletDemo5 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("精准匹配.......");
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

②目录匹配

/**
 *  2.配置规则
 *      ①精准匹配
 *          配置路径:@WebServlet("/user/select")
 *          访问路径:http://localhost:8080/servlet_demo_war_exploded/user/select
 *      ②目录匹配
 *          配置路径:@WebServlet("/user/*")
 *  *       访问路径:http://localhost:8080/servlet_demo_war_exploded/user/aaa
 *                 http://localhost:8080/servlet_demo_war_exploded/user/bbb
 *                 *表示可以是任意字符
 *          思考:当精准匹配和目录匹配路径一样的时候,例如:当我们输入http://localhost:8080/servlet_demo_war_exploded/user/select这个网址的时候他会匹配哪一个Servlet
 *          答案:会匹配精准匹配的Servlet,因为精准匹配的优先级高
 *      ③扩展名匹配
 *          配置路径:@WebServlet("*.do")
 *          访问路径:http://localhost:8080/servlet_demo_war_exploded/aaa.do
 *                 http://localhost:8080/servlet_demo_war_exploded/bbb.do
 *          注意:*前面不可以有/,否则会报错
 *      ④任意匹配
 */

@WebServlet("*.do")
public class ServletDemo7 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("扩展名匹配........");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

④任意匹配

/**
 *  2.配置规则
 *      ①精准匹配
 *          配置路径:@WebServlet("/user/select")
 *          访问路径:http://localhost:8080/servlet_demo_war_exploded/user/select
 *      ②目录匹配
 *          配置路径:@WebServlet("/user/*")
 *  *       访问路径:http://localhost:8080/servlet_demo_war_exploded/user/aaa
 *                 http://localhost:8080/servlet_demo_war_exploded/user/bbb
 *                 *表示可以是任意字符
 *          思考:当精准匹配和目录匹配路径一样的时候,例如:当我们输入http://localhost:8080/servlet_demo_war_exploded/user/select这个网址的时候他会匹配哪一个Servlet
 *          答案:会匹配精准匹配的Servlet,因为精准匹配的优先级高
 *      ③扩展名匹配
 *          配置路径:@WebServlet("*.do")
 *          访问路径:http://localhost:8080/servlet_demo_war_exploded/aaa.do
 *                 http://localhost:8080/servlet_demo_war_exploded/bbb.do
 *          注意:*前面不可以有/,否则会报错
 *      ④任意匹配
 *          配置路径: @WebServlet("/")
 *                  @WebServlet("/*")
 *          访问路径:http://localhost:8080/servlet_demo_war_exploded/hehe
 *                  http://localhost:8080/servlet_demo_war_exploded/haha
 *          注意:在写程序的时候尽量不要使用任意匹配路径,”/*“优先级大于”/“
 */

@WebServlet("/")
public class ServletDemo8 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("任意匹配........");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

6. Xml 配置方式编写Servlet

Servlet从3.0版本后开始支持使用注解配置,3.0版本只支持XML配置文件的配置防护,具体实现步骤也不复杂,首先是编写Servlet类,然后在web.xml中配置该Servlet就可完成Servlet的XML配置,具体演示见下方代码

6.1编写Servlet类


/**
 * 基于web.xml配置该Servlet
 */

public class ServletDemo9 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo9.......");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

6.2在web.xml配置该Servlet

web.xml配置文件

<web-app>
  <display-name>Archetype Created Web Applicationdisplay-name>
  <servlet>
    <servlet-name>demo9servlet-name>
    <servlet-class>com.tz.servlet.ServletDemo9servlet-class>
  servlet>
  <servlet-mapping>
    <servlet-name>demo9servlet-name>
    <url-pattern>/demo9url-pattern>
  servlet-mapping>
web-app>

7.总结

在编写程序的时候直接实现HttpServlet类,然后重写doGet和doPost方法,然后在类上使用注解@WebServlet(urlPatterns="/",loadOnStartup=-1)

模板如下:

@WebServlet(urlPatterns="/demo",loadOnStartup=-1)
public class ServletDemo3 extends HttpServlet {
	//重写doGet方法
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //写实现方法
    }
	//重写doPost方法
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//写实现方法
    }
}

注意:源代码已经上传到码云上,需要的自行下载

地址: https://gitee.com/tzmoxi/project-collection.git

Servlet详细教程_第7张图片

你可能感兴趣的:(JavaWeb,servlet,java,后端)