java:Servlet

背景

在这里插入图片描述
我们访问浏览器访问一个地址,最终是访问到了这个 java 类,而 java 是运行在 Tomcat 上的,所以 Tomcat 作为一个服务器会把这个访问地址指向这个类中,这个类就是 Servlet,Servlet 就是一个具有一定规范的类,具体规范后面会说。

步骤

  1. 创建JavaEE项目
  2. 定义一个类,实现Servlet接口
    • public class ServletDemo1 implements Servlet
  3. 实现接口中的抽象方法
  4. 配置Servlet
    在web.xml中配置:
<!--配置Servlet -->
<servlet><servlet-name>demo1</servlet-name><servlet-class>cn.xxx.web.servlet.ServletDemo1</servlet-class>
</servlet><servlet-mapping><servlet-name>demo1</servlet-name><url-pattern>/demo1</url-pattern>
</servlet-mapping>

原理

  1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
  2. 查找web.xml文件,是否有对应的 <url-pattern> 标签体内容。
  3. 如果有,则在找到对应的 <servlet-class> 全类名
  4. tomcat会将字节码文件加载进内存,并且创建其对象
  5. 调用其方法

示例

一般 java web 项目根目录会有 web/WEB-INF/web.xml 文件,如果你新建的项目没有的话,可以按照下面的操作新增
在这里插入图片描述
在这里插入图片描述
servlet 就是在这个文件里配置的,如下:

<?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_3_1.xsd"version="3.1"><!--配置Servlet --><servlet><servlet-name>demo1</servlet-name><servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class></servlet><servlet-mapping><servlet-name>demo1</servlet-name><url-pattern>/demo1</url-pattern></servlet-mapping><!--配置Servlet --><servlet><servlet-name>demo2</servlet-name><servlet-class>cn.itcast.web.servlet.ServletDemo2</servlet-class><!--指定Servlet的创建时机1.第一次被访问时,创建* <load-on-startup>的值为负数2.在服务器启动时,创建* <load-on-startup>的值为0或正整数--><load-on-startup>-5</load-on-startup></servlet><servlet-mapping><servlet-name>demo2</servlet-name><url-pattern>/demo2</url-pattern></servlet-mapping></web-app>

当你浏览器访问 127.0.0.1:8080/demo2,指向的类就是上面的配置文件中的 cn.itcast.web.servlet.ServletDemo2,如下:

package cn.itcast.web.servlet;import javax.servlet.*;
import java.io.IOException;/*** Servlet的方法*/
public class ServletDemo2 implements Servlet {private int age = 3;/*** 初始化方法* 在Servlet被创建时,执行。只会执行一次* @param servletConfig* @throws ServletException*/@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("init.....");}/*** 获取ServletConfig对象* ServletConfig:Servlet的配置对象* @return*/@Overridepublic ServletConfig getServletConfig() {return null;}/*** 提供服务方法* 每一次Servlet被访问时,执行。执行多次* @param servletRequest* @param servletResponse* @throws ServletException* @throws IOException*/@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("service.....");int number = 3;}/*** 获取Servlet的一些信息,版本,作者等等。。* @return*/@Overridepublic String getServletInfo() {return null;}/*** 销毁方法* 在服务器正常关闭时,执行,执行一次。*/@Overridepublic void destroy() {System.out.println("destroy.....");}
}

生命周期

被创建

执行init方法,只执行一次

  • Servlet什么时候被创建?默认情况下,第一次被访问时,Servlet被创建
  • 可以配置执行Servlet的创建时机,在<servlet>标签下配置。
    1. 第一次被访问时创建
      • <load-on-startup> 的值为负数,默认就是 -1
    2. 在服务器启动时创建
      • <load-on-startup> 的值为0或正整数

注意:
Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的,多个用户同时访问时,可能存在线程安全问题。

解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值

提供服务

执行service方法,执行多次

  • 每次访问Servlet时,Service方法都会被调用一次。

被销毁

执行destroy方法,只执行一次

  • Servlet被销毁时执行。服务器关闭时,Servlet被销毁
  • 只有服务器正常关闭时,才会执行destroy方法。
  • destroy方法在Servlet被销毁之前执行,一般用于释放资源

Servlet3.0

之前我们如果 servlet 多的话,那么需要在 web.xml 配置很多,所以在 Servlet 3.0 之后,可以不用创建 web.xml 文件。

package cn.xxx.web.servlet;import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;// 当注解value只有一个的时候可以不写键值对
@WebServlet("/demo2")
public class ServletDemo 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("Servlet3.0来了.....");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {}
}

IDEA与tomcat的相关配置

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

    • 启动项目的时候查看控制台的log:Using CATALINA_BASE: "C:\Users\fqy\.IntelliJIdea2018.1\system\tomcat\xxx"
  2. 工作空间项目和 tomcat部署的web项目 是两回事

    • tomcat真正访问的是“tomcat部署的web项目”,“tomcat部署的web项目"对应着"工作空间项目” 的web目录下的所有资源
    • WEB-INF目录下的资源不能被浏览器直接访问。

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

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

相关文章

