Javaweb——第二章 Jsp和Servlet

news2024/11/18 5:56:30

目录

2.1 JSP概述

2.2 Servlet概述

2.3 jsp和servlet的区别和联系:

​编辑 2.4 Jsp的生命周期

2.4.1 JSP编译

2.4.2 JSP初始化

2.4.3 JSP执行

2.4.4 JSP清理

2.5 Servlet

2.5.1 Servlet的工作模式

2.5.2 Servlet创建方式

2.5.3 Servlet生命周期

2.1 JSP概述

JSP(全称Java Server Pages),中文名叫JAVA服务器页面,其根本是一个简化的Servlet设计,是由Sun Microsystems公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成HTML、XML或其他格式文档的Web网页的技术标准。 JSP技术有点类似A5P技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(.htm.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件。 JSP技术是以Java语言作为脚本语言,JSP 网页为整个服务器端的Java库单元提供了一个接口来服务于HTTP的应用程序。JSP文件后缀名为*.jsp。用SP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。 JSP开发的WEB应用可以跨平台使用,既可以运行在Linux上也能运行在 windows 上。

2.2 Servlet概述

Servlet是javaEE规范中的一种,javaEE中的规范很多除了Servlet还有很多我们熟悉的JSP、JDBC、RMI、XML、EB、JTS等等。他们每个都有自己不同的角色,每一种规范在企业级java应用中都承担了不可或缺的角色。Servlet是Service + Applet的缩写,表示小服务程序。从命名就可以看出他是被用来书写服务端程序的。 但是在这个很讲究开发效率的年代已久见不到原生的Servlet程序写的服务端程序了。几乎主流的框架都对他进行了封装,比如 SpringMVC便是如此,比如SpringMVC的核心DispatcherServlet,SpringMVC正是基于他来将请求进行解析、适配、映射的最后到达我们想要调用的接口中。 Java Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。 使用Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页

视图层到程序

2.3 jsp和servlet的区别和联系:

1.jsp经编译后就变成了Servlet. (JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)

2.jsp更擅长表现于页面显示,servlet更擅长于逻辑控制.

3.Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到. Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。

而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。

联系: JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。 Servlet和JSP最主要的不同点在于: Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。

而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。

JSP侧重于视图,Servlet主要用于控制逻辑

Servlet更多的是类似于一个Controller,用来做控制。

理解以下三点即可:

1、不同之处在哪?

Servlet在Java代码中通过HttpServletResponse对象动态输出HTML内容 JSP在静态HTML内容中嵌入Java代码,Java代码被动态执行后生成HTML内容 2、各自的特点

Servlet能够很好地组织业务逻辑代码,但是在Java源文件中通过字符串拼接的方式生成动态HTML内容会导致代码维护困难、可读性差 JSP虽然规避了Servlet在生成HTML内容方面的劣势,但是在HTML中混入大量、复杂的业务逻辑同样也是不可取的 3、通过MVC双剑合璧 既然JSP和Servlet都有自身的适用环境,那么能否扬长避短,让它们发挥各自的优势呢?答案是肯定的——MVC(Model-View-Controller)模式非常适合解决这一问题。

MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller):

Controller——负责转发请求,对请求进行处理 View——负责界面显示 Model——业务功能编写(例如算法实现)、数据库设计以及数据存取操作实现 在JSP/Servlet开发的软件系统中,这三个部分的描述如下所示:

 Web浏览器发送HTTP请求到服务端,被Controller(Servlet)获取并进行处理(例如参数解析、请求转发) Controller(Servlet)调用核心业务逻辑——Model部分,获得结果 Controller(Servlet)将逻辑处理结果交给View(JSP),动态输出HTML内容 动态生成的HTML内容返回到浏览器显示 MVC模式在Web开发中的好处是非常明显,它规避了JSP与Servlet各自的短板,Servlet只负责业务逻辑而不会通过out.append()动态生成HTML代码;JSP中也不会充斥着大量的业务代码。这大大提高了代码的可读性和可维护性。

 2.4 Jsp的生命周期

JSP的生命周期指从创建到销毁的整个过程。分为以下几个阶段:

