Java研学-Servlet 基础

news2024/11/20 21:18:18

一 概述

1 介绍

  Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
  狭义的 Servlet 是指Java语言实现的一个接口,广义的 Servlet 是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
  Servlet 本质为运行在 Web服务器(如Tomcat服务器)的,使用 Java编写的小应用程序。

2 作用

  接收浏览器请求并响应数据给浏览器。开发动态资源:Servlet 也是服务器的一种资源,可以供外界(浏览器)去访问。

3 开发步骤

1. 创建一个类实现 javax.servlet.Servlet 接口
2. 实现接口中的所有方法
3. 在 service 方法处理请求和响应数据
4. 配置 Servlet 的访问地址(供外界:浏览器访问)
可以通过 web.xml 文件配置,也可以通过注解配置

4 若找不到Servlet

  ① 打开project Structure,找到Modules
  ② 选择模块
  ③ 点击Dependencies
  ④ 点加号,选择Libraries,选择tomcat,添加即可找到Servlet接口

5 web.xml 开发 Servlet

① 实现步骤
  创建一个 HelloServlet 实现 Servlet 接口
  重写接口中的所有方法,在 service 方法中输出内容到控制台
  配置 web/WEB-INF/web.xml 文件
② 创建 HelloServlet 实现 Servlet 接口

// 重写所有方法,在 service 方法中往控制台输出:Hi~
public class PlayServlet 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("Hi~");
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {
    }
}

③ web配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
          
<!-- 真实路径与映射路径通过name连接-->        
<!-- servlet 信息配置 真实路径-->
<servlet>
    <!--servlet 名字-->
    <servlet-name>HelloServlet</servlet-name>
    <!-- servlet类全限定名-->
    <servlet-class>com.tj.PlayServlet</servlet-class>
</servlet>
<!--servlet 访问地址配置(映射路径) -->
<servlet-mapping>
    <!--servlet 名字:与上面的名字相同 -->
    <servlet-name>HelloServlet</servlet-name>
    <!-- 浏览器访问地址,必须以/开头 -->
    <url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>

④ 部署项目后通过浏览器访问 Servlet(本地地址+项目虚拟访问路径+Servlet访问路径)

6 注解开发 Servlet

① @WebServlet 注解 – 简化 javaweb 代码,省略 web.xml配置文件

@WebServlet注解属性说明
name = “PlayServlet”Servlet名字,等价 < servlet-name >PlayServlet</ servlet-name>
urlPatterns = “/hello”访问地址,等价 < url-pattern>/hello</ url-pattern>
value=“/hello”如果其它属性都不写,可以省略 value,只写访问地址即可。不能与urlPatterns同时指定

② 开发步骤
  使用注解,必须是 JavaEE 6.0 版本以上,Servlet3.0 之后才可以,Tomcat8 已经实现了3.0规范
  创建类实现 Servlet 接口,在类上使用 @WebServlet 注解中添加 urlPatterns=“/hello"或value=”/hello",作为请求路径

③ 创建 PlayServlet,实现接口所有方法,使用注解 @WebServlet 配置访问地址

// 使用注解 @WebServlet 配置访问地址
@WebServlet(name = "PlayServlet",urlPatterns = "/hello")
public class PlayServlet 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("Hi~");
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {}
}

④ 登录 http://localhost:8080/hello 控制台会输出Hi~

二 Servlet 的生命周期

1 名词解释

  类的生命周期:创建对象–> 运行操作–>销毁操作
  Servlet 对象的生命周期:Servlet 创建对象–>初始化操作–> 运行操作–>销毁操作
  Web 服务器管理了 Servlet 的生命周期,Servlet 对象整个过程都是 Web 服务器来管理的。

生命周期操作
实例化Servlet容器Tomcat创建Servlet的实例
初始化该容器调用init()方法,调用一次
请求处理若请求Servlet,则容器调用service()方法,调用多次
服务终止销毁实例之前调用destroy()方法

2 Servlet 接口中生命周期方法

