前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >E011Web学习笔记-Servlet

E011Web学习笔记-Servlet

作者头像
訾博ZiBo
发布2025-01-06 14:40:11
发布2025-01-06 14:40:11
8700
代码可运行
举报
运行总次数:0
代码可运行

一、Servlet入门

1、概述

概念:

运行在服务器上的小程序;

实际上Servlet是一个接口,定义了Java类被浏览器访问到(或者说被Tomcat识别的)规则;

使用:

自定义一个类实现Servlet接口,复写其中方法;

2、快速入门

步骤:

第一步:创建一个JavaEE项目;

代码语言:javascript
代码运行次数:0
运行
复制
在学习Tomca的时候创建了web项目;

第二步:定义一个类,实现Servlet接口;

代码语言:javascript
代码运行次数:0
运行
复制
public class MyServlet implements Servlet{
    //...
}

第三步:实现接口中的抽象方法;

代码语言:javascript
代码运行次数:0
运行
复制
可根据IDEA的提示实现;
例如:
package com.zibo.servlet;

import javax.servlet.*;
import java.io.IOException;

public class MyServlet 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("Hello Servlet!");
    }

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

    @Override
    public void destroy() {

    }
}

第四步:配置Servlet

代码语言:javascript
代码运行次数:0
运行
复制
-- 在web.xml中配置:
<!--配置Servlet-->
    <servlet>
        <servlet-name>my</servlet-name>
        <servlet-class>com.zibo.servlet.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>my</servlet-name>
        <url-pattern>/my</url-pattern>
    </servlet-mapping>

访问http://localhost:8080/web_war_exploded/my的结果是:

3、执行原理

第一步:当服务器接收到浏览器客户端发出的请求后,会解析请求的URL路径,获取访问的Servlet的资源路径;

第二步:查找web.xml文件,是否存在对应的<url-pattern>标签体内容;

第三步:如果有则查找到对应的<servlet-class>全类名;.

第四步:Tomcat会将字节码文件加载到内存,并创建其对象;

第五步:调用对象的方法;

二、Servlet生命周期方法

1、被创建

执行init方法,执行一次;

一般用于加载资源;

Servlet被创建的时间:
代码语言:javascript
代码运行次数:0
运行
复制
Servlet被创建的时间:
默认情况下,第一次被访问时,Servlet被创建;

可以指定Servlet被创建的时间;
指定Servlet被创建的时间:
<!--配置Servlet-->
    <servlet>
        <servlet-name>my</servlet-name>
        <servlet-class>com.zibo.servlet.MyServlet</servlet-class>
        <!--指定servlet被创建时间
        值为负整数(默认):第一次访问时创建;
        值为正整数:在服务器启动时创建;
        -->
        <load-on-startup>1</load-on-startup>
    </servlet>
Servlet是单例的
代码语言:javascript
代码运行次数:0
运行
复制
问题:
Servlet只执行一次,说明只有一个Servlet对象,Servlet是单例的,当多个用户同时访问时,可能存在安全问题;

解决:
尽量不要在Servlet中定义成员变量。即使定义了成员变量也不要对其值进行修改操作;

2、提供服务

执行service方法,执行多次;

每次访问Servlet时,service方法都会被调用一次;

3、被销毁

执行destroy方法,执行一次;

Servlet被销毁之前(服务器正常关闭时)执行,但是服务器若没有正常关闭,destroy方法是不会执行的;

一般用于释放资源;

4、方法介绍:

代码语言:javascript
代码运行次数:0
运行
复制
package com.zibo.servlet;

import javax.servlet.*;
import java.io.IOException;

public class MyServlet implements Servlet {
    //初始化方法-在Servlet被创建时执行,只会执行一次;
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init...");
    }
    //(了解)获取ServletConfig对象——Servlet的配置对象
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    //提供服务的方法,每次Servlet被访问时执行,会执行多次
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Hello Servlet!");
    }
    //(了解)获取Servlet的一些信息:版本、作者...
    @Override
    public String getServletInfo() {
        return null;
    }
    //销毁方法,在Servlet被杀死时(之前)(服务器被正常关闭时)执行,只执行一次
    @Override
    public void destroy() {
        System.out.println("destroy...");
    }
}