牡丹宣言|对国潮化妆品品牌的理解

化妆品的国潮概念&#xff1f; ■ 是中国的时代潮流。 ■ 是传统元素与现代元素的碰撞。 ■ 是一股年轻的力量。 ■ 是大国崛起的象征。 ■ 是中国文化自信的体现。 如何正确认知化妆品&#xff1f; ■ 化妆品不是药品 ■ 化妆品是一种观念 ■ 化妆品是一种习惯 ■ 化…

【科研】-- 如何将Endnote中参考文献格式插入到Word?

文章目录 如何将Endnote中参考文献格式插入到Word&#xff1f; 如何将Endnote中参考文献格式插入到Word&#xff1f; 1、首先确保Endnote和Word安装正确&#xff0c;正常可以从学校官网中下载到正版软件&#xff0c;下载后在word栏目中会出现EndNote的标签&#xff1b; 2、可…

Python使用pyqt5写windows桌面应用实战教程

本篇文章主要讲解,Python使用pyqt5写windows桌面应用的详细实战教程文章,主要涵盖单个界面的布局构建说明,表单构建说明,数据交互构建说明以及可直接开发的简易多界面框架实例构建说明,能够让你很快的了解pyqt在python中的使用和构建方式,快速实现一个简单的windows桌面图…

特殊的矩阵与特殊的矩阵关系———实对称、正定、对角、零矩阵

一、特殊的矩阵 1、实对称矩阵 定义&#xff1a;都是实数&#xff0c;且 性质&#xff1a; &#xff08;1&#xff09;可以用特征值来求A的大小 &#xff08;2&#xff09;可以得到A的秩 &#xff08;3&#xff09;必定可以相似对角化 运用&#xff1a; 与实对称矩阵A合同的矩…

【云原生】Docker私有仓库 RegistryHabor

目录 1.Docker私有仓库&#xff08;Registry&#xff09; 1.1 Registry的介绍 1.2 Registry的部署 步骤一&#xff1a;拉取相关的镜像 步骤二&#xff1a;进行 Registry的相关yml文件配置&#xff08;docker-compose&#xff09; 步骤三&#xff1a;镜像的推送 2. Regist…

centos7安装hadoop 单机版

1.解压 &#xff08;1&#xff09;将hadoop压缩包复制到/opt/software路径下 &#xff08;2&#xff09;解压hadoop到/opt/module目录下 [rootkb135 software]# tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/ &#xff08;3&#xff09;修改hadoop属主和属组 [rootkb135 m…

如何五分钟设计制作自己的蛋糕店小程序

在现如今的互联网时代&#xff0c;小程序已成为企业推广和销售的重要利器。对于蛋糕店来说&#xff0c;搭建一个小程序可以为其带来更多的品牌曝光和销售渠道。下面&#xff0c;我们将以乔拓云平台为例&#xff0c;来教你如何从零开始搭建自己的蛋糕店小程序。 首先&#xff0c…

【方案】安防监控EasyCVR智慧工地视频监管风险预警平台的应用

智慧工地方案是一种结合现代化技术与工地管理实践的创新型解决方案。它通过实时监控、数据分析、人工智能等技术手段&#xff0c;使工地管理更加高效、智能化。在建设智慧工地的过程中&#xff0c;除了上述提到的利用物联网技术实现设备互联、数据采集及分析以外&#xff0c;还…

Spring 事务(事务、声明式事务@Transactional、事务隔离级别、事务传播机制)

目录 1.事务的定义 2.Spring中事务的实现 2.1 MySQL中的事务使用 2.2 Spring中编程事务的实现 2.3 Spring中声明式事务 2.3.1 声明式事务的实现 Transactional 2.3.2 Transactional 作用域 2.3.3 Transactional 参数说明 2.3.4 注意事项 &#xff08;1&#xff09;解…

前端行级元素和块级元素的基本区别

块级元素和行内元素的基本区别是&#xff0c; 行内元素可以与其他行内元素并排&#xff1b;块级元素独占一行&#xff0c;不能与其他任何元素并列&#xff1b; 下面看一下&#xff1b; <!DOCTYPE html> <html> <head> <meta charset"utf-8"&…

2023 CCPC 华为云计算挑战赛 D-塔

首先先来看第一轮的 假如有n个,每轮那k个 他们的高度的可能性分别为 n 1/C(n,k) n1 C(n-(k-11),1)/C(n,k) n2 C(n-(k-21),2)/C(n,k) ni C(n-(k-i1,i)/C(n,k) 通过概率和高度算出第一轮增加的期望 然后乘上m轮增加的高度加上初始高度&#xff0c;就是总共增加的高度 下面是…

Linux系统之iptables应用SNAT与DNAT

Linux系统之iptables应用SNAT与DNAT SNAT1、SNAT的原理介绍1.1SNAT的应用环境1.2SNAT的原理 1.3SNAT转化的前提条件 2、开启SNAT2.1临时打开2.2永久打开 3、SNAT的转换3.1固定的公网IP地址3.2非固定的公网IP地址(共享动态IP地址) DNAT1、DNAT的原理介绍1.1应用环境1.2DNAT原理1…