Servlet(JavaEE开发)

目录

一、Tomcat服务器

二、Servlet生命周期详解

三、HttpRequest对象

四、HttpResponse对象

五、HttpSession对象

六、ServletContext对象

七、过滤器、

八、监听器

九、JSP技术介绍


一、Tomcat服务器

Tomcat官网:Apache Tomcat® - Welcome!

Tomcat的安装及配置:Tomcat安装步骤及详细配置-CSDN博客

在Java EE开发中,Tomcat服务器是一个重要的组成部分,它扮演着Web应用服务器的角色。Tomcat是一个开源的、免费的、轻量级的Web应用服务器,能够处理HTTP请求,并提供Web服务。以下是关于Tomcat服务器在Java EE开发中的详细解释:

  1. Tomcat的概念和作用
    • Tomcat是一个开放源代码的Web应用服务器,用于装载和运行Java Web程序,如JSP或Servlet程序。当服务器启动时,Tomcat会根据预先编辑好的Java Web程序来响应客户端的请求。
    • 它主要负责运行Servlet和JSP容器,存放和运行Java Web程序。当有请求需要访问存放在Tomcat容器中的Java Web程序时,Tomcat会调用相应的程序进行响应。
  2. Tomcat的功能
    • 管理Servlet应用的生命周期:Tomcat负责创建Servlet,处理请求时调用相应的Servlet,并在不再需要时销毁Servlet。
    • URL映射:Tomcat通过配置文件将URL映射到对应的Servlet,使得当用户访问某个URL时,能够自动调用对应的Servlet处理请求。
    • 与Servlet程序合作处理HTTP请求:Tomcat可以与Servlet程序合作处理HTTP请求,将请求传递给Servlet进行处理,并将处理结果返回给用户。
    • 提供Web服务:允许其他系统通过HTTP协议访问其提供的Web服务。
    • 可扩展性:Tomcat具有良好的可扩展性,可以通过添加组件或插件来扩展其功能。
  3. Tomcat的优点
    • 开源免费:用户可以免费使用Tomcat,并根据需要进行定制和扩展。
    • 易于使用:Tomcat的安装和配置相对简单,开发者可以快速构建稳定、可靠的Web应用。
    • 良好的性能:尽管在某些情况下,其性能可能不如一些商业Web服务器,但对于大多数中小型应用来说,Tomcat的性能是足够的。
  4. Tomcat的缺点
    • 配置复杂:对于初学者来说,Tomcat的配置文件较多,配置过程可能会相对复杂。
    • 性能限制:与一些商业Web服务器相比,Tomcat的性能可能有所限制,特别是在处理大规模应用或高并发请求时。
    • 对静态资源支持相对较弱:如果应用程序中包含大量的静态资源,Tomcat的处理性能可能会受到影响。
  5. Tomcat与Java EE集成
    • 在Java EE开发环境中,配置Tomcat服务器通常涉及将其添加到IDE(如Eclipse)中作为运行时环境。这样,开发者可以在IDE中直接部署和运行Java Web应用,并进行调试和测试。

综上所述,Tomcat服务器在Java EE开发中扮演着重要的角色,为开发者提供了一个强大且灵活的Web应用服务器平台。然而,在选择使用Tomcat时,也需要考虑到其可能存在的性能限制和配置复杂性等问题。

二、Servlet生命周期详解

