Servlet入门

学习目标

初步的了解Servlet的基本知识

学习内容

  1. 快速入门
  2. Servlet执行流程
  3. Servlet生命周期
  4. Servlet方法介绍
  5. Servlet体系结构
  6. Servlet urlPattern配置
  7. XML配置方式编写Servlet(了解)

学习知识点

Servlet快速入门

1、创建web项目,导入Servlet依赖坐标

 <dependency>
 <groupId>javax.servlet</groupId>
 <artifactId>javax.servlet-api</artifactId>
 <version>3.1.0</version>
 <scope>provided</scope>
 </dependency>

其中的内容先copy使用

scope标签中的provided依赖环境是在编译环境和测试环境有效在运行环境无效。web项目打包成war包不会报错,因为tomcat中有servlet的jar包

2、创建:定义一个类,继承(implements) Servlet接口,并重写接口中所有方法,并在service方法中输入一句话
输出的这句话后期可以作为测试使用

 public class ServletDemo1 implements Servlet {
 public void service(){}
 }

3、配置:在类上使用@WebServlet注解,配置该Servlet的访问路径

 @WebServlet("/demo1")
 public class ServletDemo01 implements Servle{}
 //此时注解中的/demo1,有对应的key值,key是value
// 有一个键值对,并且键是key时value可以省略

4、访问:启动Tomcat,浏览器输URL访问该Servlet

http://localhost:8080/web-demo/demo1

Servlet执行流程

http://localhost:8080/web-demo/demo1

  • http://localhost:8080——>Apache TomCat的web服务器
  • web-demo——>web项目(web-demo)
  • demo1——>注解中value的值;

通过web服务器调用service()方法,每当访问该Servlet时都会在服务器面板上输出前面在其中输入的一句话
1、Servlet由谁创建?Servlet方法由谁调用?

Servlet由web服务器创建,Servlet方法由web服务器调用。

服务器怎么知道servlet中一定有service方法?

因为我们自定义的Servlet,必须实现Servlet接口并复写其方法,而servlet接口中有service方法

Servlet生命周期

  • 对象的生命周期指一个对象从被创建到被销毁的整个过程。
  • Servlet运行在servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段:

1.加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象

@WebServlet(urlPattents = "/demo",loadOnStartup = 1)

此处使用了urlPattents,因为在WebServlet.class中有

  String[] value() default {};
  String[] urlPatterns() default {};

因为有两个键值对,可以用urlPattents代替value增加了阅读效率
loadOnStartup代表的是优先级,默认为-1

负整数:第一次被访问时创建Servlet对象
0或正整数:服务器启动时创建Servlet对象,数字越小优先级越高

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

    /**
     * 完成初始化的方法
     * 1、调用时机:默认情况下Servlet第一次被访问的时候,调用
     * 2、调用次数:1次
     * @param servletConfig
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init....");
    }

3.请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的service()方法对请求进行处理。

 /**
     * 提供服务
     * 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("servlet hello world");
    }

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

/**
     * 销毁方法
     * 1、调用时机:在Servlet被销毁的时候
     *(内存释放时,服务器被关闭时,Servlet会被销毁)
     * 2、调用次数:1次
     */
    @Override
    public void destroy() {
        System.out.println("destroy...")    ;

Servlet方法介绍

javaee7_api.CHM百度网盘提取链接 提取码:0160

初始化方法,在Servlet被创建时执行,只执行一次(已介绍)

void init(ServletConfig config)

提供服务方法,每次Servlet被访问,都会调用该方法(已介绍)

void service(ServletRequest req, ServletResponse res)

销毁方法,当servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet(已介绍)

void destroy()

获取ServletConfig对象

ServletConfig getServletConfig()

获取Servlet信息

String getServletlnfo()

getServletlnfo()方法

    @Override
    public ServletConfig getServletConfig() {
        return null;
        //可以返回null可以返回"" (空字符串) 
    }

getServletConfig()方法

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

在init()方法中里面的参数是返回的是ServletConfig类型

此刻的需求是在getServletConfig()方法中使用init()方法的局部变量,只需要将init()局部变量作用域提升,提升到成员变量的位置,将来的作用域整个类里面都可以使用

class类中增加

  private ServletConfig config;

在init()方法中需要进行赋值

//添加
this.config = config;
//当前局部变量config的值赋值给成员变量config

赋值后在getServletConfig()方中返回即可

return config;

Servlet体系结构

Servlet——>Servlet体系根接口
Genericservlet——>Servlet抽象类
Httpservlet——>对HTTP协议封装的Servlet实现类

我们将来开发B/S架构的web项目,都是针对HTTP协议,所以我们自定义Servlet,会继承HttpServlet

@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...");
    }
}

