Servlet.

一、servlet快速入门

1、新建的web项目工程,并导入Servlet依赖:(这里也要导入Tomcat服务器依赖,因为Servlet需要依赖于Tomcat才能运行,也就是说Servlet是在Maven环境下的Web项目中创建的)

因为这是在Maven环境下做的web项目,玩的就是Servlet 肯定要把Servlet依赖导入该项目了,就和Mybatis一样, 用Mybatis玩项目 就肯定把Mybatis依赖导入进来了~

创建步骤:看tomcat笔记中如何创建Maven环境的web项目

注意: 

因为这里我们是以Maven新建的web-demo工程,之所以这个工程能导入很多包就是Maven管理项目的功劳, 当我们本地仓库没有该包的时候 就会去阿里云仓库帮我们下载该包供项目使用, 因此我们每次以Maven创建的项目都调一下本地仓库地址

 

2 & 3、创建:定义一个类,实现servlet接口  &  配置 加注解 配置Servlet的访问路径 :

注意: 加@Overide注解 报红的话:记得快速导入 在pom.xml文件当中导入注解依赖

 4、访问:启动tomcat服务器,浏览器输入地址,访问该Servlet

注意:这里我们也不用再重新配置tomcat到idea当中了,因为我们已经下载过插件,Tomcat服务器已经集成到idea当中了(如果tomcat服务器没有集成到idea当中 就需要先把tomcat服务器集成到idea当中 【方便作用】)

我们创建一个新工程或模块的时候:要注意有没有配置Maven (尽量该项目用自己的本地仓库或阿里云仓库 设置一下 ) 和 Tomcat服务器集成到idea当中(没有的话就看前面的笔记 配置到该工程当中)

启动tomcat服务器: 

 

 

客户端访问服务器当中部署的web-demo项目中的 /demo1 路径下的资源:

 

 二、Servlet 执行流程

改正:Servlet不是ServletDemo1,ServletDemo1只不过是实现的Servlet的一个类,本质上我们操作的是Servlet中的方法(只不过Servlet接口不能new对象 但被一个类重写全部的方法后就可以了 注意下面标注的Servlet:这里的Servlet就代表代码中的:ServletDemo1 是错误的 )

 三、Servlet 生命周期

 改正:Servlet就是实现Servlet的类 是错误的,就是Servlet,因为我们操作的就是Servlet中的方法,只不过Servlet是接口

我们下面对Servlet当中的方法进行演示详解:

1、init()方法:

*  作用:初始化对象的方法,完成一些如加载配置文件、创建连接等初始化工作,该方法只调用一次
*  1、调用时机:默认情况下,Servlet被第一次访问(请求)时,Tomcat服务器帮我们new ServletDemo2 对象

 *  调用Servlet中的init方法 ( 这里ServletDemo2 只不过是Servlet的一个过渡载体,因为Servlet是接口不能new对象)
 *  2、调用次数:只调用1次,再访问该Servlet时就不会再调用该init方法

 测试演示:

 

演示当我们服务器启动时就创建Servlet对象初始化init()方法:(也就是服务器启动后就把对象创建号并且调用了init方法 不再通过浏览器(客户端)访问一次后再调用了,增加了效率)

 

 2、service()方法:

*  作用: 提供服务的作用,当浏览器访问Servlet的时候,都会调用Servlet中的service()方法对请求进行处理

 *  调用次数:多次 ( 访问一次服务器当中的Servlet,就会调用一次Servlet当中的service方法 )

 服务器开启状态的时候假设我们访问6次 演示如下:

 3、destroy()方法:

*  销毁方法
     *  1、调用时机:内存释放的时候或者服务器关闭的时候 Servlet对象会被销毁,就会调用该方法释放资源
     *  2、调用次数: 一次  (因为对象只创建一次 new一次)

 如果想演示destroy()销毁方法:需要是正常关闭tomcat服务器,正常关闭演示如下:(优化后的idea强制关闭也能显示destroy方法中的内容)

四、Servlet方法介绍 & 体系结构

后两个方法介绍: 

 

package com.it.heima.web;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

/**
 * Servlet后两个方法介绍
 */