生命周期方法作用运行次数
构造方法在对象实例化的时候执行必须有公共的无参数构造方法一次
void init(ServletConfig config)初始化时执行一次
void service(ServletRequest req, ServletResponse res)每次请求都会执行N次
void destroy()在服务器正常关闭的时候一次

生命周期方法执行顺序图

3 Servlet 的请求流程

localhost:8080/play/hello
1. 浏览器发送请求,Tomcat接收到请求并通过解析请求地址获取到要访问的项目和资源路径
项目访问路径:/play
资源路径: /hello
2. Tomcat服务器内部会扫描play项目下的所有Servlet:获得每一个Servlet的访问地址并存储到集合
中:
Map<String,String> map1 = new HashMap<>();
map1.put("/hello","cn.tj.servlet.PlayServlet");
3. 将资源路径 /hello 作为键从 map1 集合中获得值:得到类全限定名
4. 需要判断是否是第一次访问:
Servlet实例缓存池: Map<String, Servlet> map2 = new HashMap<>();
if(map2.get(“全限定名”) == null){
// 第一次访问,执行第5步
} else{
// 第N次,直接执行第7步
}
5. 通过反射实例化这个 Servlet 对象,存入实例缓存池中.
6. Tomcat 创建 ServletConfig 对象然后调用 init 方法
7. 创建 request 和 response 对象
8. 调用 service 方法,将 request和 response 对象传递进来,在 service 方法中通过
response对象返回输出到浏览器,在浏览器上显示出来。
9. 等待下一次的访问

三 Servlet 继承体系

1 继承结构

继承结构

2 GenericServlet类

  默认实现了 Servlet 和 ServletConfig 这两个接口,将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象。定义Servlet类继承GenericServlet时,只需实现service()方法即可。它的子类是 HttpServlet。

@WebServlet(name = "Play",urlPatterns = "/play")
public class Play extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.err.println("OK");
    }
}

3 HttpServlet类

  本类是对http协议的一种封装,可提前判断请求方式,针对view层传递的get,post请求复写doGet/dopost方法,简化操作。

@WebServlet(name = "Play",urlPatterns = "/play")
public class Play extends HttpServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.err.println("OK");
    }
}

四 ServletConfig 对象

1 作用

  用来封装 Servlet 初始化的时候的一些配置信息,与Servlet有关的配置信息,写在web.xml中,便于修改和维护。

// ServletConfig接口常用方法
String getInitParameter("参数名") // 通过指定的参数名得到参数

2 使用

① 于 web.xml 中通过 init 设置属性

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
<!-- servlet 信息配置 -->
<servlet>
    <!--servlet 名字-->
    <servlet-name>PlayServlet</servlet-name>
    <!-- servlet类全限定名-->
    <servlet-class>com.tj.PlayServlet</servlet-class>
    <!--配置初始化参数init-->
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</servlet>
<!--servlet 访问地址配置 -->
<servlet-mapping>
    <!--servlet 名字:与上面的名字相同 -->
    <servlet-name>PlayServlet</servlet-name>
    <!-- 浏览器访问地址,必须以/开头 -->
    <url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>

② 通过 getInitParameter 获取属性

public class PlayServlet extends HttpServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        // 父类中的方法
        ServletConfig servletConfig = this.getServletConfig();
        // 获取web.xml文件的配置信息
        String code=servletConfig.getInitParameter("encoding");
        servletRequest.setCharacterEncoding(code);
        System.out.println(code);
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {}
}

3 配置多个路径

① 一个 < servlet-mapping> 中写多个 < url-pattern>

< servlet-mapping>
< servlet-name>PlayServlet< /servlet-name>
// 使用两个路径都能访问 PlayServlet
< url-pattern>/hello.html< /url-pattern>
< url-pattern>/hello1.html< /url-pattern>
< /servlet-mapping>

② 一个 < servlet> 对应多个 < servlet-mapping>

// <url-pattern> 中的内容必须唯一,必须以 / 开头。
<servlet-mapping>
<servlet-name>PlayServlet</servlet-name>
<url-pattern>/hello.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>PlayServlet</servlet-name>
<url-pattern>/hello1.html</url-pattern>
</servlet-mapping>