1:编译阶段:servlet引擎编译servlet源文件,生成servlet类。当浏览器请求JSP页面时,JSP引擎会首先去检查是否需要编译这个文件。如果之前没有被编译过或者编译后被更改过,则编译这个JSP文件。编译过程包含三个步骤:解析JSP文件--将JSP转换为servlet--编译servlet。 ​ 
2:初始化阶段:加载与JSP对应的servlet类,创建其实例并调用初始化方法。容器载入JSP文件后,会首先调用jspInit()方法。次方法可以重写,一般情况写程序只初始化一次,通常情况下可以在此方法中初始化数据库连接、打开文件和创建查询列表。 ​ 
3:执行阶段:调用与JSP对应的servlet实例的服务方法。当JSP网页初始化完成后,JSP引擎会调用_jspService()方法。此方法需要一个HttpServletRequest对象和一个HttpServletResponse对象作为参数。惊悚片Service()方法在每个request中被调用一次并且负责产生与之对应的response对象,别且还负责产生HTTP方法对应的回应。 ​ 
4:调用JSP对应的servlet实例的销毁方法,然后销毁servlet实例。jspDestroy()负责执行JSP网页从容器中的清理。涉及到的工作为释放数据库连接、关闭文件夹等等。

编译阶段:   servlet容器编译servlet源文件,生成servlet类

初始化阶段:   加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法

执行阶段:   调用与JSP对应的servlet实例的服务方法

销毁阶段:   调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例

2.4.1 JSP编译

  当浏览器请求JSP页面时,JSP引擎会首先去检查是否需要编译这个文件。如果这个文件没有被编译过,或者在上次编译后被更改过,则编译这个JSP文件。

编译的过程包括三个步骤:

解析JSP文件。
将JSP文件转为servlet。
编译servlet。

2.4.2 JSP初始化

  容器载入JSP文件后,它会在为请求提供任何服务前调用jspInit()方法。如果需要执行自定义的JSP初始化任务,重写jspInit()方法就行了,就像:

public void jspInit(){
  // 初始化代码
}

2.4.3 JSP执行

  这一阶段描述了JSP生命周期中一切与请求相关的交互行为,直到被销毁。

  当JSP网页完成初始化后,JSP引擎将会调用_jspService()方法。

  _jspService()方法需要一个HttpServletRequest对象和一个HttpServletResponse对象作为它的参数,就像下面这样:

void _jspService(HttpServletRequest request,
                 HttpServletResponse response)
{
   // 服务端处理代码
}

注:_jspService()方法在每个request中被调用一次并且负责产生与之相对应的response,并且它还负责产生所有7个HTTP方法的回应,比如GET、POST、DELETE等等。

2.4.4 JSP清理

  JSP生命周期的销毁阶段描述了当一个JSP网页从容器中被移除时所发生的一切。

  jspDestroy()方法在JSP中等价于servlet中的销毁方法。当需要执行任何清理工作时复写jspDestroy()方法,比如释放数据库连接或者关闭文件夹等等。

  jspDestroy()方法的格式如下:

public void jspDestroy()
{
   // 清理代码
}

2.5 Servlet

Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。

Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

2.5.1 Servlet的工作模式

  • 客户端发送请求至服务器

  • 服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器

  • 服务器将响应返回客户端

2.5.2 Servlet创建方式

Servlet配置及使用详解_尘埃丶落定的博客-CSDN博客_servlet配置

  1. 实现Servlet 接口

    javax.servlet.Servlet 是 Servlet API 的核心接口,所有的 Servlet 类都直接或间接地实现了这一接口。

    Servlet 接口中定义了 5 个方法

 

public class MyServlet implements Servlet {
    //Servlet 实例被创建后,调用 init() 方法进行初始化,该方法只能被调用一次
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
    }
    //返回 ServletConfig 对象,该对象包含了 Servlet 的初始化参数
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    //每次请求,都会调用一次 service() 方法
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //设置字符集
        servletResponse.setContentType("text/html;charset=UTF-8");
        //使用PrintWriter.write()方法向前台页面输出内容
        PrintWriter writer = servletResponse.getWriter();
        writer.write("Hello,MyServlet...");
        writer.close();
    }
    //返回关于 Servlet 的信息,例如作者、版本、版权等
    @Override
    public String getServletInfo() {
        return null;
    }
    //Servelet 被销毁时调用
    @Override
    public void destroy() {
    }
}

配置

<servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.lele.HelloServlet</servlet-class>
    </servlet>
