Servlet要点总结

一、什么是 Servlet

Servlet 在开发动态 WEB 工程中,得到广泛的应用,掌握好 Servlet 非常重要了 , Servlet(
) SpringMVC 的基础
Servlet(java 服务器小程序 ) ,它的特点 :
1. 他是由服务器端调用和执行的 ( 一句话:是 Tomcat 解析和执行 )
2. 他是用 java 语言编写的 , 本质就是 Java
3. 他是按照 Servlet 规范开发的 ( 除了 tomcat->Servlet weblogic->Servlet)
4. 功能强大,可以完成几乎所有的网站功能 ( 在以前,我们老程员,使用 Servlet 开发网站 )
术栈要求高

二、快速入门- 手动开发 Servlet

1.需求说明

(1)开发一个 HelloServlet
(2)当浏览器 访问 http://localhost:8080/web 应用名/helloServlet 时,后台输出 "hi
HelloServelt"

2.具体步骤

1. 编写类HelloServlet去实现 Servlet 接口
2. 实现 service 方法,处理请求,并响应数据
3. 在 web.xml 中去配置 servlet 程序的访问地址

3.演示

1. 创建 hspedu_servlet JavaWeb 工程,并配置好 Tomcat
2. 添加 servlet-api.jar( tomcat/lib ) 到工程 , 因为 servlet.jar 不是 jdk 自带的 , 要引入
3. src 下 包 com.hspedu.servlet.HelloServlet.java ,并实现 Servlet 接口

4.在web.xml配置HelloServlet,即:给HelloServlet 提供对外访问地址 

5.通过浏览器访问HelloServlet ,看是否正确(记住要redeploy[快] 或者 restart[慢])

package com.hspedu.servlet;

import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * 解读
 * 1. 开发一个Servlet 需要 实现Servlet接口
 * 2. 实现Servlet接口的方法5个
 */
public class HelloServlet implements Servlet {


    private int count = 0; //属性

    /**
     * 1.初始化 servlet
     * 2.当创建HelloServlet 实例时,会调用init方法
     * 3. 该方法只会被调用一次
     * @param servletConfig
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init() 被调用");
    }

    /**
     * 返回ServletConfig 也就是返回Servlet的配置
     * @return
     */
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /**
     * 1. service方法处理浏览器的请求(包括get/post)
     * 2. 当浏览器每次请求Servlet时,就会调用一次service
     * 3. 当tomcat调用该方法时,会把http请求的数据封装成实现ServletRequest接口的request对象
     * 4. 通过servletRequest 对象,可以得到用户提交的数据
     * 5. servletResponse 对象可以用于返回数据给tomcat->浏览器
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest,
                        ServletResponse servletResponse) throws ServletException, IOException {

        count++;
        //如果count的值,在不停的累计,说明HelloServlet是单例的
        System.out.println("hi HelloServlet~ count= " + count);
        //Tomcat每处理一次http请求,就生成一个新的线程
        System.out.println("当前线程id= " + Thread.currentThread().getId());

        //思考->从servletRequest对象来获取请求方式->
        //1. ServletRequest 没有得到提交方式的方法
        //2. ServletRequest 看看ServletRequest子接口有没有相关方法
        //3. 老师小技巧:ctrl+alt+b => 可以看到接口的子接口和实现子类
        //4. 把servletReqeust转成 HttpServletRequest引用
        //5. 仍然是Java基础的OOP
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        String method = httpServletRequest.getMethod();
        if("GET".equals(method)) {
            doGet(); //用doGet() 处理GET请求
        } else if("POST".equals(method)) {
            doPost(); //用doPost() 处理POST请求
        }

    }

    /**
     * 用于响应get请求的
     */
    public void doGet() {
        System.out.println("doGet() 被调用..");
    }

    /**
     * 用于响应post请求的
     */
    public void doPost() {
        System.out.println("doPost() 被调用..");
    }

    /**
     * 返回servlet信息,使用较少
     * @return
     */
    @Override
    public String getServletInfo() {
        return null;
    }