@WebServlet(urlPatterns = "/demo3",loadOnStartup = 1)
public class ServletDemo3 implements Servlet {
    /**
     *  定义一个全局变量 把ServletConfig对象赋给这个全局变量当中 然后供getServletConfig方法使用返回
     */
    private ServletConfig servletConfig;

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        this.servletConfig =servletConfig;      // 把对象引用赋给全局变量引用
        System.out.println("init .....");
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println(" hello world~ ");
    }

    @Override
    public void destroy() {
        System.out.println("destroy .....");
    }

    /**
     * 这个方法一般我们返回 null 或者 空字符串 即可
     * @return null or ""
     */
    @Override
    public String getServletInfo() {
        return null;
    }

    /**
     * 这个方法是来获取ServletConfig对象的   ServletConfig这个对象是init()方法中的参数
     * init()方法是被Tomcat服务器对象调用的,并且把ServletConfig 对象参数传入 init()方法当中
     * 因此我们这个方法当中如果想返回 init()方法当中的对象(参数) 就需要写一个全局变量 把init()方法当中的对象赋上去
     * 然后在这个 getServletConfig 方法当中返回即可 [ 如果不设定一个全局变量 肯定访问不到了 不设定的话那个对象只能在init()参数当中 ]
     *
     * @return
     */
    @Override
    public ServletConfig getServletConfig() {
        return servletConfig;
    }
}

 会发现以上的方法当中我们最常用的也就是Servlet()方法 但是我们自定义的类实现Servlet接口的时候必须要重写接口当中的全部方法(5个) 显然有点麻烦, 所以我们下面学习Servlet 体系结构:就是专门对service方法的封装

Servlet 体系结构: 

演示如下: 

把注释搞懂,就知道了为什么用HttpServlet这个类 封装 Servlet接口中的service方法: 

package com.it.heima.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 *  这里就相当于单独对Servlet当中的service()方法的一个封装
 *  等会会介绍HttpServlet的原理, 为什么要这样写service()方法
 *      就是因为当用户端(浏览器)访问我们的服务器当中的Servlet资源的时候,其实service()方法当中也做了很多
 *      对用户端数据的解析,解析是get请求还是post请求, get请求做什么逻辑,post请求做什么逻辑 要写很多
 *      所以这里HttpServlet这个类就是对Servlet当中的service()方法的一个封装
 *      当用户是以get请求方式请求服务器当中部署的资源的时候 就走HttpServlet类当中的doGet()方 
 *      法
 *      当用户是以post请求方式请求服务器当中部署的资源的时候 就走HttpServlet类当中的doPost
 *        ()方法 这样就方便了很多
 *      如果是在Servlet接口当中service()方法当中做处理客户端是以get还是post方式请求浏览器当中 
 *      的数据的话,还要做判断是否是get请求,是的话怎么怎么样.... 是否是post请求....  太麻烦
 *      HttpServlet这个类直接搞成了两个分支 一个get请求分支  一个post请求分支 方便了很多
 */

@WebServlet("/demo4")   // 访问路径
public class ServletDemo4 extends HttpServlet {

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

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

假设我们把这个web-demo项目部署到服务器当中,然后对"/demo4"路径进行访问 :

注意:直接在浏览器当中访问相对应的路径,这种默认是get请求方式 (就是说用户是以get请求方式请求)

 

 接下来我们演示post请求方式请求项目当中的"/demo4"的资源:

我们需要写个表单 请求方式为post请求:

这里的a.html表单页面也相当于一个普通的浏览器(用户端)只不过这个页面是写出来的

提交后以post请求方式请求(这里的请求方式也可以写成get请求,写成get请求后就输出的是get.....了 ,因为调用的是doGet()方法了, 上面已经验证过了 ):

 开启服务器进行访问a.html页面:下面的操作和get请求时一样的

 

 

原生的在Servlet接口中的service()方法当中的处理客户端的get和post请求:

因此我们用到了HttpServlet类进行封装该Servlet接口中的service()方法,进行处理客户端的get或者post请求 

五、Servlet urlPattern配置

1、一个Servlet,可以配置多个urlPattern(访问路径) 

 演示如下:

 

客户端访问服务器当中部署的web-demo项目中的demo5路径下的资源演示如下(浏览器默认get请求方式 所以调用doGet()方法下的资源 ): 

 

 

 

2、urlPattern配置规则

通常就是用精确匹配规则

精确匹配:

 客户端访问该路径下资源(默认get请求):

 目录匹配:也就是说客户端在输入URL的时候:/user/ 后面写什么都可以 都能访问到该路径下的资源

 注意:如果我们有两个资源 一个是精确路径 为:/demo5/select  另一个资源是目录匹配路径为 :

/demo5/*  那么客户端如果想访问项目中的 /demo5/select 资源的话 会访问这两个中的哪个资源呢: 答案就是 /demo5/select 路径下的资源 (遵守最小范围规则,范围越小越访问)

六、WEB.XML配置Servlet 

注:xml: 是web.xml

 演示如下:

 web.xml中配置Servlet中的访问路径:

这里面配的 /demo13   就相当于我们在资源上面 @WebServlet("/demo13") 访问路径 意义是一样的

 服务器开启后把该项目部署到服务器当中 然后浏览器(客户端)访问该路径下的资源演示:

服务器开启并把项目部署到服务器:(用的是tomcat服务器插件 忘记的话看tomcat笔记)

 客户端访问项目中上面写的 /demo13 路径下的资源:

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值