在Java EE开发中,Servlet是Web应用的重要组成部分,用于处理客户端的请求并生成相应的响应。Servlet的生命周期是指Servlet从创建到销毁的整个过程,包括加载、初始化、处理请求、服务结束和卸载等几个关键阶段。下面将详细解释Servlet的生命周期:

  1. 加载(Loading)
    • 当Web应用启动时,Servlet容器(如Tomcat)会扫描Web应用的WEB-INF/web.xml配置文件以及使用@WebServlet注解的Servlet类。
    • 容器发现Servlet的配置后,会加载相应的Servlet类。这一步通常由类加载器完成,将Servlet的.class文件加载到JVM中。
  2. 初始化(Initialization)
    • 在Servlet被加载后,容器会创建Servlet的实例。
    • 随后,容器调用Servlet的init()方法进行初始化。这个方法由Servlet开发者提供,可以在其中执行一些只需要在Servlet生命周期中执行一次的初始化操作,如加载配置文件、创建数据库连接等。
    • init()方法只会在Servlet生命周期中调用一次。
  3. 处理请求(Service)
    • 当客户端(如Web浏览器)发送请求到Servlet时,容器会调用Servlet的service()方法。
    • service()方法是Servlet处理请求的核心方法。根据请求的类型(GET、POST等),容器可能会调用doGet()doPost()等特定的方法来处理请求。
    • 对于每一个客户端请求,容器都会创建一个新的线程来调用service()方法,因此service()方法可能会被多次调用,每次处理一个不同的请求。
  4. 服务结束(End of Service)
    • service()方法执行完毕后,请求的处理就告一段落。
    • Servlet容器会等待下一个请求的到来,并再次调用service()方法。
    • Servlet实例在Web应用运行期间会一直存在,并持续处理请求,直到Web应用被停止或Servlet被卸载。
  5. 卸载(Unloading)
    • 当Web应用停止时,或者Servlet容器决定释放不再需要的Servlet实例时,Servlet的生命周期将结束。
    • 在Servlet实例被销毁之前,容器会调用Servlet的destroy()方法。这个方法也是由Servlet开发者提供的,用于执行一些清理操作,如关闭数据库连接、释放资源等。
    • destroy()方法只会在Servlet生命周期结束时调用一次。
    • 调用完destroy()方法后,Servlet实例会被垃圾回收器回收,Servlet的生命周期正式结束。

Servlet的生命周期由Servlet容器管理,开发者无需直接控制Servlet的加载、初始化和卸载。但是,开发者可以通过重写init()service()destroy()方法来定制Servlet的行为,以满足特定的业务需求。

三、HttpRequest对象

在Java EE开发中,HttpRequest对象扮演着关键角色,它用于封装HTTP请求信息,使得开发者能够方便地访问和处理请求数据。然而,需要注意的是,在标准的Java EE Servlet API中,并没有直接命名为HttpRequest的接口或类。实际上,更常见的接口是HttpServletRequest,它继承自ServletRequest接口,专门用来封装HTTP请求消息。

HttpServletRequest对象提供了一系列方法来获取请求中的信息,如请求头、请求参数、请求路径等。以下是一些常用的方法:

  • getMethod():返回请求使用的HTTP方法,如GET、POST等。
  • getRequestURI():返回请求的URI(统一资源标识符)。
  • getProtocol():返回请求使用的协议和版本。
  • getHeader(String name):根据给定的请求头名称返回对应的值。
  • getParameter(String name):根据给定的参数名称返回对应的参数值。
  • getParameterMap():返回请求参数的键值对映射。
  • getServletContext():返回与该请求关联的ServletContext对象。

此外,HttpServletRequest对象还提供了其他许多方法,用于获取和处理请求中的各种信息。通过这些方法,开发者可以灵活地处理各种HTTP请求,实现复杂的Web应用功能。

在Java EE应用中,当客户端发送一个HTTP请求到服务器时,服务器端的Servlet容器会创建一个HttpServletRequest对象,并将其传递给相应的Servlet进行处理。Servlet可以通过调用HttpServletRequest对象的方法来获取请求中的信息,并根据这些信息执行相应的业务逻辑。

需要注意的是,HttpServletRequest对象在请求处理期间是线程安全的,但不应该在请求处理之外的时间段内保持对它的引用,因为这可能导致数据不一致或其他问题。同时,在处理完请求后,也不需要显式地关闭或释放HttpServletRequest对象,因为容器会自动管理其生命周期。

总之,HttpServletRequest对象是Java EE开发中处理HTTP请求的重要工具,它提供了丰富的方法来获取和处理请求中的信息,使得开发者能够构建出功能强大、灵活的Web应用。

四、HttpResponse对象

在Java EE开发中,HttpResponse对象通常用于封装HTTP响应信息,以便将服务器处理的结果发送回客户端。尽管标准的Java EE Servlet API中并没有直接命名为HttpResponse的接口或类,但通常使用HttpServletResponse接口来实现这一功能。HttpServletResponse对象继承自ServletResponse接口,并提供了多种方法来设置响应的状态码、头部信息以及响应正文。

