活动介绍

JavaServlet:Web应用开发的理想选择

立即解锁
发布时间: 2025-08-18 02:12:13 阅读量: 1 订阅数: 2
### Java Servlet:Web应用开发的理想选择 在当今的Java编程领域,服务器端Java应用的崛起成为了最新且令人兴奋的趋势之一。Java语言最初是为小型嵌入式设备设计的,后来曾因用于开发小程序形式的复杂客户端Web内容而备受关注。然而,直到最近,Java作为服务器端开发平台的潜力才逐渐被人们所认识。 #### 1. Web应用的发展历程 Web应用相较于普通网页,能提供更具交互性的体验,可简单如文档存档的关键字搜索,也可复杂如电子店面。它被广泛部署在互联网、企业内联网和外联网,能提高生产力并改变企业的运营方式。为了理解Servlet的强大之处,我们先来看看其他创建Web应用的方法。 ##### 1.1 通用网关接口(CGI) CGI是创建动态内容的早期实用技术之一。当Web服务器接收到访问CGI程序的请求时,会创建一个新进程来运行该程序,并通过环境变量和标准输入传递生成响应所需的所有信息。这一过程不仅耗时,还会消耗大量服务器资源,限制了服务器并发处理请求的数量。 虽然CGI程序可以用几乎任何语言编写,但Perl语言因其强大的文本处理能力成为了主流选择。不过,使用Perl编写的CGI脚本每次请求都需要启动一个单独的Perl解释器,进一步增加了时间和资源的消耗。此外,由于CGI程序在单独的进程中运行,它无法与Web服务器进行交互,例如不能写入服务器的日志文件。 ##### 1.2 FastCGI FastCGI是Open Market公司开发的一种替代标准CGI的技术。与CGI不同的是,FastCGI为每个程序创建一个持久进程,避免了为每个请求创建新进程的开销。然而,FastCGI仍然存在进程过多的问题,每个程序至少需要一个进程,处理并发请求时还需要进程池。而且,FastCGI无法帮助程序与服务器更紧密地交互,并且一些流行的服务器(如Microsoft的Internet Information Server)尚未实现该技术。 ##### 1.3 mod_perl 如果你使用的是Apache Web服务器,mod_perl是提高CGI性能的另一个选择。它是Apache服务器的一个模块,将Perl解释器嵌入到Apache httpd可执行文件中,使服务器能够预编译CGI脚本并直接执行,无需分叉,从而提高了运行速度和效率。 ##### 1.4 PerlEx PerlEx由ActiveState开发,用于提高在Windows NT Web服务器上运行的Perl CGI脚本的性能。它通过使用Web服务器的本地API来实现性能提升。 ##### 1.5 其他解决方案 除了上述技术,还有一些其他创建Web应用的方法: - **服务器扩展API**:一些公司为其Web服务器创建了专有扩展API,如Netscape的NSAPI和Microsoft的ISAPI。使用这些API可以编写服务器扩展,增强或改变服务器的基本功能。但这些扩展不仅开发和维护困难,还存在安全和可靠性风险,并且与特定的服务器API和操作系统紧密绑定。 - **Active Server Pages(ASP)**:Microsoft开发的一种生成动态Web内容的技术。Web服务器上的HTML页面可以包含嵌入式代码(通常是VBScript或JScript),服务器在将页面发送给客户端之前会读取并执行这些代码。ASP适用于生成少量动态内容,支持该技术的服务器包括Microsoft Internet Information Server 3.0及以上版本。 - **服务器端JavaScript(SSJS)**:Netscape的服务器端脚本技术,允许在HTML页面中嵌入JavaScript代码以生成动态内容。与ASP不同的是,SSJS使用JavaScript作为脚本语言,并通过预编译页面来提高性能。该技术仅在Netscape FastTrack Server和Enterprise Server 2.0及以上版本中可用。 #### 2. Java Servlet的登场 Java Servlet是一种通用的服务器扩展,是可以动态加载以扩展服务器功能的Java类。它通常用于Web服务器,可替代CGI脚本。与专有服务器扩展不同的是,Servlet在服务器的Java虚拟机(JVM)中运行,因此具有安全性和可移植性。 与使用多进程处理请求的CGI和FastCGI不同,Servlet在Web服务器进程内通过单独的线程处理请求,这使得Servlet不仅高效,而且可扩展。此外,由于Servlet在Web服务器内部运行,它可以与服务器进行紧密交互,实现一些CGI脚本无法完成的任务。 Servlet的可移植性也是其一大优势,它可以在支持Java的所有平台和主要Web服务器上运行。我们认为Java Servlet为Web应用开发提供了理想的平台。 #### 3. Servlet的支持情况 Servlet的设计初衷是为了实现可移植性,它得到了所有支持Java的平台和主要Web服务器的支持。Sun Microsystems的Java软件部门定义的Java Servlet是Java的第一个标准扩展,虽然Servlet是Java语言的一部分,但不属于核心Java API。 为了方便开发者开发Servlet,Sun公开了一组提供基本Servlet支持的类,即`javax.servlet`和`javax.servlet.http`包,构成了Servlet API。这些类的2.0版本与Java Servlet开发工具包(JSDK)捆绑在一起,可从[http://java.sun.com/products/servlet/](http://java.sun.com/products/servlet/)下载。 许多Web服务器供应商已经将这些类集成到他们的服务器中,以提供Servlet支持,有些还提供了额外的功能。除了Servlet类,开发和部署Servlet还需要一个Servlet引擎。Servlet引擎主要有以下三种类型: ##### 3.1 独立Servlet引擎 独立Servlet引擎是一种内置Servlet支持的服务器,开箱即用。但缺点是需要等待服务器的新版本才能获得最新的Servlet支持。目前,以下服务器提供了独立的Servlet引擎: - **Sun的Java Web Server**:曾被称为“Jeeves”,被认为是Servlet引擎支持Servlet的参考实现,除了两个增强功能的本地代码库外,完全用Java编写。 - **万维网联盟的Jigsaw Server**:免费提供,同样完全用Java编写。 - **O'Reilly的WebSite Professional(2.1及更高版本)**:第一个非Java编写但提供内置Servlet支持的服务器。 - **Netscape的Enterprise Server(3.51及更高版本)**:最流行的提供内置Servlet支持的Web服务器,但3.51版本仅支持早期的Servlet API 1.0,且存在许多严重的漏洞,暂时建议使用附加Servlet引擎。 - **Lotus的Domino Go Webserver(4.6及更高版本)**:另一个提供内置Servlet支持的流行Web服务器,4.6.x版本仅支持早期的Servlet API 1.0,但Lotus声称将用Java Servlet取代其专有GWAPI服务器扩展技术。 此外,一些应用服务器也包含Servlet引擎,如WebLogic的Tengah Application Server和ATG的Dynamo Application Server 3。 ##### 3.2 附加Servlet引擎 附加Servlet引擎作为插件添加到现有服务器中,为原本未设计支持Servlet的服务器提供支持。以下是一些常见的附加Servlet引擎: - **Java - Apache项目的JServ模块**:免费的Servlet引擎,为流行的Apache服务器添加Servlet支持。 - **Live Software的JRun**:免费插件,支持在所有流行操作系统上的流行Web服务器上使用完整的Servlet API,最新版本还包含一个用于开发的基本Web服务器。 - **IBM的WebSphere Application Server**:曾被称为ServletExpress,是一个插件,旨在支持多个流行Web服务器和操作系统上的完整Servlet API。 - **New Atlanta的ServletExec**:插件,支持多个Web服务器和操作系统上的完整Servlet API。 - **Gefion Software的WAICoolRunner**:免费插件,使用Netscape的WAI接口,支持Netscape FastTrack Server和Enterprise Server 3.x及更高版本的大部分Servlet API。 - **Unicom的Servlet CGI Development Kit**:免费框架,在CGI之上支持Servlet,虽然效率不高,但具有广泛的适用性。 ##### 3.3 可嵌入Servlet引擎 可嵌入Servlet引擎通常是一种轻量级的Servlet部署平台,可以嵌入到其他应用程序中,使该应用程序成为真正的服务器。常见的可嵌入Servlet引擎包括: - **Sun的JavaServer Engine**:用于设计和构建Java服务器的高质量、高端框架,Sun的Java Web Server和IBM的WebSphere Application Server均基于此构建。 - **Jef Poskanzer的Acme.Serve**:免费的简单Web服务器,运行的Servlet与Servlet API“大致兼容”。 - **Paralogic的WebCore**:免费但不受支持的可嵌入Web服务器,完全用Java编写,包含了Acme.Serve的部分功能。 - **Anders Kristensen的Nexus Web Server**:免费的Servlet运行器,实现了大部分Servlet API,可轻松嵌入Java应用程序中。 在选择Servlet引擎(可能还包括服务器)来部署Servlet时,建议进行测试,确保Servlet的行为与在Java Web Server实现中一致。你可以参考Sun维护的官方列表[http://jserv.java.sun.com/products/java-server/servlets/environments.html](http://jserv.java.sun.com/products/java-server/servlets/environments.html)获取最新的可用Servlet引擎信息。 下面用一个mermaid流程图展示Servlet引擎的分类: ```mermaid graph LR classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px; classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px; A([Servlet引擎]):::startend --> B(独立Servlet引擎):::process A --> C(附加Servlet引擎):::process A --> D(可嵌入Servlet引擎):::process B --> B1(Sun的Java Web Server):::process B --> B2(万维网联盟的Jigsaw Server):::process B --> B3(O'Reilly的WebSite Professional):::process B --> B4(Netscape的Enterprise Server):::process B --> B5(Lotus的Domino Go Webserver):::process C --> C1(Java - Apache项目的JServ模块):::process C --> C2(Live Software的JRun):::process C --> C3(IBM的WebSphere Application Server):::process C --> C4(New Atlanta的ServletExec):::process C --> C5(Gefion Software的WAICoolRunner):::process C --> C6(Unicom的Servlet CGI Development Kit):::process D --> D1(Sun的JavaServer Engine):::process D --> D2(Jef Poskanzer的Acme.Serve):::process D --> D3(Paralogic的WebCore):::process D --> D4(Anders Kristensen的Nexus Web Server):::process ``` 综上所述,不同类型的Servlet引擎各有优缺点,开发者可以根据自己的需求和服务器环境进行选择。在后续的内容中,我们将深入探讨Servlet的强大之处,包括其可移植性、性能、安全性等方面的优势。 #### 4. Servlet的强大之处 前文我们介绍了Servlet作为一种替代其他动态Web内容技术的选择,接下来详细解释为何它是Web开发的可行之选,它具备诸多优势,下面逐一分析。 ##### 4.1 可移植性 Servlet使用Java编写,并遵循定义明确且广泛接受的API,这使得它在不同操作系统和服务器实现之间具有高度的可移植性。例如,你可以在运行Java Web Server的Windows NT机器上开发一个Servlet,之后轻松地将其部署到运行Apache的高端Unix服务器上,真正实现“一次编写,随处运行”。 Servlet的可移植性与小程序不同,主要有两个原因。其一,Servlet的可移植性并非强制要求。与小程序需要在所有可能的客户端平台上进行测试不同,Servlet只需在用于开发和部署的服务器机器上正常工作即可。除非你从事Servlet销售业务,否则无需担心完全的可移植性。其二,Servlet避免了Java语言中最容易出错且实现不一致的部分,即构成Java图形用户界面基础的抽象窗口工具包(AWT)。 ##### 4.2 强大功能 Servlet能够充分利用核心Java API的强大功能,涵盖网络和URL访问、多线程、图像操作、数据压缩、数据库连接、国际化、远程方法调用(RMI)、CORBA连接以及对象序列化等。例如,如果你要编写一个允许员工查询企业遗留数据库的Web应用程序,就可以利用所有Java企业API。若需要创建一个基于Web的目录查找应用程序,则可以使用JNDI API。 作为Servlet开发者,你还可以从大量第三方Java类和JavaBeans组件中进行选择。未来,甚至可以使用新推出的企业JavaBeans组件。目前,Servlet可以使用第三方代码来处理诸如正则表达式搜索、数据图表绘制、高级数据库访问和高级网络等任务。 此外,Servlet非常适合实现客户端 - 服务器通信。通过基于Java的小程序和Servlet,你可以使用RMI和对象序列化来处理客户端 - 服务器通信,这意味着你可以在客户端和服务器上复用相同的自定义代码。而使用CGI实现相同目的则要复杂得多,因为你必须开发自己的自定义协议来处理通信。 ##### 4.3 高效性和持久性 Servlet的调用效率极高。一旦Servlet被加载,它通常会作为单个对象实例保留在服务器内存中。此后,服务器通过简单、轻量级的方法调用来调用Servlet处理请求。与CGI不同,无需生成新进程或调用解释器,因此Servlet几乎可以立即开始处理请求。多个并发请求由单独的线程处理,这使得Servlet具有高度的可扩展性。 一般来说,Servlet是自然持久的对象。由于Servlet作为单个对象实例保留在服务器内存中,它会自动维护其状态,并可以持有外部资源,如数据库连接,而建立这些资源可能需要几秒钟的时间。 ##### 4.4 安全性 Servlet在多个层面支持安全的编程实践。由于它们使用Java编写,因此继承了Java语言强大的类型安全性。此外,Servlet API的实现也是类型安全的。在CGI程序中,大多数值(包括服务器端口号等数字项)都被视为字符串,而Servlet API使用其原生类型来操作值,因此服务器端口号表示为整数。Java的自动垃圾回收和无指针特性意味着Servlet通常不会受到内存管理问题的影响,如悬空指针、无效指针引用和内存泄漏。 由于Java的异常处理机制,Servlet可以安全地处理错误。如果Servlet进行了除零操作或执行了其他非法操作,它会抛出一个异常,服务器可以安全地捕获并处理该异常,礼貌地记录错误并向用户道歉。而如果基于C++的服务器扩展犯了同样的错误,则可能会导致服务器崩溃。 服务器还可以通过使用Java安全管理器进一步保护自己免受Servlet的影响。服务器可以在严格的安全管理器的监控下执行Servlet,例如,实施旨在防止恶意或编写不当的Servlet损坏服务器文件系统的安全策略。 ##### 4.5 优雅性 Servlet代码的优雅性令人瞩目。它干净、面向对象、模块化且极其简单。这种简单性的一个原因是Servlet API本身,它包含了处理Servlet开发许多日常杂务的方法和类。即使是高级操作,如cookie处理和会话跟踪,也被抽象到方便的类中。API中遗漏了一些更高级但仍然常见的任务,在这些方面,我们在`com.oreilly.servlet`包中提供了一组有用的类。 ##### 4.6 集成性 Servlet与服务器紧密集成,这种集成使Servlet能够以CGI程序无法实现的方式与服务器协作。例如,Servlet可以使用服务器来转换文件路径、执行日志记录、检查授权、执行MIME类型映射,在某些情况下,甚至可以将用户添加到服务器的用户数据库中。特定于服务器的扩展也可以完成其中许多任务,但过程通常更加复杂且容易出错。 ##### 4.7 可扩展性和灵活性 Servlet API的设计易于扩展。目前,该API包含针对HTTP Servlet进行优化的类。但在未来,Sun或第三方可以对其进行扩展和优化,以支持其他类型的Servlet,也有可能进一步增强其对HTTP Servlet的支持。 Servlet还具有很强的灵活性。在下一章中你将看到,HTTP Servlet可以用于生成完整的Web页面;可以使用`<SERVLET>`标签将其添加到静态页面中,即所谓的服务器端包含;还可以与任意数量的其他Servlet协作,在所谓的Servlet链中过滤内容。此外,在本书付梓之际,Sun推出了JavaServer Pages,它提供了一种直接在静态HTML页面中编写Servlet代码片段的方法,其语法与Microsoft的Active Server Pages(ASP)非常相似。未来可能还会有更多创新。 下面用表格总结Servlet与其他动态Web内容技术的比较: | 技术 | 可移植性 | 功能 | 效率 | 安全性 | 集成性 | 可扩展性 | 灵活性 | | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | | CGI | 一般 | 有限 | 低 | 低 | 差 | 差 | 差 | | FastCGI | 一般 | 有限 | 一般 | 低 | 差 | 差 | 差 | | mod_perl | 依赖Apache | 一般 | 较高 | 一般 | 较好 | 一般 | 一般 | | PerlEx | 依赖Windows NT | 一般 | 较高 | 一般 | 较好 | 一般 | 一般 | | 服务器扩展API | 差 | 强 | 高 | 低 | 好 | 差 | 差 | | ASP | 依赖Microsoft服务器 | 一般 | 较高 | 一般 | 好 | 一般 | 一般 | | SSJS | 依赖Netscape服务器 | 一般 | 较高 | 一般 | 好 | 一般 | 一般 | | Servlet | 高 | 强 | 高 | 高 | 好 | 好 | 好 | 综上所述,Java Servlet在Web应用开发中具有显著的优势,无论是可移植性、功能、效率还是安全性等方面都表现出色。不同类型的Servlet引擎为开发者提供了多种选择,以满足不同的需求和服务器环境。随着Web技术的不断发展,Servlet有望在未来的Web应用开发中发挥更加重要的作用。
corwn 最低0.47元/天 解锁专栏
赠100次下载
点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

