JAVA Web 学习(二)ServLet

news2024/9/21 10:51:29

二、动态web 资源开发技术——Servlet

Servlet(小服务程序)是一个与协议无关的、跨平台的Web组件,由Servlet容器所管理。运行在服务器端,可以动态地扩展服务器的功能,并采用“请求一响应”模式提供Web服务。 Servlet的主要功能是交互式地浏览和修改数据,生成动态Web内容。 Servlet是按照Servlet规范编写的Java类。

在这里插入图片描述

Servlet生命周期
Servlet运行在Servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段:
① 加载和实例化:默认情况下,当servlet第一次被访问时,由容器创建servlet对象。
② 初始化:在Servlet实例化之后,容器将调用servlet的init()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次。
③ 请求处理:每次请求servlet时,Servlet容器都会调用Servlet的service()方法对请求进行处理。
④ 服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法完成资源的释放。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收。
Servlet常用方法
初始化方法,在Servlet被创建时执行,只执行一次。void init(ServletConfig config)
提供服务方法,每次Servlet被访问,都会调用该方法。void service(ServletRequest req, ServletResponse res)
销毁方法,当Servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet。void destroy()
获取ServletConfig对象ServletConfig getServletConfig()
获取Servlet信息String getServletInfo()

三、动态的网页技术——JSP

6a0a97e1074252c7fd736993c32c9a1.png

**概念:**Java Server Pages,Java服务端页面。
一种动态的网页技术,其中既可以定义HTML、JS、CSS等静态内容,还可以定义Java代码的动态内容。
JSP = HTML + Java,JSP本质上就是一个Servlet 。
**JSP的作用:**简化开发,避免了在Servlet中直接输出HTML标签。

原理:JSP本质上就是一个Servlet 。JSP在被访问时,由JSP容器(Tomcat)将其转换为Java文件(Servlet),在由JSP容器(Tomcat)将其编译,最终对外提供服务的其实就是这个 字节码文件 。

**缺点:**JSON 只支持 get,因为 script 标签只能使用 get 请求; JSONP 需要后端配合返回指定格式的数据。

实例

//test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
    Date date=new Date();
    out.write(date.toLocaleString());
%>
</body>
</html>

四、Web服务器——Tomcat

结构:

Tomcat 是Web应用服务器,是一个Servlet/JSP容器. Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户.而Servlet是一种运行在支持Java语言的服务器上的组件. Servlet最常见的用途是扩展Java Web服务器功能。

123123

①Tomcat 通过 Socket 读取到这个请求(一个字符串), 并按照 HTTP 请求的格式来解析这个请求, 根据请求中的 Context Path 确定一个 webapp, 再通过 Servlet Path 确定一个具体的 类. 再根据当前请求的方法 (GET/POST/…), 决定调用这个类的 doGet 或者 doPost 等方法。

②表示Servlet容器把响应对象ServletResponse中的处理结果转发给Web服务器,通知Web服务器以HTTP响应的方式把结果发送到客户端,同时把控制返回Web服务器。