以下是HttpServletResponse对象的一些常用方法及其功能:

  1. 设置状态码:通过调用setStatus(int sc)方法,可以设置HTTP响应的状态码,如200(表示请求成功)、404(表示未找到资源)等。

  2. 设置响应头信息addHeader(String name, String value)setHeader(String name, String value)方法用于添加或设置响应的头部信息。这包括设置内容类型、缓存控制、重定向等。

  3. 设置响应正文:通过getWriter()getOutputStream()方法,可以获得一个输出流,用于向客户端发送响应的正文内容。这些内容可以是HTML、JSON、XML等格式的数据。

  4. 重定向:使用sendRedirect(String location)方法可以实现页面的重定向,将客户端的请求转发到另一个URL。

在Java EE应用中,当服务器处理完客户端的请求后,会创建一个HttpServletResponse对象,并设置相应的响应信息。然后,这个响应对象会被发送给客户端,客户端据此显示页面或进行其他操作。

需要注意的是,HttpServletResponse对象在响应处理期间也是线程安全的,但同样不应该在响应处理之外的时间段内保持对它的引用。同时,在处理完响应后,也不需要显式地关闭或释放HttpServletResponse对象,因为容器会自动管理其生命周期。

通过灵活使用HttpServletResponse对象,开发者可以构建出功能丰富、交互性强的Web应用,提供优质的用户体验。

五、HttpSession对象

在Java EE中,HttpSession对象是一个用于跨多个页面请求或对Web站点的多次访问来标识用户并存储有关该用户信息的机制。这个对象提供了一个会话级别的数据存储,使得开发者可以在用户的不同请求之间保持和共享状态信息。

HttpSession对象通常与用户的会话周期相对应。当用户首次访问Web应用程序时,服务器会为该用户创建一个新的HttpSession对象。这个对象会存储在服务器端,并且可以通过一个唯一的会话标识符(通常是sessionID)在客户端和服务器之间进行传递。

HttpSession对象是一个键值对的集合,允许开发者存储各种类型的数据,如用户的登录状态、购物车信息、用户偏好等。这些数据可以在用户的多个请求之间共享,从而提供了跨请求的持续性。

通过HttpServletRequest对象的getSession()方法,开发者可以获取当前请求的HttpSession对象。如果当前请求中不存在HttpSession对象,getSession()方法会创建一个新的HttpSession对象。如果已存在HttpSession对象,则返回该对象。

HttpSession对象的生命周期与用户的会话周期相同。当用户关闭浏览器或会话超时(超过设定的会话时长)时,HttpSession对象会被销毁,并释放其所占用的资源。此外,开发者也可以通过编程方式显式地使HttpSession对象失效。

需要注意的是,虽然HttpSession对象提供了方便的会话管理机制,但过度使用或不当使用可能导致性能问题或安全风险。因此,在使用HttpSession对象时,应谨慎考虑其存储的数据量、生命周期以及安全性等因素。

六、ServletContext对象

在Java EE开发中,ServletContext对象是一个非常重要的组件,它代表了整个Web应用的上下文环境。每个Web应用都对应一个唯一的ServletContext对象,该对象在Web应用启动时被创建,并在Web应用停止时被销毁。ServletContext对象在整个Web应用中是全局共享的,因此它可以被用来存储和管理与整个应用相关的数据。

ServletContext对象的主要用途包括:

  1. 作为域对象共享数据ServletContext对象可以作为域对象(Scope Object)在整个Web应用中共享数据。这意味着,在任何地方(如不同的Servlet或JSP页面)都可以通过ServletContext对象获取或设置数据,实现数据的全局共享。
  2. 存储应用相关信息ServletContext对象内部封装了该Web应用的信息。例如,可以通过getServerInfo()方法获取当前服务器的信息,通过getRealPath(String path)方法获取Web应用中资源的真实路径等。
  3. 初始化参数管理:Web应用的初始化参数可以在web.xml文件中进行配置,这些参数可以通过ServletContext对象的getInitParameter(String name)方法获取。这提供了一种灵活的方式来配置Web应用的全局参数。
  4. 监听器注册ServletContext对象还允许注册各种监听器(Listener),用于监听Web应用的生命周期事件、会话事件等,以便在特定事件发生时执行相应的操作。

