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*/@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("init() 被调用");}/*** 返回ServletConfig 也就是返回Servlet的配置* @return*/@Overridepublic 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*/@Overridepublic 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基础的OOPHttpServletRequest 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*/@Overridepublic String getServletInfo() {return null;}/*** 1. 该方法是在servlet销毁时,被调用* 2. 只会调用一次*/@Overridepublic 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*/@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("HiServlet doGet()...");}/*** 处理doPost* @param req* @param resp* @throws ServletException* @throws IOException*/@Overrideprotected 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 、优先级遵守 : 精确路径 > 目录路径 > 扩展名路径 > /* > /

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

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

相关文章

RTC时钟

目录 一、STM32F407内部RTC硬件框图&#xff0c;主要由五大部分组成&#xff1a; 二、硬件相关引脚 三、具体代码设置步骤 四、了解其它知识点 一、STM32F407内部RTC硬件框图&#xff0c;主要由五大部分组成&#xff1a; ① 时钟源 (1)LSE&#xff1a;一般我们选择 LSE&am…

【EI稳定检索会议】第五届大数据、人工智能与软件工程国际研讨会(ICBASE 2024)

#往届均已成功检索# 投稿时邀请码请填H8053 第五届大数据、人工智能与软件工程国际研讨会&#xff08;ICBASE 2024&#xff09; 2024 5th International Conference on Big Data & Artificial Intelligence & Software Engineering 2024年09月20-22日 | 中国温州 &g…

16.Qt 工具栏生成

目录 前言&#xff1a; 技能&#xff1a; 内容&#xff1a; 1. 界面添加 2. 信号槽 功能实现 参考&#xff1a; 前言&#xff1a; 基于QMainWindow&#xff0c;生成菜单下面的工具栏&#xff0c;可以当作菜单功能的快捷键&#xff0c;也可以完成新的功能 直接在UI文件中…

Java并发基础:ConcurrentSkipListSet全面解析!

内容概要 ConcurrentSkipListSet类在多线程环境下&#xff0c;它能够轻松应对大量的插入、删除和查找操作&#xff0c;同时保持数据的完整性和一致性&#xff0c;其内部基于跳表数据结构的实现&#xff0c;确保了即使在处理大规模数据时&#xff0c;也能具有出色的性能表现。 …

第二篇【传奇开心果系列】Python的文本和语音相互转换库技术点案例示例:深度解读pyttsx3支持多种语音引擎

传奇开心果短博文系列 系列短博文目录Python的文本和语音相互转换库技术点案例示例系列 短博文目录前言一、三种语音引擎支持介绍和示例代码二、SAPI5引擎适用场景介绍和示例代码三、nsss引擎适用场景介绍和示例代码四、eSpeak适用场景介绍和示例代码五、归纳总结 系列短博文目…

计算机丢失mfc140.dll怎么安装?多种方法轻松搞定mfc140.dll问题

​Mfc140.dll文件的丢失可能会引发一系列系统运行问题。作为Microsoft Visual C Redistributable Package的重要组成部分&#xff0c;Mfc140.dll在许多应用程序的正常运行中扮演着关键角色。当这个动态链接库文件缺失时&#xff0c;可能会导致软件启动失败、运行不稳定、功能受…

.NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库

一、效果 记录日志为文档 记录日志到数据库 二、添加NuGet包 三、log4net.config代码配置 <?xml version"1.0" encoding"utf-8" ?> <log4net><!-- Debug日志 --><appender name"RollingFileDebug" type"log4net…

林浩然与杨凌芸的Java集合奇遇记

林浩然与杨凌芸的Java集合奇遇记 The Java Collection Chronicles of Lin Haoran and Yang Lingyun 在一个充满代码香气的午后&#xff0c;程序员男主角林浩然正在他的编程世界里挥舞着键盘剑&#xff0c;探索Java王国中的神秘宝藏——集合。而我们的女主角杨凌芸&#xff0c;作…

基于Spring Boot的协力服装厂服装生产管理系统,计算机毕业设计(带源码+论文)

源码获取地址&#xff1a; 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1759135037462228993

缩小ppt文件大小的办法

之前用别人模版做了个PPT&#xff0c;100多M,文件存在卡顿问题 解决办法&#xff1a; 1.找到ppt中哪个文件过大&#xff0c;针对解决 2.寻找视频/音频文件&#xff0c;减少体积 3.字体文件是不是过多的问题。 一、文件寻找的内容步骤&#xff1a; 步骤&#xff1a; 1.把p…

在beforeUpdate中调用了请求数据接口,修改了初始数据造成死循环

在beforeUpdate中调用了请求数据接口&#xff0c;修改了初始数据造成死循环 问题&#xff1a; 不要在beforeUpdate和updated中更改数据&#xff0c;会造成死循环&#xff1b; 原因&#xff1a; 当数据更改就会走这个钩子&#xff0c;而你在里面进行数据更改又会走这个钩子&…

定制你的【Spring Boot Starter】,加速开发效率

摘要&#xff1a; 本文将介绍如何创建一个自定义的 Spring Boot Starter&#xff0c;让您可以封装常用功能和配置&#xff0c;并在多个 Spring Boot 项目中共享和重用。 1. 简介 Spring Boot Starter 是 Spring Boot 框架中的一种特殊的依赖项&#xff0c;它用于快速启动和配置…

机器学习 | 实现图像加密解密与数字水印处理

目录 实现窗口可视化 数字图像加密 窗口布局设置 基于混沌Logistic的图像加密 基于三重DES的图像加密 数字图像解密 窗口布局设置 基于混沌Logistic的图像解密 基于三重DES的图像解密 基于LSB的数字水印提取 窗口布局设置 水印的嵌入与提取 实现窗口可视化 这里…

【IO流】FileInputStream 字节输入流

FileInputStream 字节输入流 1. 概述2. 作用3. 书写步骤4. 读取方法5. 文件拷贝6. 注意事项 1. 概述 FileInputStream 是 Java IO 包中的一个类&#xff0c;它是字节输入流的一种。它用于从文件中读取数据&#xff0c;以字节为单位进行读取。 使用 FileInputStream 可以完成以…

数据分析(一) 理解数据

1. 描述性统计&#xff08;summary&#xff09; 对于一个新数据集&#xff0c;首先通过观察来熟悉它&#xff0c;可以打印数据相关信息来大致观察数据的常规特点&#xff0c;比如数据规模&#xff08;行数列数&#xff09;、数据类型、类别数量&#xff08;变量数目、取值范围…

C++--Linux基础使用

文章目录 几个简单命令开机关机重启查看当前目录切换当前目录列出当前目录下的目录和文件列出指定目录下的目录和文件清屏查看/设置时间 目录和文件目录概要目录详细说明相对路径和绝对路径 上古神器vi创建/打开文件vi 的两种模式vi 的常用命令 用户管理组管理用户管理修改用户…

【C++学习手札】多态:掌握面向对象编程的动态绑定与继承机制(初识)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;世界上的另一个我 1:02━━━━━━️&#x1f49f;──────── 3:58 &#x1f504; ◀️ ⏸ ▶️ ☰ &am…

上门回收小程序开发,互联网下发展机遇

在当下生活水平大幅度上升发展下&#xff0c;回收成为了人们日常生活中的一部分。 如今&#xff0c;随着互联网的快速发展&#xff0c;回收行业也进行了升级换代&#xff0c;由传统的线下回收门店到回收箱在到当下的线上互联网回收模式&#xff0c;迈向了“互联网废品回收”的…

Android下SF合成流程重学习之GPU合成

Android下SF合成流程重学习之GPU合成 引言 SurfaceFlinger中的图层选择GPU合成(CLIENT合成方式)时&#xff0c;会把待合成的图层Layers通过renderengine(SkiaGLRenderEngine)绘制到一块GraphicBuffer中&#xff0c;然后把这块GraphicBuffer图形缓存通过调用setClientTarget传递…

Portainer安装/快速上手

前置&#xff1a; 管理docker容器的工具 Portainer: Container Management Software for Kubernetes and Docker https://docs.portainer.io/v/ce-2.9/start/install/server/docker/linux 官网安装教程 Install Portainer CE with Docker on Linux - Portainer Documentat…