Java研学-Servlet 基础

一 概述

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 {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("Hi~");}@Overridepublic String getServletInfo() {return null;}@Overridepublic 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 {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("Hi~");}@Overridepublic String getServletInfo() {return null;}@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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);}@Overridepublic String getServletInfo() {return null;}@Overridepublic 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 {@Overridepublic 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 {@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.err.println("OK");}
}

5 通配符映射 *

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

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

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

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

相关文章

会员管理怎么做?

会员管理是企业运营的重要组成部分&#xff0c;它涉及到会员的招募、维护、激励、保留、转化等多个环节。下面&#xff0c;我们将结合具体的案例&#xff0c;详细介绍会员管理的具体做法。 首先&#xff0c;会员的招募是会员管理的第一步 企业需要通过各种方式吸引消费者成为会…

3D数字化系统建设

以3D可视化、数字化技术为基础&#xff0c;其实&#xff0c;很多传统的系统软件都可以重新做一下。 比如&#xff1a;以下这个使用场景&#xff1a;零售门店陈列&#xff1b; 还有&#xff0c;数字化仓储系统&#xff0c;3D数字化供应链系统&#xff0c;3D数字化的生产系统&a…

redis常见数据类型

目录 1.基本全局命令 2.数据结构和内部编码 3.单线程架构 1.基本全局命令 Redis有5种数据结构,但它们都是键值对种的值&#xff0c;对于键来说有一些通用的命令。 KEYS 返回所有满足样式(pattern) 的key。支持如下统配样式。 h?llo 匹配 hello, hallo和hxllo h*llo匹配h…

基于SpringBoot实现的前后端分离书店项目,功能:注册登录、浏览商品、热门商品、购物车、购买、地址管理、密码管理等

一、项目简介 本项目主要基于SpringBoot、Mybatis-plus、MySQL、Redis实现的书店管理系统。 本系统是前后端分离的&#xff0c;分别由三个子项目构成&#xff1a;java服务端、用户浏览与购买的前端、管理员管理商品的前端 环境 java 1.8mysql8.0redisvue2.x 管理员子系统功…

Ubuntu 常用命令之 ps 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 ps命令是Linux下的一个非常重要的命令&#xff0c;它用于查看系统中的进程状态。ps是Process Status的缩写&#xff0c;可以显示系统中当前运行的进程的状态。 以下是一些常用的参数 a&#xff1a;显示所有进程&#xff08;包括…

string的库函数reserve、resize

系列文章 http://t.csdnimg.cn/u80hL 目录 系列文章[TOC](目录) 一、reserve——请求容量的变化二、resize——操作对象使用的空间 一、reserve——请求容量的变化 改变对象的capacity——他会请求开辟和缩小对象所占的空间&#xff0c;reserve只能操作对象未使用的空间&…

单例模式实现

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;JavaEE &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 单例模式 1. 什么是单例模式2. 饿汉模式3.…

C语言易错知识点九(指针(part three))

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载&#xff0c;请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主&#xff0c;代码兴国&#xff01;❤❤❤ 许久不见&#xff0c;甚是想念&#xff0c;本大忙人已经很久没有更新博客了&#xff0c;我想大概我的粉丝们早…

Linux的/proc/self/学习

文章目录 /proc目录/proc/self的使用 在做SSTI模板注入的CTF题中&#xff0c;发现有师傅提到可以用/proc/self这个目录获取flag&#xff0c;所以也来学习一波主要参考. (我才知道&#x1f601;&#x1f601;&#x1f601;)可以通过/proc/$pid/来获取指定进程的信息&#xff0c…

Kioptrix-3

靶场下载地址 https://download.vulnhub.com/kioptrix/KVM3.rar 信息收集 # Nmap 7.94 scan initiated Thu Dec 21 21:52:25 2023 as: nmap -sn -oN live.nmap 192.168.1.0/24 Nmap scan report for 192.168.1.1 (192.168.1.1) Host is up (0.00048s latency). MAC Address:…

AI绘画中VAE压缩图像