在开发中,可以通过调用ServletContext对象的各种方法来获取和设置数据、获取应用信息、管理初始化参数以及注册监听器等。这使得ServletContext对象成为Java EE开发中管理和控制Web应用上下文环境的重要工具。

需要注意的是,虽然ServletContext对象提供了全局共享数据的机制,但过度使用或不当使用可能导致性能问题或安全风险。因此,在使用ServletContext对象时,应谨慎考虑其存储的数据量、访问频率以及安全性等因素。

七、过滤器、

在Java EE开发中,过滤器(Filter)是一种强大的组件,它能够对客户端发送到服务器的请求以及服务器返回给客户端的响应进行拦截和处理。过滤器在Web应用的请求-响应生命周期中处于Servlet和JSP之前,允许开发者在请求到达目标资源之前或响应返回客户端之前执行一些预处理或后处理逻辑。

过滤器的主要用途包括:

  1. 请求预处理:在请求到达Servlet或JSP之前,过滤器可以执行一些必要的操作,如编码设置、用户认证、日志记录、权限检查等。
  2. 响应后处理:在响应返回给客户端之前,过滤器可以对响应数据进行处理,如压缩响应体、设置缓存头、添加自定义头部等。
  3. 资源访问控制:通过过滤器,可以对特定资源的访问进行控制,实现URL级别的权限管理。
  4. 跨域资源共享(CORS):过滤器可以用来处理CORS请求,设置适当的响应头以允许跨域访问。

在Java EE中,实现过滤器需要创建一个类并实现javax.servlet.Filter接口。该接口定义了三个方法:

  • init(FilterConfig filterConfig): 当过滤器被加载到Web应用时调用,用于初始化过滤器的配置信息。
  • doFilter(ServletRequest request, ServletResponse response, FilterChain chain): 这是过滤器的核心方法,每次请求或响应经过过滤器时都会调用。在这个方法中,可以编写拦截和处理请求或响应的逻辑。
  • destroy(): 当过滤器从Web应用中卸载时调用,用于释放过滤器所占用的资源。

开发者可以通过在web.xml文件中配置过滤器,指定其拦截的URL模式、执行顺序等信息。此外,从Servlet 3.0开始,也可以使用注解(如@WebFilter)来定义过滤器。

使用过滤器能够大大提高Web应用的灵活性和可扩展性,使开发者能够更加精细地控制请求和响应的处理流程。同时,过滤器也提供了一种模块化的方式,将通用的处理逻辑从具体的Servlet或JSP中分离出来,提高了代码的可重用性和可维护性。

八、监听器

在Java EE开发中,监听器(Listener)是一种重要的组件,用于监听和响应Web应用程序中的特定事件。监听器的作用是在这些事件发生时执行一些自定义的逻辑,从而增强应用程序的功能和灵活性。

常见的监听器类型包括:

  • ServletContext监听器:用于监听ServletContext对象的创建和销毁事件,以及监听其中属性的添加、替换和移除事件。这有助于在Web应用的启动和关闭时执行特定的初始化或清理操作。
  • HttpSession监听器:用于监听HttpSession对象的创建和销毁事件,以及监听会话属性的变化。这对于跟踪用户的会话状态、实现用户登录和注销等功能非常有用。
  • ServletRequest监听器:监听ServletRequest对象的创建和销毁事件,通常用于跟踪和处理用户的请求。

监听器的工作原理基于事件驱动模型。当特定事件发生时(如Web应用的启动、会话的创建等),监听器会立即执行其注册的方法。这使得开发者能够在不直接修改事件源代码的情况下,对事件进行响应和处理。

在Java EE中,实现监听器需要创建一个类并实现相应的监听器接口,如ServletContextListenerHttpSessionListenerServletRequestListener。然后,需要在web.xml文件中配置监听器,以便Web容器能够加载和实例化它们。

监听器的使用为Java EE开发提供了强大的事件处理机制,使得开发者能够更加灵活地控制Web应用程序的行为,实现各种自定义的业务逻辑。通过合理地使用监听器,可以极大地提高Web应用程序的可用性和可维护性。

九、JSP技术介绍