class Tomcat{
    // 用来存储所有的 Servlet 对象
    private List<Servlet> instanceList = new ArrayList<>();
    public void start() {
    // 根据约定,读取 WEB-INF/web.xml 配置文件;
    // 并解析被 @WebServlet 注解修饰的类
    // 假定这个数组里就包含了我们解析到的所有被 @WebServlet 注解修饰的类.
        Class<Servlet>[] allServletClasses = ...;
    // 这里要做的的是实例化出所有的 Servlet 对象出来;
        for (Class<Servlet> cls : allServletClasses) {
    // 这里是利用 java 中的反射特性做的
    // 实际上还得涉及一个类的加载问题,因为我们的类字节码文件,是按照约定的
    // 方式(全部在 WEB-INF/classes 文件夹下)存放的,所以 tomcat 内部是
    // 实现了一个自定义的类加载器(ClassLoader)用来负责这部分工作。
            Servlet ins = cls.newInstance();
            instanceList.add(ins);
        }
    // 调用每个 Servlet 对象的 init() 方法,这个方法在对象的生命中只会被调用这一次;
        for (Servlet ins : instanceList) {
            ins.init();
        }
// 利用我们之前学过的知识,启动一个 HTTP 服务器
// 并用线程池的方式分别处理每一个 Request
        ServerSocket serverSocket = new ServerSocket(8080);
// 实际上 tomcat 不是用的固定线程池,这里只是为了说明情况
        ExecuteService pool = Executors.newFixedThreadPool(100);
        while (true) {
            Socket socket = ServerSocket.accept();
// 每个请求都是用一个线程独立支持,这里体现了我们 Servlet 是运行在多线程环境下的
            pool.execute(new Runnable() {
                doHttpRequest(socket);
            });
        }
// 调用每个 Servlet 对象的 destroy() 方法,这个方法在对象的生命中只会被调用这一次;
        for (Servlet ins : instanceList) {
            ins.destroy();
        }
    }
    public static void main(String[] args) {
        new Tomcat().start();
    }
}

流程:

在Tomcat容器中,当接收到HTTP请求时,会创建相应的Servlet类实例来处理该请求。Tomcat使用了Java的反射机制来创建Servlet实例,并依赖于Servlet规范的生命周期方法来管理Servlet的生命周期。

## 初始化阶段:
Tomcat在启动时会扫描应用程序的部署描述符(如web.xml文件)来获取Servlet的配置信息。
根据配置信息,Tomcat会使用Java的反射机制动态加载Servlet类,并调用其无参构造方法创建Servlet实例。
创建Servlet实例后,Tomcat会调用Servlet的init()方法将Servlet初始化,并传递一个ServletConfig对象,其中包含了Servlet的配置参数。

## 请求处理阶段:
当接收到HTTP请求时,Tomcat会根据请求的URL匹配到对应的Servlet。
Tomcat会为每个请求创建一个独立的线程,该线程负责处理该请求。
Tomcat会调用Servlet的service()方法来处理请求,将请求和响应对象作为参数传递给service()方法。

## 生命周期管理:
在Servlet的整个生命周期中,Tomcat会根据Servlet规范的要求调用相应的生命周期方法。
在Servlet实例创建后,Tomcat会调用init()方法进行初始化。
当Tomcat关闭或重新加载Web应用程序时,会调用Servlet的destroy()方法进行销毁。
在运行期间,Tomcat会根据需要调用service()方法来处理请求。

使用Java的反射机制,Tomcat可以动态地加载和实例化Servlet类,而不需要直接在代码中进行显式的实例化。通过调用Servlet的生命周期方法,Tomcat能够管理Servlet的状态和资源,并在需要时创建、初始化和销毁Servlet实例。这种基于反射和生命周期方法的机制使Tomcat能够有效地处理Servlet请求,并提供高性能和可扩展性的Web应用程序容器。

优化性能:
  1. 调整Tomcat线程池大小:Tomcat默认的线程池大小为200,如果在高并发的情况下,可能会导致线程池资源不足,可以通过修改Tomcat的配置文件,调整线程池大小。
  2. 调整JVM内存分配:Tomcat在启动时会使用JVM内存来加载应用程序和处理请求。如果JVM内存分配不合理,可能会导致内存不足或内存泄漏,可以通过调整JVM内存分配参数,如-Xms和-Xmx。
  3. 使用缓存:Tomcat支持多种缓存技术,如内存缓存、磁盘缓存和分布式缓存等。通过使用缓存,可以减少应用程序对数据库和其他资源的访问,提高响应速度和并发访问量。
  4. 使用 CDN 加速静态资源:可以使用 CDN(内容分发网络)来加速静态资源的传输,减少服务器的负载,提高网站的访问速度。
  5. 启用静态资源缓存:可以通过在 web.xml 中配置 filter,启用静态资源缓存,减少服务器的负载,提高访问速度。

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

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