③ 注解形式

@WebServlet(name = "Play",urlPatterns = {"/play","/play1"})
public class Play extends HttpServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.err.println("OK");
    }
}

4 loadOnStartup 属性

  servlet在创建对象或者是初始化的时候需要执行耗时操作,导致相第一个访问的用户要等待比较长的时间。让 web 容器启动的时候创建并初始化 Servlet,这样用户体验度就会增加
① web

<servlet>
    <!--servlet 名字-->
    <servlet-name>PlayServlet</servlet-name>
    <!-- servlet类全限定名-->
    <servlet-class>com.tj.PlayServlet</servlet-class>
    <!--取值范围110,值越小越先加载。默认值是-1:代表第1次访问时创建和初始化-->
    <load-on-startup>1</load-on-startup>
    <!--配置初始化参数init-->
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</servlet>

② 注解

@WebServlet(name = "Play",urlPatterns = {"/play","/play1"},loadOnStartup = 1)
public class Play extends HttpServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.err.println("OK");
    }
}

5 通配符映射 *

通配符格式说明
/* /目录名/*/* :匹配所有的访问地址,必须以 / 开头/admin/*:匹配 admin 目录下的所有地址
*.扩展名匹配某个扩展名结尾的访问地址。如:*.action *.do

  映射路径必须保证唯一性,除通配符结合扩展名使用,否则必须以 / 开头

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1332100.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringMVC:SSM(Spring+SpringMVC+MyBatis)代码整理

文章目录 SpringMVC - 07SSM 框架代码整理一、准备工作1. 分析需求、准备数据库2. 新建一个项目&#xff0c;导入依赖&#xff1a;pom.xml3. 用 IDEA 连接数据库 二、MyBatis 层1. 外部配置文件&#xff1a;db.properties2. MyBatis 核心配置文件&#xff1a;mybatis-config.xm…

超级量化第10期私募大咖——线上分享总结

《掘金之心公众号&#xff1a;gnu_isnot_unix》前Citadel现自营交易与量化管理&#xff0c;分享热点&#xff0c;主观&#xff0c;量化交易内容。活在当下&#xff0c;终身学习 - 给在职却对未来始终迷茫的人的公众号。借此想告诉不断努力&#xff0c;对生活充满热情的读者们&a…

ARM 汇编语言知识积累

博文参考&#xff1a; arm中SP&#xff0c;LR&#xff0c;PC寄存器以及其它所有寄存器以及处理器运行模式介绍 arm平台根据栈进行backtrace的方法-腾讯云开发者社区-腾讯云 (tencent.com) 特殊功能寄存器&#xff1a; SP&#xff1a; 即 R13&#xff0c;栈指针&#xff0c;…

并发踩坑:list共享变量的addAll

背景&#xff1a; 某业务报错了&#xff0c;提示&#xff1a;Caused by: org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.util.ConcurrentModificationException 分析&#xff1a; 这是执行查询时报的 并发修改异常。大概逻辑…

【postgres】8、Range 类型

文章目录 8.17 Range 类型8.17.1 内置类型8.17.2 示例8.17.3 开闭区间8.17.4 无穷区间 https://www.postgresql.org/docs/current/rangetypes.html 8.17 Range 类型 Range 类型&#xff0c;可以描述一个数据区间&#xff0c;有明确的子类型&#xff0c;而且子类型应该能被排序…

【设计模式】RBAC 模型详解

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、什么是 RBAC 呢&#xff1f; 二、RBAC 的组成 三、RBAC 的优缺点 3.1 优点&#xff1a; 3.2 缺点&#xff1a; 四、RBAC 的…

putty免密登录和跳转到winscp相同目录的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

51单片机的羽毛球计分器系统【含proteus仿真+程序+报告+原理图】

1、主要功能 该系统由AT89C51单片机LCD1602显示模块按键等模块构成。适用于羽毛球计分、乒乓球计分、篮球计分等相似项目。 可实现基本功能: 1、LCD1602液晶屏实时显示比赛信息 2、按键控制比赛的开始、暂停和结束&#xff0c;以及两位选手分数的加减。 本项目同时包含器件清…

OpenSSH升级指南:实战检验的步骤,有效加固服务器安全

在做服务器漏扫时我们经常会遇到有关于OpenSSH相关的安全漏洞&#xff0c;本文主要给大家介绍一下有关于OpenSSH的升级方法&#xff0c;小伙伴们可以参考一下流程&#xff0c;按步骤操作&#xff0c;但是过程中一定会遇到各种各样的问题&#xff0c;需要自行解决&#xff0c;这…

LangChain 33: LangChain表达语言LangChain Expression Language (LCEL)

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…

Verilog RAM/ROM的数据初始化

文章目录 一、初始化方式二、测试 FPGA设计中RAM和ROM作为存储器用来存储可变或不可变类型的数据。 ROM初始化一般是加载固定数据&#xff0c;RAM声明时默认为不定态数据&#xff0c;初始化时可以让数据为全1或者全0。 一、初始化方式 复位时按地址写入初值always (posedge cl…

浅谈Redis分布式锁(中)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 我们在不久前介绍了Spr…

Windows C盘分区扩容

C盘是至关重要的系统盘&#xff0c;主要是用于储存电脑文件和电脑的操作系统文件,会影响到电脑的运行速率。如果C盘分区小了&#xff0c;运行时间久会产生缓存文件和临时文件&#xff0c;用户在操作电脑的时候会很麻烦。例如&#xff1a;无法下载大文件、电脑卡顿、无法升级操作…

Kafka集群架构服务端核心概念

目录 Kafka集群选举 controller选举机制 Leader partition选举 leader partition自平衡 partition故障恢复机制 follower故障 leader故障 HW一致性保障 HW同步过程 Epoch Kafka集群选举 1. 在多个broker中, 需要选举出一个broker, 担任controller. 由controller来管理…

【模式识别】探秘分类奥秘:最近邻算法解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《模式之谜 | 数据奇迹解码》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 &#x1f30c;1 初识模式识…

机器视觉工程师,面对难以实现的需求时,应该如何应对?

作为一名机器视觉工程师&#xff0c;在工作中难免会遇到一些难以实现&#xff0c;奇形怪状的需求&#xff0c;各种五花八门&#xff0c;奇葩需求&#xff0c;顿时头疼不已。同时销售要接订单&#xff0c;机器视觉工程师也要做项目提升自我&#xff0c;销售与技术矛盾本身是存在…

【单调队列】LeetCode1425:带限制的子序列和

作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 涉及知识点 单调队列 题目 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回 非空 子序列元素和的最大值&#xff0c;子序列需要满足&#xff1a;子序列中每两个 相邻 的整数 nums[i] 和 nums[j] &#xff0c;它…

docker-compaose部署openldap

前段时间在本地搭建了一套gitlab geo测试环境&#xff0c;因为需要集成ldap&#xff0c;所以特意搭建下&#xff0c;特此作为笔记记录下。 文章目录 1. 前置条件2. 编写docker-openldap.yml文件3. 登录4. 使用创建组创建用户登录测试 1. 前置条件 安装docker-compose 安装docke…

工程数学软件:PTC Mathcad Prime 9.0 Crack

PTC Mathcad Prime 是工程数学软件的行业标准&#xff0c;使您能够解决最复杂的问题并共享您的工程计算。借助 PTC Mathcad Prime 9&#xff0c;工程计算变得更加出色。此版本引入了关键应用程序、符号引擎、数字引擎和可用性增强功能。 可用性和生产力更新        Mathc…

统计和绘图软件GraphPad Prism mac功能特点

GraphPad Prism mac是一款专业的统计和绘图软件&#xff0c;主要用于生物医学研究、实验设计和数据分析。 GraphPad Prism mac功能和特点 数据导入和整理&#xff1a;GraphPad Prism 可以导入各种数据格式&#xff0c;并提供直观的界面用于整理、编辑和管理数据。用户可以轻松…