介绍 在Stable Diffusion中,所有的去噪和加噪过程并非在图像空间直接进行,而是通过VAE模块将图像编码到一个低维空间。 这个低维空间的“分辨率”低于原始图像空间,有利于快速地完成加噪和去噪过程。 最后再将编码空间中的噪声表示解码恢复为图像空间,完成去噪或加噪操作。 …

【Element】el-table 使用 el-table-infinite-scroll 插件实现滚动加载

虽然 el 官方提供了 Infinite Scroll 无限滚动 组件 但是却不支持 el-table 组件&#xff0c;这就很难受了&#xff0c;还好已经有大佬写好了插件&#xff0c;并且支持 element-plus/infinite-scroll 组件的所有选项。 el-table-infinite-scroll el-table-infinite-scroll 看…

【数据结构入门精讲 | 第十二篇】考研408、公司面试树专项练习(一)

在上一篇文章中我们介绍了树的知识点&#xff0c;在这一篇中我们将进行树的专项练习。 目录 判断题选择题填空题二叉树的宽度R6-1 是否二叉搜索树 方法介绍&#xff1a; 已知中序及后序&#xff0c;求前序 如后序为DABEC,中序为DEBAC&#xff0c;求前序 则后序倒着写&#xff…

北京Modbus转Profinet网关的作用

背景&#xff1a;随着工业自动化的快速发展&#xff0c;各种仪器设备迅速崛起&#xff0c;但是在仪器出厂前需要很多的零部件来构建出需要的设备及功能&#xff0c;由于自动化设备的零部件不是统一生产商供应的&#xff0c;这样很容易出现某个零部件的通讯协议不匹配&#xff0…

搜索二叉树(超详解)

文章目录 前言查找搜索二叉树的结构insertfinderase递归版本Findinserterase 二叉树的拷贝问题搜索二叉树的应用Key模型Key/Value的模型 前言 普通二叉树其实意义不大&#xff0c; 如果用二叉树存储数据的话&#xff0c;还不如顺序表&#xff0c;链表这些。 搜索二叉树它的意义…

7.5组合总和②(LC40-M)

算法&#xff1a; 相比于上一题&#xff0c;数组candidates有重复元素&#xff0c;而要求不能有重复的组合&#xff0c;所以相对于39.组合总和 (opens new window)难度提升了不少。 如何去重&#xff1f; 先把candidates排序&#xff0c;让重复的元素都在一起 单层递归时&a…

MyBatis的关联查询!!!(一对一、一对多、多对多)

准备工作&#xff1a; 1.创建Maven工程&#xff0c;还没有配置Maven的和还不会的去看这里啦&#xff1a;maven的下载安装与配置环境变量&#xff01;&#xff01;&#xff01;&#xff08;全网最详细&#xff09;-CSDN博客 Account.java : (pojo类) &#xff08;这里我…

认识Linux背景

1.发展史 Linux从哪里来&#xff1f;它是怎么发展的&#xff1f;在这里简要介绍Linux的发展史 要说Linux&#xff0c;还得从UNIX说起 UNIX发展的历史 1968年&#xff0c;一些来自通用电器公司、贝尔实验室和麻省理工学院的研究人员开发了一个名叫Multics的特殊操作系统。Mu…

分布式锁常见问题及其解决方案

一、为什么要使用分布式锁&#xff1f; 因为在集群下&#xff0c;相当于多个JVM&#xff0c;就相当于多个锁&#xff0c;集群之间锁是没有关联的&#xff0c;会照成锁失效从而导致线程安全问题 分布式锁可以分别通过MySQL、Redis、Zookeeper来进行实现 二、redis分布式锁的实…

华为发布全闪备份一体机旗舰新品,并宣布备份软件开源

[中国&#xff0c;上海&#xff0c;2023年12月20日]在20日举行的OceanProtect数据保护新品发布会上&#xff0c;华为发布全闪备份一体机旗舰新品&#xff0c;并宣布备份软件开源&#xff0c;以应对智慧金融、自动驾驶等场景对数据备份效率及数据安全方面的新诉求&#xff0c;为…