doGet()方法

在浏览器上访问URL:http://localhost:8080/web-demo/demo4,相当与是get请求,会输出get…

doPost()方法,在webapp中创建一个html文件,里面写一个form表单,method指定为post方式

<form action="/web-demo/demo4" method="post">
    <input type="text" name="username">
    <input type="submit">
</form>

在input中输入然后提交
在input中输入然后提交
在idea界面会出现post…,说明调用了doPost()方法
在这里插入图片描述
思考

1、HttpServlet中为什么要根据请求方式的不同,调用不同方法?

post和get请求请求参数的位置不同
1、post提交的请求参数在请求体里
2、get提交的请求参数在请求行中

2、如何调用

在service()方法中不同的请求方式,进行分别的处理

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
      //根据请求方式的不同,进行分别的处理
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        //1、获取请求方式
        String method = request.getMethod();
        //2、判断请求方式是get还是post
        if ("GET".equals(method)){
            //get方式的处理逻辑
            
        }else if ("POST".equals(method)){
            //post方式的处理逻辑
        }
    }

可以另外写个MyHttpServlet文件,在里面写方法,以后可以直接调用

    protected void doPost(ServletRequest servletRequest, ServletResponse servletResponse) {
    }
    protected void doGet(ServletRequest servletRequest, ServletResponse servletResponse) {
    }
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
      //根据请求方式的不同,进行分别的处理
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        //1、获取请求方式
        String method = request.getMethod();
        //2、判断请求方式是get还是post
        if ("GET".equals(method)){
            //get方式的处理逻辑
            doGet(servletRequest,servletResponse);
        }else if ("POST".equals(method)){
            //post方式的处理逻辑
            doPost(servletRequest,servletResponse);
        }
    }

如果是直接copy的话,在MyHttpServlet上面不要加@WebServlet注解,会产生冲突

新写一个ServletDemo5不需要重新写,直接继承MyHttpServlet
例如:

@WebServlet("/demo5")
public class ServletDemo5 extends MyHttpServlet{
    @Override
    protected void doGet(ServletRequest servletRequest, ServletResponse servletResponse) {
        System.out.println("get...");
    }
    @Override
    protected void doPost(ServletRequest servletRequest, ServletResponse servletResponse) {
        System.out.println("post");
    }
}

用上面的方法验证依旧可以在IDE上得出输出结果

自己写MyHttpServlet,通过继承的方式重写doGet()和doPost()方法,将1.html中的form表单中的action改成/web-demo/demo5进行验证

我们自己写的MyHttpServlet实现了 对HTTP协议的封装,并且根据不同的请求方式,完成了方法的分发

总结:获取请求方式,然后做不同的逻辑判断

HttpServlet使用步骤

  1. 继承HttpServlet
  2. 重写doGet和doPost方法

HttpServlet原理

  • 获取请求方式,并根据不同的请求方式,调用不同的doXxx方法

Servlet urlPattern配置

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

1、urlPattern配置规则
@WebServlet(urlPatterns={"/demo1","/demo2"})
2、urlPattern配置规则
精准匹配
在这里插入图片描述
目录匹配

在这里插入图片描述

精确匹配的优先级高于目录匹配
扩展名匹配
在这里插入图片描述
任意匹配

在这里插入图片描述

/* 的优先级高于 /
/ 和 /****区别:
当我们的项目中的Servlet配置了“/”,会覆盖掉tomcat中的DefaultServlet,当其他的url-pattern都匹配不上时都会走这个Servlet>
当我们的项目中配置了“/ *”,意味着匹配任意访问路径

在这里插入图片描述

XML配置方式编写Servlet(了解)

Servlet 从3.0版本后开始支持使用注解配置,3.0版本前只支持XML 配置文件的配置方式
步骤:

  1. 编写Servlet类
  2. 在web.xml中配置该Servlet

老版本的,不推荐使用,可以直接使用注解

       <!--
        Servlet 全类名
        -->
    <servlet>
        <servlet-name>demo7</servlet-name>
        <servlet-class>zpd.web.ServletDemo7</servlet-class>
    </servlet>
        <!--
            Servlet 访问路径
        -->
    <servlet-mapping>
        <servlet-name>demo7</servlet-name>
        <url-pattern>/demo7</url-pattern>
    </servlet-mapping>

Java新人,正努力学习中,向大牛看齐,有错误请提出,谢谢

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值