三、Servlet3.0注解配置

1、好处

支持注解配置,可以不需要web.xml了;

2、步骤

第一步:创建JavaEE项目,选择Servlet3.0以上的版本,可以不勾选 web.xml;

第二步:定义一个类,实现Servlet接口,并复写其方法;

第三步:在类上使用@WebServlet注解进行配置;

代码语言:javascript
代码运行次数:0
运行
复制
注解如:只需要配置虚拟目录(资源路径)名字
@WebServlet(urlPatterns = "/my3")
或者
@WebServlet("/my3")

四、IDEA与Tomcat的相关配置

1、IDEA会为每一个Tomcat部署的项目单独建立一份配置文件;

查看控制台的log:Using CATALINA_BASE: "C:\Users\Administrator\.IntelliJIdea2019.2\system\tomcat\Tomcat_9_0_24_web_servlet3"

2、工作空间项目和Tomcat部署的项目,不是同一个,但后者会自动同步前者的所有内容(资源);

WEB-INF目录下的资源不能被浏览器直接访问;

断点调试:使用“小虫子”启动——debug启动;

五、Servlet的体系结构

1、Servlet接口的实现类

GenericServlet -- 抽象类,Servlet的实现类;

HttpServlet -- 抽象类,GenericServlet的子类;

2、GenericServlet

可以通过继承GenericServlet来实现自定义的Servlet类;

继承GenericServlet只需要复写server方法即可,如下:

代码语言:javascript
代码运行次数:0
运行
复制
package com.zibo.servlet;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet("/my")
public class MyServlet extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("成功通过继承GenericServlet实现……");
    }
}
但是,实际开发中并不用这种方式!

3、HttpServlet

是对http协议的封装,可以简化操作;

使用步骤:

第一步:自定义Servlet类继承HttpServlet;

第二步:复写doGet/doPost方法;

代码示例:
代码语言:javascript
代码运行次数:0
运行
复制
package com.zibo.servlet;

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;

@WebServlet("/my")
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
        System.out.println("doGet……");
    }

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

4、Servlet相关配置

①urlpartten:Servlet访问路径:
代码语言:javascript
代码运行次数:0
运行
复制
单个访问路径示例:@WebServlet("/my")

多个访问路径示例:@WebServlet({"/my","/my1","/my2"})
②路径定义规则
代码语言:javascript
代码运行次数:0
运行
复制
三种方式:
1、/xxx
2、/xxx/xxx
/*,*表示随意写都可以访问,如/1、/sfd、/423fsf;
/*的优先级最低;
3、*.do
*.do表示随意写都可以访问,任意字符加上.do,而且do也不是固定的,可以.其他;

六、知识补充

1、将请求从一个servlet转发到另一个资源(servlet,jsp或HTML文件)

代码语言:javascript
代码运行次数:0
运行
复制
示例:
req.getRequestDispatcher("/index.jsp").forward(req,resp);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Servlet入门
    • 1、概述
      • 概念:
      • 使用:
    • 2、快速入门
      • 步骤:
    • 3、执行原理
  • 二、Servlet生命周期方法
    • 1、被创建
      • Servlet被创建的时间:
      • Servlet是单例的
    • 2、提供服务
    • 3、被销毁
    • 4、方法介绍:
  • 三、Servlet3.0注解配置
    • 1、好处
    • 2、步骤
  • 四、IDEA与Tomcat的相关配置
    • 1、IDEA会为每一个Tomcat部署的项目单独建立一份配置文件;
    • 2、工作空间项目和Tomcat部署的项目,不是同一个,但后者会自动同步前者的所有内容(资源);
  • 五、Servlet的体系结构
    • 1、Servlet接口的实现类
    • 2、GenericServlet
      • 但是,实际开发中并不用这种方式!
    • 3、HttpServlet
      • 使用步骤:
      • 代码示例:
    • 4、Servlet相关配置
      • ①urlpartten:Servlet访问路径:
      • ②路径定义规则
  • 六、知识补充
    • 1、将请求从一个servlet转发到另一个资源(servlet,jsp或HTML文件)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档