相关文章

基于仿射区间的分布式三相不对称配电网潮流算法matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于仿射区间的分布式三相不对称配电网潮流算法matlab仿真。 基于仿射区间的&#xff0c;含分布式电源的配电网三相潮流算法&#xff0c;算法涉及仿射&#xff0c;三相&#x…

python爬虫概念及介绍

1. 什么是互联网爬虫&#xff1f; 解释 1 &#xff1a;通过一个程序&#xff0c;根据 Url ( http : // www . taobao . com ) 进行爬取网页&#xff0c;获取有用信息 解释 2&#xff1a;使用程序模拟浏览器&#xff0c;去向服务器发送请求&#xff0c;获取响应信息 2. 爬虫核…

深度学习经典模型之BERT(下)

在"深度学习经典模型之BERT(上)"我们描述了BERT基本信息、意义、与GPT和Transformer的区别、预训练、自监督等相关信息后&#xff0c;本章节将介绍BERT的输入、Encoder、微调及两个主流变种。 BERT inputs 切词方法 BERT的切词方法用的是WordPiece embeddings&…

MongoDB数据模型和WiredTiger读写模型

MongoDB数据模型 思考&#xff1a;MongoDB为什么会使用BSON&#xff1f; BSON协议与数据类型 JSON JSON是当今非常通用的一种跨语言Web数据交互格式&#xff0c;属于ECMAScript标准规范的一个子集。JSON&#xff08;JavaScript Object Notation, JS对象简谱&#xff09;即J…

[word] word艺术字体如何设置? #知识分享#职场发展#媒体

word艺术字体如何设置&#xff1f; 在工作中有些技巧&#xff0c;可以快速提高工作效率&#xff0c;解决大部分工作&#xff0c;今天给大家分享word艺术字体如何设置的技巧&#xff0c;希望可以帮助到你。 1、设置艺术字 选中文字&#xff0c;然后点击菜单栏的【插入】按钮一一…

机器学习复习(6)——numpy的数学操作

加减法运算 # 创建两个不同的数组 a np.arange(4) #list(0,1,2,3 b np.array([5,10,15,20]) # 两个数组做减法运算 b-a 运行结果&#xff1a; 计算数组的平方 #b*2代表数组b每个元素乘以2 #b**2代表数组b每个元素的2次方 b**2 运行结果&#xff1a; 计算数组的正弦值 #…

8.DNS域名解析服务器

目录 1. 概述 1.1. 产生原因 1.2. 作用&#xff1a; 1.3. 连接方式 1.4. 因特网的域名结构 1.4.1. 拓扑&#xff1a; 1.4.2. 分类 1.4.3. 域名服务器类型划分 2. DNS域名解析过程 2.1. 分类&#xff1a; 2.2. 解析图&#xff1a; 2.2.1. 图&#xff1a; 2.2.2. 过…

【学网络安全】kali linux入门及常用简单工具介绍(附工具包)

前言 相信很多同学了解到和学习网络安全的时候都听过kali系统&#xff0c;大家都称之为黑客最喜爱的系统&#xff0c;那么什么是kali&#xff0c;初学者用kali能做些什么&#xff0c;我将在本文中做简单的介绍 一、kali linux是什么&#xff1f; Kali Linux 是专门用于渗透测…

数据结构_单链表题-2.1

一. 反转单链表 将一个单链表反过来。 个人思路&#xff08;一团浆糊大错特错&#xff09; 反转嘛&#xff0c;变最后为起点&#xff0c;依次反转过来就行了。 1&#xff09;找到最后三个链表结点&#xff0c;分别保存下来&#xff0c;以最后一个为首地址。 2&#xff09;最…