​
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/servlet/first</url-pattern>
    </servlet-mapping>
  1. 继承GenericServlet 抽象类

    javax.servlet.GenericServlet 实现了 Servlet 接口,并提供了除 service() 方法以外的其他四个方法的简单实现。通过继承 GenericServlet 类创建 Servlet ,只需要重写 service() 方法即可,大大减少了创建 Servlet 的工作量。

    GenericServlet 类中还提供了以下方法,用来获取 Servlet 的配置信息。

 通过继承 GenericServlet 抽象类创建 Servlet,示例代码如下。

public class MyGenericServlet extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //设置字符集
        servletResponse.setContentType("text/html;charset=UTF-8");
        //使用PrintWriter.write()方法向前台页面输出内容
        PrintWriter writer = servletResponse.getWriter();
        writer.write("Hello,MyGenericServlet...");
        writer.close();
    }
}

别忘记配置!!!

  1. 继承HttpServlet 抽象类最为常用

    javax.servlet.http.HttpServlet 继承了 GenericServlet 抽象类,用于开发基于 HTTP 协议的 Servlet 程序。由于 Servlet 主要用来处理 HTTP 的请求和响应,所以通常情况下,编写的 Servlet 类都继承自 HttpServlet。

    在 HTTP/1.1 协议中共定义了 7 种请求方式,即 GET、POST、HEAD、PUT、DELETE、TRACE 和 OPTIONS。

    HttpServlet 针对这 7 种请求方式分别定义了 7 种方法,即 doGet()、doPost()、doHead()、doPut()、doDelete()、doTrace() 和 doOptions()。

    HttpServlet 重写了 service() 方法,该方法会先获取客户端的请求方式,然后根据请求方式调用对应 doXxx 方法。

    由于我们使用的请求方式主要是 GET 和 POST,所以通过继承 HttpServlet 类创建 Servlet 时,只需要重写 doGet 或者 doPost 方法,代码如下。

    public class MyHttpServlet extends HttpServlet {
     
        public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //使用PrintWriter.write()方法向前台页面输出内容
            resp.setContentType("text/html;charset=UTF-8");
            PrintWriter writer = resp.getWriter();
            writer.write("Hello,MyHttpServlet,doGet...");
            writer.close();
        }
     
        public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //使用PrintWriter.write()方法gaifang向前台页面输出内容
            PrintWriter writer = resp.getWriter();
            writer.write("Hello,MyHttpServlet,doPost...");
            writer.close();
            doGet(req, resp);
        }
    }

    配置别忘记!!!

2.5.3 Servlet生命周期

 servlet的生命周期就是从servlet出现到销毁的全过程。主要分为以下几个阶段: 加载类—>实例化(为对象分配空间)—>初始化(为对象的属性赋值)—>请求处理(服务阶段)—>销毁

 生命周期方法详解

创建Servlet对象,通过服务器反射机制创建Servlet对象,第一次请求时才会创建。(默认)

  1. init() 方法 调用Servlet对象的init()方法,初始化Servlet的信息,init()方法只会在创建后被调用一次(初始化阶段) (1)init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化,创建于用户第一次调用该 Servlet 的 URL 时,也可以指定 Servlet 在服务器第一次启动时被加载。

(2)当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。

(3)init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。

init 方法的定义如下:

public void init() throws ServletException { // 初始化代码... }

  1. service() 方法 响应请求,调用service()或者是doGet(),doPost()方法来处理请求,这些方法是运行的在多线程状态下的。(响应客户请求阶段)

(1)service() 方法是执行实际任务的主要方法,处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。

(2)每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。

(3)Servlet接收和响应客户请求的过程,首先客户发送一个请求,Servlet是调用service()方法对请求进行响应的,通过源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。由于在Servlet接口和GenericServlet中是没doGet,doPost等等这些方法的,HttpServlet中定义了这些方法,所以,我们每次定义一个Servlet的时候,都必须实现doGet或 doPost等这些方法。

(4)service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法进行处理。

service方法的定义如下:

public void service(ServletRequest request,ServletResponse response) throws ServletException, IOException{ } 由于service() 方法由容器调用,service 方法在适当的时候会调用 doGet、doPost、doPut、doDelete 等方法。所以,我们不用对 service() 方法做任何处理,只需要根据客户端的请求类型来重写 doGet() 或 doPost() 即可。

  1. doGet() 方法 用于处理请求,方法是运行的在多线程状态下的。(响应客户请求阶段)

doGet() 是服务请求中最常用的方法,用于处理请求,当URL的请求类型为GET请求 ,或者是一个未指定请求类型HTML表单,那么该请求将由 doGet() 方法处理。

doGet方法的定义如下:

public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { // Servlet 代码 }

  1. doPost() 方法 用于处理请求,方法是运行的在多线程状态下的。(响应客户请求阶段)

doPost() 是服务请求中最常用的方法,用于处理请求,当请求来自一个特别指定了 请求类型为POST的 HTML 表单,那么该请求将由doPost() 方法处理。

doPost方法的定义如下:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Servlet 代码 } 5、destroy() 方法 在长时间没有被调用或者是服务器关闭时,会调用destroy()方法来销毁Servlet对象。(终止阶段)

(1)destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。

(2)destroy() 方法可以让Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

(3)在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。

destroy 方法定义如下:

public void destroy() { // 终止化代码... }

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

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

相关文章

JAVA之网络编程学习

文章目录一 java网络编程初识1.1 概述1.2 C/S 架构&B/S架构认识1.2.1 C/S架构1.2.2 B/S架构1.3 网络通信两个要素1.4 IP(Inet Adderss)1.5 InetAddress演示1.6 端口号1.7 InetSocketAddress使用1.8 网络通信协议二 TCP网络编程2.1 信息通信案例2.1.1 TcpClientDemo2.1.2 Tc…

聊聊接口文档的事儿

1、前言 大家好&#xff0c;欢迎来到我的吉鹿&#xff08;记录&#xff09;空间。 最近在做一个前后端分离的项目时&#xff0c;由于后端提供的 API 接口文档实在是一言难尽&#xff0c;导致了开发的效率大大降低。于是我出手了&#xff0c;我决定薅完我20几年的头发来肝一下…

TC275——10GPT12_PWM_Generation

产生PWM的方式有很多&#xff0c;这里尝试使用TC275的GPT12模块&#xff0c;来产生具有固定频率和可变占空比的PWM信号。 GPT12就是General Purpose Timer Unit通用定时器模块&#xff0c;它包含5个16位定时器&#xff0c;被分给GPT1和GPT2。 这里使用GPT1&#xff08;T2、T3…

LinuxQQ3.0体验和下载方式

体验 2022年12月31日推出了LinuxQQ3.0版本&#xff0c;2.0版本特别复古 3.0特别丝滑 支持QQ空间 管理界面与WindowsQQ一致 支持截图和表情&#xff0c;传输文件图片很方便 下载方式 下载链接 im.qq.com/linuxqq/index.shtml 选择合适的版本下载即可 从下载文件夹中可以找到…

.Net 6实现旋转验证码

前几篇文章&#xff0c;介绍了.Net 6实现的滑动验证码功能&#xff0c;最近把滑动验证码的ImageSharp替换成了SkiaSharp&#xff0c;其中抠图部分参考了pojianbing大神的代码。滑动验证码完成之后&#xff0c;心想着。做一个旋转验证码。其实旋转验证码跟滑动验证码及其类似。 …

跨系统实时同步数据解决方案

数据量太大&#xff0c;单存储节点存不下&#xff0c;就只能把数据分片存储。 数据分片后&#xff0c;对数据的查询就没那么自由。如订单表按用户ID作为Sharding Key&#xff0c;就只能按用户维度查询。我是商家&#xff0c;我想查我店铺的订单&#xff0c;做不到。&#xff0…

ubuntu18.04下mysql数据库C语言API操作总结

通过C/C去操作数据库需要调用mysql客户端api&#xff0c;常用api和调用举例见后面。 目录 一.常用api 1.环境初始化 2.连接 mysql 的服务器 3.增删改查操作 4.事务处理 5.处理查询数据集合 6.释放资源&#xff0c;关闭连接 7.字符集相关 8.获取错误信息 二.api调用举…

Linux杂谈之sudo

一 sudo配置文件/etc/sudoers介绍 ① 什么是sudo 1) sudo 的英文全称是 super user do&#xff0c;即以超级用户root 用户的方式执行命令2) /etc/sudoers 是一个文本文件,只有root用户有该命令的执行权限 1) 允许普通用户以特权用户的权限去执行某些特权命令,访问和使用本…

优秀国土空间规划设计网络评选投票投票怎么进行小程序免费使用

如果通过一个小程序免费制作一个微信投票活动呢&#xff1f;文章详细讲解如何利用一款免费好用的微信小程序“活动星投票”小程序来制作投票活动&#xff0c;无需注册即可免费制作&#xff0c;非常的方便快捷&#xff0c;可以实现视频投票、分组投票、隐藏选手票数、导出投票数…

【Linux】进程概念(下)

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;进程状态&…

手把手教你用Python和OpenCV搭建一个半自动标注工具(详细步骤 + 源码)

导 读 本文将手把手教你用Python和OpenCV搭建一个半自动标注工具&#xff08;包含详细步骤 源码&#xff09;。 背景介绍 样本标注是深度学习项目中最关键的部分&#xff0c;甚至在模型学习效果上起决定性作用。但是&#xff0c;标注工作往往非常繁琐且耗时。一种解决方案是…

【苹果家庭群发推】创作AppleScript脚本来控制MacOS附有的iMessage客户端停止考据,近似于组iMessage

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

ENVI_IDL:如何对文件名的日期进行格式化输出?

目录 00 前言 01 第一步&#xff0c;使用file_basename()函数路径中的获取文件名 02 第二步&#xff0c;使用strmid()函数获取文件名的日期 03 第三步&#xff0c;将获取的日期进行类型转换 04 第四步&#xff0c;将日期进行整理 05 第五步&#xff0c;进行格式化输出 …

BiSeNetv2:语义分割经典方法BiSeNet的升级版本

分享IJCV2021上发表的一篇文章BiSeNetv2&#xff0c;这是BiSeNet的升级版本。开源代码地址&#xff1a;https://github.com/open-mmlab/mmsegmentation/tree/master/configs/bisenetv2 1.动机 语义分割是指为每个像素分配一个标签&#xff0c;它广泛用于场景理解、自动驾驶、人…

uniapp中app真机模拟以及小程序编译后css样式异常失效问题原因及解决方案

前言 最近写使用uniapp写app&#xff0c;开发的时候写样式都是使用浏览器h5进行调试一切正常&#xff0c;但是最后进行手机真机调试的时候css样式出现了异常&#xff0c;本文归纳常见的问题 比如在h5页面显示正常&#xff1a; 但是在真机调试app的实现则显示&#xff1a; H5正…

【PyTorch深度学习实践】02_梯度下降

文章目录梯度下降1.梯度下降算法实现代码2.随机梯度下降实现代码3.小批量随机梯度下降梯度下降 1.梯度下降算法 之前可以使用穷举的方法逐个测试找使损失函数最小的点&#xff0c;但当数据过多时&#xff0c;维度过高&#xff0c;会使穷举变得非常困难&#xff0c;因此需要优…

K8s 数据管理

目录前言一、Volume1.1 emptyDir1.1.1 基本概念1.1.2 应用案例1.2 hostPath1.2.1 基本概念1.2.2 应用案例1.3 外部 Storage Provider二、Persistent Volume2.1 基本概念2.1.1 PersistentVolume2.1.2 PersistentVolumeClaim2.2 NFS PersistentVolume前言 与 Docker 类似&#x…

QML教程(一)基础语法

目录 一、导入 二、对象声明 三、对象属性 1.声明对象属性 2.信号属性 3.方法属性 4.附加属性略 5.枚举属性 6.对象属性赋值 四、自定义对象 一、导入 模块导入 语法&#xff1a; import <ModuleIdentifier> [<Version.Number>] [as <Qualifier>…

面向对象设计原则概述

面向对象设计原则概述 软件的可维护性和可复用性 软件工程和建模大师Peter coad认为&#xff0c;一个好的系统设计与应该具备如下三个性质 可扩展性 灵活性 可插入性 软件的可维护性和可复用性 软件的复用和重用拥有众多优点&#xff0c;如可以提高软件的开发效率&#xf…

Educational Codeforces Round 92 (Rated for Div. 2) B. Array Walk

翻译&#xff1a; 给定一个数组&#x1d44e;1&#xff0c;&#x1d44e;2&#xff0c;…&#xff0c;&#x1d44e;&#x1d45b;&#xff0c;由&#x1d45b;个正整数组成。 最初&#xff0c;您位于索引1&#xff0c;分数等于&#x1d44e;1。你可以执行两种动作: 向右移动…