    /**
     * 1. 该方法是在servlet销毁时,被调用
     * 2. 只会调用一次
     */
    @Override
    public void destroy() {
        System.out.println("destroy() 被调用...");
    }
}

 4.浏览器调用 Servlet 流程分析

三、Servlet 生命周期 

主要有三个方法
1. init() 初始化阶段
2. service() 处理浏览器请求阶段
3. destroy() 终止阶段

1.初始化阶段

Servlet 容器 ( 比如 : Tomcat) 加载 Servlet ,加载完成后, Servlet 容器会创建一个 Servlet 实例
并调用 init() 方法, init() 方法只会调用一次 , Servlet 容器在下面的情况装载 Servlet

 (1). Servlet 容器(Tomcat)启动时自动装载某些 servlet,实现这个需要在 web.xml 文件中添加 <load-on-startup>1</load-on-startup> 1 表示装载的顺序

(2)在 Servlet 容器启动后,浏览器首次向 Servlet 发送请求(这个前面说过)

(3)Servlet 重新装载时(比如 tomcat 进行 redeployredeploy 会销毁所有的 Servlet 实例】)浏览器再向 Servlet 发送请求的第 1 次

2.处理浏览器请求阶段(service 方法)

1. 每收到一个 http 请求,服务器就会产生一个新的线程去处理 [ 线程 ]
2. 创建一个用于封装 HTTP 请求消息的 ServletRequest 对象和一个代表 HTTP 响应消息的
ServletResponse 对象
3. 然后调用 Servlet service() 方法并将请求和响应对象作为参数传递进去

3.终止阶段 destory 方法(体现 Servlet 完整的生命周期)

web 应用被终止,或者 Servlet 容器终止运行,或者 Servlet 类重新装载时,会调用 destroy()
方法 , 比如重启 tomcat , 或者 redeploy web 应用

四、通过继承 HttpServlet 开发 Servlet

在实际项目中,都是使用继承 HttpServlet 类开发 Servlet 程序, 更加方便

1.具体的开发步骤

1. 编写一个类去继承 HttpServlet
2. 根据业务需要重写 doGet doPost 方法
3. web.xml 中的配置 Servlet 程序

2.应用实例