JSP(Java Server Pages)是JavaEE开发中的一种重要技术,它建立在Servlet规范之上,是一种动态网页开发技术。JSP实际上是一个简化的Servlet设计,使得开发者能够更方便地在Java中使用HTML标签。它实现了静态网页和动态网页的混编,从外观上看像是一个普通的网页,但在本质上,JSP编译后会成为一个Servlet的class类文件。

JSP的生命周期与Servlet的生命周期完全相同,它同样具备Servlet的完整生命周期。当服务器启动并访问JSP资源时,服务器会按照特定的规则将JSP文件解析并编译成对应的Java类文件(例如,index.jsp会被解析和编译成index_jsp.class)。在每次请求时,如果JSP页面已经被编译过,服务器会直接调用相应的service方法来处理请求,类似于Servlet的service、doPost、doGet等方法。

JSP内置了九个内置对象,这些对象使得HTTP请求的处理变得更为便捷。JSP的语法包括JSP指令、JSP脚本元素、JSP标准标签库(JSTL)以及JSP动作等,它们共同构成了JSP页面的基本结构。

在JavaEE开发中,JSP通常作为数据显示模板来使用,而Servlet则作为Web应用中的控制组件,负责响应请求并产生数据。这种分工使得程序结构更清晰,可读性和可维护性更高。

总的来说,JSP技术为JavaEE开发提供了强大的动态网页开发能力,使得开发者能够更加方便地创建出功能丰富、交互性强的Web应用。


 文章制作不易,如果有帮助的话,还希望能给个点赞关注支持一下,谢谢大家!🙏🙏🙏

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多项式和Bezier曲线拟合

目录 1. 多项式拟合2. Bezier曲线拟合3. 源码地址 1. 多项式拟合 在曲线拟合中,多项式拟合方法的性能受到三个主要因素的影响:采样点个数、多项式阶数和正则项。 采样点个数 N N N:从Figure 1中可以看出较少的采样点个数可能导致过拟合&…

【Nginx】centos和Ubuntu操作系统下载Nginx配置文件并启动Nginx服务详解

目录 🌷 安装Nginx环境 🍀 centos操作系统 🍀 ubuntu操作系统 🌷 安装Nginx环境 以下是在linux系统中安装Nginx的步骤: 查看服务器属于哪个操作系统 cat /etc/os-release安装 yum: 如果你确定你的系统…

Linux驱动开发——(四)内核定时器

一、内核的时间管理 1.1 节拍率 Linux内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序等等,对于驱动编写者来说最常用的是定时器。 硬件定时器提供时钟源,时钟源的频率可以设置,设置好以后就周期性的产生定时中…

linux负载均衡 和 系统负载分析笔记

1 负载均衡 1.1 计算负载 1.1.1 PELT算法简介 从Linux3.8内核以后进程的负载计算不仅考虑权重,⽽且跟踪每个调度实体的历史负载情况,该算法称为PELT(Per-entity Load Tracking) 《奔跑吧Linux内核》卷1:基础架构;P505 相关资料…

stack、queue(priority_queue)的模拟实现和deque的简单介绍

stack和queue(priority_queue) 1. 容器适配器 适配器(Adapter):一种用来修饰容器(Containers)或仿函数(Functors)或迭代器(Iterator)接口的东西。 适配器是一种设计模式,该模式将一个类的接口转换成客户希望的另外一个接口。 现实中拿插座来说&#xf…

serverLess

第一步 安装依赖 npm install serverless-devs/s g 第二步 配置秘钥: 第三步 执行终端 执行命令 s config add 选择 alibaba cloud (alibaba) 把对应的ID secret填写,第三个别名可以随便写: serverLess 查看是…

ClickHouse 高可用之副本

文章目录 ClickHouse 副本支持副本的引擎配置高可用副本副本应用1.副本表概述2.创建副本表3.写入模拟数据4.副本验证 扩展 —— 在 Zookeeper 中查看副本表信息 ClickHouse 副本 ClickHouse 通过副本机制,可以将数据拷贝存储在不同的节点上。这样,如果一…

Redis底层数据结构之Dict

目录 一、概述二、Dict结构三、Dictht结构四、DictEntry结构五、核心特性 上一篇文章 reids底层数据结构之quicklist 一、概述 Redis 的 Dict 是一个高效的键值对映射数据结构,采用双哈希表实现以支持无锁的渐进式 Rehash,确保扩容或缩容时的高效性能。…