李_涛

知名公司架构师
拥有多年在大型科技公司的工作经验,曾在多个大厂担任技术主管和架构师一职。擅长设计和开发高效稳定的后端系统,熟练掌握多种后端开发语言和框架,包括Java、Python、Spring、Django等。精通关系型数据库和NoSQL数据库的设计和优化,能够有效地处理海量数据和复杂查询。
最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看

最新推荐

机械臂三维模型的材料选择与应用:材质决定命运,选对材料赢未来

![机械臂三维模型的材料选择与应用:材质决定命运,选对材料赢未来](https://blogs.sw.siemens.com/wp-content/uploads/sites/2/2023/12/Inverse-Kinematics-1024x466.png) # 摘要 机械臂作为先进制造和自动化系统的重要组成部分,其三维模型设计和材料选择对提高机械臂性能与降低成本至关重要。本文从基础理论出发,探讨了机械臂三维模型设计的基本原则,以及材料选择对于机械臂功能和耐久性的关键作用。通过对聚合物、金属和复合材料在实际机械臂应用案例的分析,本文阐述了不同材料的特性和应用实例。同时,提出了针对机械臂材料

在线票务系统解析:功能、流程与架构

### 在线票务系统解析:功能、流程与架构 在当今数字化时代,在线票务系统为观众提供了便捷的购票途径。本文将详细解析一个在线票务系统的各项特性,包括系统假设、范围限制、交付计划、用户界面等方面的内容。 #### 系统假设与范围限制 - **系统假设** - **Cookie 接受情况**:互联网用户不强制接受 Cookie,但预计大多数用户会接受。 - **座位类型与价格**:每场演出的座位分为一种或多种类型,如高级预留座。座位类型划分与演出相关,而非个别场次。同一演出同一类型的座位价格相同,但不同场次的价格结构可能不同,例如日场可能比晚场便宜以吸引家庭观众。 -

响应式Spring开发:从错误处理到路由配置

### 响应式Spring开发:从错误处理到路由配置 #### 1. Reactor错误处理方法 在响应式编程中,错误处理是至关重要的。Project Reactor为其响应式类型(Mono<T> 和 Flux<T>)提供了六种错误处理方法,下面为你详细介绍: | 方法 | 描述 | 版本 | | --- | --- | --- | | onErrorReturn(..) | 声明一个默认值,当处理器中抛出异常时发出该值,不影响数据流,异常元素用默认值代替,后续元素正常处理。 | 1. 接收要返回的值作为参数<br>2. 接收要返回的值和应返回默认值的异常类型作为参数<br>3. 接收要返回

【电路设计揭秘】:5个技巧彻底理解电路图的奥秘

![【电路设计揭秘】:5个技巧彻底理解电路图的奥秘](https://electronics.koncon.nl/wp-content/uploads/2020/09/all_components-1-1024x506.jpg) # 摘要 电路图与电路设计是电子工程领域的基石,本文全面概述了电路图的基础知识、核心理论以及设计实践技巧。从电路图基础知识开始,逐步深入到电路设计的核心理论,包括基本电路元件特性、电路理论基础和仿真软件应用。在实践技巧方面,本文介绍了电路图绘制、测试与调试、PCB设计与制造的关键点。进一步探讨了模拟电路与数字电路的区别及应用、电源电路设计优化、微控制器的电路设计应用

【Nokia 5G核心网运维自动化】:提升效率与降低错误率的6大策略

![5g核心网和关键技术和功能介绍-nokia.rar](https://www.viavisolutions.com/sites/default/files/images/diagram-sba.png) # 摘要 随着5G技术的快速发展,其核心网运维面临一系列新的挑战。本文首先概述了5G核心网运维自动化的必要性,然后详细分析了Nokia 5G核心网架构及其运维挑战,包括组件功能、架构演变以及传统运维的局限性。接着,文章探讨了自动化策略的基础理论与技术,包括自动化工具的选择和策略驱动的自动化设计。重点介绍了Nokia 5G核心网运维自动化策略实践,涵盖网络部署、故障诊断与性能优化的自动化实

并发编程:多语言实践与策略选择

### 并发编程:多语言实践与策略选择 #### 1. 文件大小计算的并发实现 在并发计算文件大小的场景中,我们可以采用数据流式方法。具体操作如下: - 创建两个 `DataFlowQueue` 实例,一个用于记录活跃的文件访问,另一个用于接收文件和子目录的大小。 - 创建一个 `DefaultPGroup` 来在线程池中运行任务。 ```plaintext graph LR A[创建 DataFlowQueue 实例] --> B[创建 DefaultPGroup] B --> C[执行 findSize 方法] C --> D[执行 findTotalFileS

AWSLambda冷启动问题全解析

### AWS Lambda 冷启动问题全解析 #### 1. 冷启动概述 在 AWS Lambda 中,冷启动是指函数实例首次创建时所经历的一系列初始化步骤。一旦函数实例创建完成,在其生命周期内不会再次经历冷启动。如果在代码中添加构造函数或静态初始化器,它们仅会在函数冷启动时被调用。可以在处理程序类的构造函数中添加显式日志,以便在函数日志中查看冷启动的发生情况。此外,还可以使用 X-Ray 和一些第三方 Lambda 监控工具来识别冷启动。 #### 2. 冷启动的影响 冷启动通常会导致事件处理出现延迟峰值,这也是人们关注冷启动的主要原因。一般情况下,小型 Lambda 函数的端到端延迟

ApacheThrift在脚本语言中的应用

### Apache Thrift在脚本语言中的应用 #### 1. Apache Thrift与PHP 在使用Apache Thrift和PHP时,首先要构建I/O栈。以下是构建I/O栈并调用服务的基本步骤: 1. 将传输缓冲区包装在二进制协议中,然后传递给服务客户端的构造函数。 2. 构建好I/O栈后,打开套接字连接,调用服务,最后关闭连接。 示例代码中的异常捕获块仅捕获Apache Thrift异常,并将其显示在Web服务器的错误日志中。 PHP错误通常在Web服务器的上下文中在服务器端表现出来。调试PHP程序的基本方法是检查Web服务器的错误日志。在Ubuntu 16.04系统中

Clojure多方法:定义、应用与使用场景

### Clojure 多方法:定义、应用与使用场景 #### 1. 定义多方法 在 Clojure 中,定义多方法可以使用 `defmulti` 函数,其基本语法如下: ```clojure (defmulti name dispatch-fn) ``` 其中,`name` 是新多方法的名称,Clojure 会将 `dispatch-fn` 应用于方法参数,以选择多方法的特定实现。 以 `my-print` 为例,它接受一个参数,即要打印的内容,我们希望根据该参数的类型选择特定的实现。因此,`dispatch-fn` 需要是一个接受一个参数并返回该参数类型的函数。Clojure 内置的

编程中的数组应用与实践

### 编程中的数组应用与实践 在编程领域,数组是一种非常重要的数据结构,它可以帮助我们高效地存储和处理大量数据。本文将通过几个具体的示例,详细介绍数组在编程中的应用,包括图形绘制、随机数填充以及用户输入处理等方面。 #### 1. 绘制数组图形 首先,我们来创建一个程序,用于绘制存储在 `temperatures` 数组中的值的图形。具体操作步骤如下: 1. **创建新程序**:选择 `File > New` 开始一个新程序,并将其保存为 `GraphTemps`。 2. **定义数组和画布大小**:定义一个 `temperatures` 数组,并设置画布大小为 250 像素×250 像