1. 创建 D:\idea_java_projects\hspedu_servlet\src\com\hspedu\servlet\HiServlet.java
package com.hspedu.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HiServlet extends HttpServlet {

    //重写HttpServlet的doGet 和 doPost
    /**
     * 处理doGet请求
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HiServlet doGet()...");
    }

    /**
     * 处理doPost
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HiServlet doPost()...");
    }
}

2. 修改 D:\idea_java_projects\hspedu_servlet\web\WEB-INF\web.xml 完成配置

    <!-- 配置HiServlet -->
    <servlet>
        <servlet-name>HiServlet</servlet-name>
        <servlet-class>com.hspedu.servlet.HiServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HiServlet</servlet-name>
        <url-pattern>/hiServlet</url-pattern>
    </servlet-mapping>

五、IDEA 开发 Servlet 程序

说明
编手动开发 Servlet 需要程序员自己配置 Servlet , 比较麻烦,在工作中,直接使用 IDEA
Servlet 会更加方便
应用实例

 

 六、Servlet 注意事项和细节

1. Servlet 是一个供其他 Java 程序( Servlet 引擎)调用的 Java 类,不能独立运行
2. 针对浏览器的多次 Servlet 请求,通常情况下,服务器只会创建一个 Servlet 实例对象,
也就是说 Servlet 实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至
web 容器退出 / 或者 redeploy web 应用, servlet 实例对象才会销毁 
3. Servlet 的整个生命周期内, init 方法只被调用一次。而对每次请求都导致 Servlet
擎调用一次 servlet service 方法。
4. 对于每次访问请求, Servlet 引擎都会创建一个新的 HttpServletRequest 请求对象和一个
新的 HttpServletResponse 响应对象,然后将这两个对象作为参数传递给它调用的 Servlet
service() 方法, service 方法再根据请求方式分别调用 doXXX 方法
5. 如果在 <servlet> 元素中配置了一个 <load-on-startup> 元素,那么 WEB 应用程序在启动时,
就会装载并创建 Servlet 的实例对象、以及调用 Servlet 实例对象的 init() 方法 , 老师聊聊 (
时发送邮件的服务 / 自动启动 -> 完成任务 )

七、Servlet - 注解方式

1.快速入门

具体步骤
1. 编写类 OkServlet 去继承 HttpServlet
2. 注解方式配置 OkServlet, 一个 Servlet 支持配置多个 urlPattern

2.Servlet urlPattern 配置

(1)精确匹配

配置路径 : @WebServlet(" /ok/zs ")
访问 servlet: localhost:8080/servlet /ok/zs

(2)目录匹配

配置路径 : @WebServlet(" /ok/* ")
访问文件 : localhost:8080/servlet /ok/aaa localhost:8080/servlet /ok/bbb

(3) 扩展名匹配

配置路径 : @WebServlet("*.action")
访问文件 : localhost:8080/hsp /zs.action localhost:8080/hsp /ls.action
提示 : @WebServlet(" / *.action") , 不能带 / , 否则 tomcat 报错

(4) 任意匹配

配置路径 : @WebServlet("/") @WebServlet("/*")
访问文件 : localhost:8080/hsp /aaa localhost:8080/hsp /bbb localhost:8080/hsp /ccc
提醒: / /* 的配置,会匹配所有的请求,这个比较麻烦,要避免

3.注意事项和使用细节

1 、当 Servlet 配置了 "/", 会覆盖 tomcat DefaultServlet, 当其他的 utl-pattern 都匹配
不 上 时 , 都 会 走 这 个 Servlet, 这 样 可 以 拦 截 到 其 它 静 态 资 源 , 比 如
D:\hspedu_javaweb_temp\hspedu_servlet\web\hi.html
查看: tomcat/conf/web.xml , 配置的 DefaultServlet
The default servlet for all web applications, that serves static resources.
这个默认的 servlet 是处理静态资源的,一旦拦截,静态资源不能处理
2 、当 Servelt 配置了 "/*", 表示可以匹配任意访问路径
3 、提示 : 建议不要使用 / /* , 建议尽量使用 精确匹配
4 、优先级遵守 : 精确路径 > 目录路径 > 扩展名路径 > /* > /

相关推荐

  1. servlet总结

    2024-02-18 17:38:02       34 阅读
  2. XML要点总结

    2024-02-18 17:38:02       26 阅读
  3. qml要点总结(带例子),适合临阵磨枪

    2024-02-18 17:38:02       11 阅读
  4. <span style='color:red;'>Servlet</span>

    Servlet

    2024-02-18 17:38:02      31 阅读
  5. <span style='color:red;'>servlet</span>

    servlet

    2024-02-18 17:38:02      42 阅读
  6. <span style='color:red;'>Servlet</span>

    Servlet

    2024-02-18 17:38:02      15 阅读
  7. <span style='color:red;'>Servlet</span>

    Servlet

    2024-02-18 17:38:02      19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-18 17:38:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-18 17:38:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-18 17:38:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-18 17:38:02       20 阅读

热门阅读

  1. 【字符串】AC自动机

    2024-02-18 17:38:02       33 阅读
  2. 作业day6

    2024-02-18 17:38:02       27 阅读
  3. vivado FIR Filters

    2024-02-18 17:38:02       30 阅读
  4. 小程序API能力汇总——基础容器API(二)

    2024-02-18 17:38:02       24 阅读
  5. Z4.3 求最大公约数和最小公倍数。

    2024-02-18 17:38:02       25 阅读
  6. [AIGC] Kafka 消费者的实现原理

    2024-02-18 17:38:02       30 阅读
  7. ADO世界之FIRST

    2024-02-18 17:38:02       26 阅读
  8. 面试计算机网络框架八股文十问十答第七期

    2024-02-18 17:38:02       34 阅读
  9. 单点登录和单设备登录

    2024-02-18 17:38:02       22 阅读