linux autogroup

一:概述 对于linux autogroup的作用,很多同学可能是听说过,但,并未验证过。 考虑下面场景,开两个terminal,T1和T2,在T1中运行进程P1,P1开启9个线程编译代码,在T2中运行…

Datawhale ChatGPT基础科普

根据课程GitHub - datawhalechina/hugging-llm: HuggingLLM, Hugging Future. 摘写自己不懂得一些地方,具体可以再到以上项目地址 LM:这是ChatGPT的基石的基石。 Transformer:这是ChatGPT的基石,准确来说它的一部分是基石。 G…

销售经理与员工:如何展开有效的绩效面谈

在当今竞争激烈的商业环境中,销售经理与员工之间的绩效面谈显得尤为重要。有效的绩效面谈不仅能够提升员工的工作积极性,促进团队的整体绩效,还能够加强销售经理与员工之间的沟通与理解,为企业的发展奠定坚实的基础。本文将探讨销…

7.2K star!一个完全免费,可以本地部署的 AI 搜索聚合器。新手可尝试

原文链接:7.2K star!一个完全免费,可以本地部署的 AI 搜索聚合器。新手可尝试 ChatGPT 刚上线的时候我用的很少,还是习惯用 Google。主要还是因为不信任,怕它对我胡说八道。 慢慢的,也没有一个明确的时间…

Linux的学习之路:19、进程信号(1)

摘要 今天这张说一下信号的一部分知识 目录 摘要 一、信号 1、生活角度的信号 2、技术应用角度的信号 3、注意 4、用kill -l命令可以察看系统定义的信号列表 5、信号处理常见方式概览 二、产生信号 1、通过终端按键产生信号 2、调用系统函数向进程发信号 3、由软件…

<前端>Electron-builder为公证后的app打更新信息latest.yml

MacOS下,Electron-builder可以很方便的为测试包app打更新信息(latest-mac.yml)。 但是,正式发布的时候,不可能用测试包app,因为还没有进行公证。如何为公证的app打latest-mac.yml呢。 其实观察latest-mac.y…

FPGA秋招-笔记整理(1)

一、关键路径 关键路径通常是指同步逻辑电路中,组合逻辑时延最大的路径(这里我认为还需要加上布线的延迟),也就是说关键路径是对设计性能起决定性影响的时序路径。也就是静态时序报告中WNS(Worst Nagative Slack&…

Git 核心概念与实操

这里写目录标题 1 版本回退2 工作区、暂存区、本地仓库、远程仓库 1 版本回退 原文链接:https://www.liaoxuefeng.com/wiki/896043488029600/897013573512192 首先 git log 查看提交记录 在Git中,用 HEAD 表示当前版本 上一个版本就是 HEAD^ &#xff…

Linux-进程间通信:System V消息队列

目录 System V IPC概述标识符与IPC Key System V消息队列创建或打开一个消息队列发送消息接收消息控制消息队列1、IPC_STAT2、IPC_SET3、IPC_RMID 查看系统当前的消息队列代码示例 System V IPC(Inter-Process Communication)是一组用于在 Unix-like 操作…

【C语言】手撕二叉树

标题:【C语言】手撕二叉树 水墨不写bug 正文开始: 二叉树是一种基本的树形数据结构,对于初学者学习树形结构而言较容易接受。二叉树作为一种数据结构,在单纯存储数据方面没有 顺序表,链表,队列等线性结构…

sklearn 笔记 metrics

1 分类 1.1 accuracy_score 分类准确率得分 在多标签分类中,此函数计算子集准确率:y_pred的标签集必须与 y_true 中的相应标签集完全匹配。 1.1.1 参数 y_true真实(正确)标签y_pred由分类器返回的预测标签normalize 默认为 Tr…

Linux:Win10平台上,用VMware安装Centos7.x及系统初始化关键的相关配置(分步骤操作,详细,一篇足以)

VMware安装Centos7.x镜像的详细步骤:VMWare安装Centos系统(无桌面模式) 我这里是为了安装Hadoop集群,所以,以下这些步骤是必须进行的 如果你是学习Linux,可以跳过非必须的那些配置项 我安装的版本是&…
最新文章