整数对最小和 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 给定两个整数数组array1、array2&#xff0c;数组元素按升序排列。 假设从array1、array2中分别取出一个元素可构成一对元素&#xff0c;现在需要取出k对元素&am…

Qt扩展-muParser数学公式解析

muParser数学公式解析 一、概述1. 针对速度进行了优化2. 支持的运算符3. 支持的函数4. 用户定义的常量5. 用户定义的变量6. 自定义值识别回调7. 其他功能 二、内置函数三、内置二元运算符四、三元运算符五、内置常量六、源码引入1. 源码文件2. 编译器开关1. MUP_BASETYPE2.MUP_…

配置支持 OpenAPI 的 ASP.NET Core 应用

写在前面 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 本文记录如何配置基于Swagger 的 ASP.NET Core 应用程序的 OpenAPI 规范。 需要从NuGet 安装 Swashbuckle.AspNetCore 包 代码实现 var builder WebApplicati…

如何在 Golang 中使用 crypto/ed25519 进行数字签名和验证

如何在 Golang 中使用 crypto/ed25519 进行数字签名和验证 引言crypto/ed25519 算法简介环境搭建和准备工作生成密钥对进行数字签名 验证签名实际应用场景案例总结 引言 在当今数字化时代&#xff0c;网络安全显得尤为重要。无论是在网上进行交易、签署合同&#xff0c;还是发…

大模型创业的3条军规

上周&#xff0c;一家初创公司未能围绕LLM和 RAG 开展业务&#xff0c;尽管他们获得了第一份 B2B 大型合同。 以下是原因以及如何避免这种情况&#xff1a; 创始人写了一篇博客解释了为什么他不得不关闭他的业务&#xff0c;我在这里总结了他的要点。 NSDT工具推荐&#xff1a…

基于VMware和Unbuntu18.04编译 嘉立创·泰山派 Linux SDK

主机硬件要求 内存最少32G 硬盘腾出200-500G&#xff0c;虽然编译最终占了73G&#xff0c;但富余一些以后可以搞别的方便 操作系统win7/10/11 VMware 安装 1.去vmware官网下载&#xff1a;https://customerconnect.vmware.com/cn/downloads/info/slug/desktop_end_user_comp…

docker安装elasticsearch+kibana

目录 1.安装es 2.安装kibana 3.kibana监控es 1.安装es 拉取镜像 docker pull elasticsearch:7.6.1 创建存放配置文件、数据、插件的各个文件夹 mkdir -p /home/docker/elasticsearch/config mkdir -p /home/docker/elasticsearch/data mkdir -p /home/docker/elasticsearch…

2024最新版MongoDB安装使用指南

2024最新版MongoDB安装使用指南 Installation and Usage Guide of the Latest MongoDB Community Edition in 2024 By JacksonML MongoDB is a document database with the scalability and flexibility that you want with the querying and indexing that you need. – mon…

网络异常案例三_RST

问题现象 在做功能测试的时候&#xff0c;经常看到设备离线的消息&#xff08;MQTT遗嘱&#xff09;。 在终端连接的网络设备上抓包分析&#xff0c;看到终端设备发起大量的RST请求。 151这个设备&#xff0c;7min&#xff0c;重置断开了8个TCP连接&#xff08;mqtt连接&#…

Ansible自动化运维实战

一、abstract简介 ansible是新出现的自动化运维工具&#xff0c;基于Python开发&#xff0c;集合了众多运维工具(puppet、cfengine、chef、func、fabric) 的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令等功能.无客户端。我们要学一些Ansible的安装和一些基…

地平线旭日 X3 VNC 远程桌面灰屏解决

解决 windows 使用 VNC 远程连接地平线旭日 X3 开发板桌面环境灰屏的问题。 1 查看问题 通过启动vncserver后的log文件确认问题。 启动 vnc 服务 vncserver :1通过 terminal 输出可以看到日志文件的存储位置 打开查看该文件后发现首当其冲是权限问题&#xff1a;说xstartup…