Spring MVC 笔记(二)之web.xml的加载顺序

Spring 4 Security MVC 登录登出完整骨架(XML配置版) Spring Security 是 Spring 生态中实现认证与授权的核心框架,其本质是通过 Filter Chain 拦截请求并委托 AuthenticationManager 执行校验。在传统 Spring MVC 架构中,Security 与 DispatcherServlet 协同工作:前者负责安全拦截与会话管理,后者处理控制器分发与视图渲染。这种组合具备强可控性、低侵入性和清晰的调试路径,特别适合遗留系统加固、教学实践及底层机制学习。本文聚焦 Spring 4 原生环境下的最小可行实现——基于 阅读详情

启动WEB项目的时候,项目容器首先会去读取web.xml配置文件里的配置,当这一步骤没有出错并且完成之后,项目才能正常的被启动起来。当然,web.xml中配置的各个xml、资源等配置也要一并正确才行。

第一,最新读取的节点是文件中的<listener> </listener>节点和<context-param> </context-param>节点。

在笔记第一章中,我配置的是:

    <!-- Spring和mybatis的配置文件 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring.xml</param-value>
    </context-param>
    <context-param>
        <param-name>webAppRootKey</param-name>
        <param-value>dzcx_management.root</param-value>
    </context-param>
    <!-- logback日志配置 -->
    <context-param>
        <param-name>logbackConfigLocation</param-name>
        <param-value>classpath:logback.xml</param-value>
    </context-param>
    <listener>
        <listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class>
    </listener>

    <session-config>
        <session-timeout>30 </session-timeout>
    </session-config>

    <!--Spring监听器 ApplicationContext 载入 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 防止Spring内存溢出监听器 -->
    <listener>
        <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
    </listener>

紧接着,容器创建一个ServletContext(application),这个web项目的所有部分都将共享这个上下文。容器以<context-param></context-param>的name作为键,value作为值,将其转化为键值对,存入ServletContext。请参考代码中的事例,以便更容易理解。  

  容器创建<listener></listener>中的类实例,根据配置的class类路径<listener-class>来创建监听,在监听中会有初始化方法,启动Web应用时,系统调用Listener的该方法 contextInitialized(ServletContextEvent args),在这个方法中获得:

  ServletContext application =ServletContextEvent.getServletContext();

  context-param的值= application.getInitParameter("context-param的键");

  得到这个context-param的值之后,你就可以做一些操作了。

  举例:你可能想在项目启动之前就打开数据库,那么这里就可以在<context-param>中设置数据库的连接方式(驱动、url、user、password),在监听类中初始化数据库的连接。这个监听是自己写的一个类,除了初始化方法,它还有销毁方法,用于关闭应用前释放资源。比如:说数据库连接的关闭,此时,调用contextDestroyed(ServletContextEvent args),关闭Web应用时,系统调用Listener的该方法。

  接着,容器会读取<filter></filter>,根据指定的类路径来实例化过滤器。过滤器在第一章中没有写,在此处补充如下:

    <!-- 编码过滤器 -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- Shiro的过滤器 -->
    <filter>
        <filter-name>shiroFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
        <init-param>
            <param-name>targetFilterLifecycle</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>shiroFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

  以上都是在WEB项目还没有完全启动起来的时候就已经完成了的工作。如果系统中有Servlet,则Servlet是在第一次发起请求的时候被实例化的,而且一般不会被容器销毁,它可以服务于多个用户的请求。所以,Servlet的初始化都要比上面提到的那几个要迟。总的来说,web.xml的加载顺序是: <context-param>-> <listener> -> <filter> -> <servlet>。其中,如果web.xml中出现了相同的元素,则按照在配置文件中出现的先后顺序来加载。


web.xml标签详解

  1.<web-app></web-app>

  <web-app></web-app>是部署描述的根元素,该元素含23个子元素。如果你用的是Servlet2.3,你会发现,子元素必须按照DTD文件描述中指定的顺序出现。比如:如果部署描述符中的<web-app>元素有<servlet>和<servlet-mapping>两个子元素,则<servlet>子元素必须出现在<servlet-mapping>子元素之前。在Servlet2.4中,顺序并不重要。

  2.<display-name></display-name> 

  <display-name></display-name>定义web应用的名称。

  3.<distributable/>

  <distributable/>可以使用distributable元素来告诉servlet/JSP容器,Web容器中部署的应用程序适合在分布式环境下运行。

  4.<context-param></context-param>

  <context-param>元素含有一对参数名和参数值,用作应用的Servlet上下文初始化参数,参数名在整个Web应用中必须是惟一的,在web应用的整个生命周期中上下文初始化参数都存在,任意的Servlet和jsp都可以随时随地访问它。<param-name>子元素包含有参数名,而<param-value>子元素包含的是参数值。作为选择,可用<description>子元素来描述参数。

  配置Spring,必须需要<listener>,而<context-param>可有可无,如果在web.xml中不写<context-param>配置信息,默认的路径是/WEB-INF/applicationContext.xml,在WEB-INF目录下创建的xml文件的名称必须是applicationContext.xml。如果是要自定义文件名可以在web.xml里加入contextConfigLocation这个context参数:在<param-value>里指定相应的xml文件名,如果有多个xml文件,可以写在一起并以“,”号分隔.  

  配置在同一个容器中的多个web项目,要配置不同的webAppRootKey,web.xml文件中最好定义webAppRootKey参数,如果不定义,将会缺省为“webapp.root”,为防止log4j配置冲突,每个项目配置不同的webAppRootKey。

  当然也不能重复,否则报类似下面的错误:

  Web app root system property already set to different value: 'webapp.root' = [/home/user/tomcat/webapps/project1/] instead of   [/home/user/tomcat/webapps/project2/] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files!

  5.<session-config></session-config>

  <session-config> 用于设置容器的session参数,比如:<session-timeout>用于指定http session的失效时间。默认时间设置(30minutes)。<session-timeout>用来指定默认的会话超时时间间隔,以分钟为单位。该元素值为整数。如果 session-timeout元素的值为零或负数,则表示会话将永远不会超时。

  6.<filter></filter>见我的博客,这里不在阐述。

  7.<listener></listener>见我的博客,这里不在阐述。

  8.<servlet></servlet>

  8.1.Servlet介绍

  Servlet通常称为服务端小程序,是服务端的程序,用于处理及响应客户的请求。Servlet是一个特殊的Java类,创建Servlet类自动继承HttpServlet。客户端通常只有GET和POST两种请求方式,Servlet为了响应这两种请求,必须重写doGet()和doPost()方法。大部分时候,Servlet对于所有的请求响应都是完全一样的,此时只需要重写service()方法即可响应客户端的所有请求。另外HttpServlet有两个方法:

  init(ServletConfig config):创建Servlet实例时,调用该方法初始化Servlet资源。

  destory():销毁Servlet实例时,自动调用该方法回收资源。

  通常无需重写init()和destory()两个方法,除非需要在初始化Servlet时,完成某些资源初始化的方法,才考虑重写init()方法。如果重写了init()方法,应该在重写该方法的第一行调用super.init(config),该方法将调用HttpServlet的init()方法。如果需要在销毁Servlet之前,先完先完成某些资源的回收,比如关闭数据库链接,才需要重写destory()方法。

  8.2.Servlet的生命周期

  创建Servlet实例有两个时机:

  客户端第一次请求某个Servlet时,系统创建该Servlet的实例,大部分Servlet都是这种Servlet;

  web应用启动时立即创建Servlet实例,即<load-on-start>1</laod-on-start>

  每个Servlet的运行都遵循如下生命周期:

  (1)创建Servlet实例。

  (2)Web容器调用Servlet的init()方法,对Servlet进行初始化。

  (3)Servlet初始化之后,将一直存在与容器之中,用于响应客户端请求,如果客户端发送GET请求,容器调用Servlet的doGet()方法处理并响应请求;如果客户端发送POST请求,容器调用Servlet的doPost()方法处理并响应请求。或者统一使用service()方法处理来响应用户请求。

  (4)Web容器决定销毁Servlet时,先调用Servlet的destory()方法,通常在关闭Web应用时销毁Servlet实例。

  8.3.Servlet的配置

  为了让Servlet能响应用户请求,还必须将Servlet配置在web应用中,配置Servlet需要修改web.xml文件。从Servlet3.0开始,配置Servlet有两种方式:

  (1)在Servlet类中使用基于注解的方式进行配置:@WebServlet

  (2)在web.xml文件中进行配置。

  我们用web.xml文件来配置Servlet,需要配置<servlet>和<servlet-mapping>。<servlet>用来声明一个Servlet。<icon>、<display-name>和<description>元素的用法和<filter>的用法相同。<init-param>元素与<context-param>元素具有相同的元素描述符,可以使用<init-param>子元素将初始化参数名和参数值传递给Servlet,访问Servlet配置参数通过ServletConfig对象来完成,ServletConfig提供如下方法:

  java.lang.String.getInitParameter(java.lang.String name):用于获取初始化参数

  ServletConfig获取配置参数的方法和ServletContext获取配置参数的方法完全一样,只是ServletContex是取得当前Servlet的配置参数,而ServletContext是获取整个web应用的配置参数。

  8.4.配置Spring MVC的Servlet

  配置Spring MVC,指定处理请求的Servlet,有两种方式:

  (1)默认查找MVC配置文件的地址是:/WEB-INF/${servletName}-servlet.xml。

  (2)可以通过修改配置文件的位置,需要在配置DispatcherServlet时指定MVC配置文件的位置。

  8.5.classpath与classpath*区别

  同名资源存在时,classpath只从第一个符合条件的classpath中加载资源,而classpath*会从所有的classpath中加载符合条件的资源。classpath*,需要遍历所有的classpath,效率肯定比不上classpath,因此在项目设计的初期就尽量规划好资源文件所在的路径,避免使用classpath*来加载。

  8.6.ContextLoaderListener和DispatcherServlet初始化上下文关系和区别

  从上图可以看出,ContextLoaderListener初始化的上下文加载的Bean是对于整个应用程序共享的,一般如:DAO层、Service层Bean;DispatcherServlet初始化的上下文加载的Bean是只对Spring MVC有效的Bean,如:Controller、HandlerMapping、HandlerAdapter等,该初始化上下文只加载Web相关组件。

  注意:用户可以配置多个DispatcherServlet来分别处理不同的url请求,每个DispatcherServlet上下文都对应一个自己的子Spring容器,他们都拥有相同的父Spring容器(业务层,持久(dao)bean所在的容器)。

  9.<welcome-file-list></welcome-file-list>

  <welcome-file-list>包含一个子元素<welcome-file>,<welcome-file>用来指定首页文件名称。<welcome-file-list>元素可以包含一个或多个<welcome-file>子元素。如果在第一个<welcome-file>元素中没有找到指定的文件,Web容器就会尝试显示第二个,以此类推。

Spring框架学习笔记07:基于XML配置方式使用Spring MVC 文章目录一、Spring MVC概述1、MVC设计模式2、Spring MVC3、使用Spring MVC的两种方式二、基于XML配置与注解的方式使用Spring MVC1、打开项目【SpringDemo2020】2、在pom.xml文件里添加相关依赖3、给项目添加Web功能4、创建三个页面(1)登录页面login.jsp(2)登录成功页面success.jsp(3)登录失败页面failure.jsp5、创建登录控制器 - LoginController6、创建Spring配置文件 - spring-con 阅读详情

相关推荐

Spring Web MVC (Spring MVC) 的相关例题及解析

MVC、web MVC、Spring MVC 和 Spring Web MVC的联系与区别: 1.MVC 是一种架构分层模式 2.web MVC 是指在 web 领域下实践的 MVC,因为 web 领域的视图层跟 native 应用的视图层不太能划等号 3.Spring MVC 和 Spring Web MVC 是同一个东西,就是 Spring Framework 里的一个模块。在 Spring Framework 介绍页面 写的是 Spring MVC,然而点进去后具体的描述页面 使用 Spring We

努力是为了站在万人之中,成为别人的光 3万+

Web.xml文件详解

1.Web.xml作用 Web.xml是JavaWeb项目中的一个配置文件,主要用于配置首页、Filter、Listener、Servlet等。 tomcat在部署启动web应用时,会解析加载${CATALINA_HOME}/conf目录下所有web应用通用的web.xml,然后解析加载web应用目录中的WEB-INF/web.xml。如果没有WEB-INF/web.xml文件,tomcat会输出找不到的消息,但仍然会部署并使用web应用程序,因此,这个web.xml并不是必要的,不过通常最好还是让每一.

顺其自然~专栏 3万+

Spring MVC和iBatis结合的Web应用程序示例:webspring-mvc

Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架。它为开发灵活且松耦合的Web应用程序提供了一种模型-视图-控制器(MVC)架构。Spring MVC框架不仅关注于MVC架构模式的实现,同时兼容其他Web开发框架,如Struts、JSF等。SQL映射框架简化了Java对象和数据库记录之间的映射关系,它允许开发者通过配置文件(XML或注解)来映射SQL语句,从而使数据库操作不依赖于特定的数据库接口(如JDBC)。

weixin_42584758的博客 1128

web.xml配置文件

一、web.xml是什么? 首先 web.xml 是java web 项目的一个重要的配置文件,但是web.xml文件并不是Java web工程必须的。 web.xml文件是用来配置:欢迎页、servlet、listener、filter等的。当你的web工程没用到这些时,你可以不用web.xml文件来配置你的web工程。 所在位置 项目名/web/WEB-INFO/web.xml,如下图所示: web.xml能做的事情: 其实,web.xml的模式(Schema)文件中定义了多少种标签元素,w

u013733643的博客 8108

解析web.xml中在Servlet中获取context-param和init-param内的参数

本篇文章是对web.xml中在Servlet中获取context-param和init-param内的参数进行了详细的分析介绍,需要的朋友参考下

新手必看!Cisco Packet Tracer 8.2从安装到完成第一个局域网实验(附常见问题解决)

本文为网络新手提供了Cisco Packet Tracer 8.2的完整入门指南。从官方下载安装、界面熟悉,到核心的拖拽设备、连线、配置IP地址三步操作,手把手教你完成第一个局域网组网实验。文章重点讲解了如何通过Ping命令验证连通性,并附带了连线错误、IP配置不当等常见问题的解决思路,帮助初学者快速上手这款强大的思科模拟器。

android的专栏 867

JavaWeb web.xml配置详解

=""=""=""=""

Record_Algorithm 2万+

5分钟快速验证lvgl界面:VScode模拟器极简配置法(免环境变量版)

本文介绍了一种5分钟快速验证LVGL界面的极简配置方法,使用VSCode模拟器免环境变量配置,适合UI设计师和产品经理快速预览界面效果。通过预编译的SDL2库和配置好的VSCode工程模板,实现开箱即用的LVGL界面验证,大幅提升工作效率。

weixin_30790841的博客 314

web.xml文件详解

前言:一般的web工程中都会用到web.xml,web.xml主要用来配置,可以方便的开发web工程。web.xml主要用来配置Filter、Listener、Servlet等。但是要说明的是web.xml并不是必须的,一个web工程可以没有web.xml文件。 1、WEB工程加载web.xml过程   经过个人测试,WEB工程加载顺序与元素节点在文件中的配置顺序无关。即不会因为 filter 写在 listener 的前面而会先加载 filter。WEB容器的加载顺序是:Servlet...

as619649246的博客 4611

Ansys Electronics Desktop仿真——HFSS线圈寄生电阻,电感

Ansys Electronics Desktop仿真——HFSS线圈寄生电阻,电感

冲击10w 1万+

AI 与新媒体

AI重构新媒体生态:从生产到分发的全链路变革 AI正成为新媒体领域的核心基础设施,通过五大能力重塑内容产业:自动化生产(AIGC写作/制图/剪辑效率提升5-10倍)、智能分发(算法精准匹配用户)、数据洞察(实时舆情分析)、风险管控(审核效率提升12倍)和运营优化(A/B测试自动化)。这推动行业从"人找内容"转向"内容找人",制作成本下降90%的同时,也带来同质化加剧、版权争议和职业重构等挑战。当前阶段,人机协同成为主流——AI处理标准化生产,人类专注创意与价值观把控。

eastyuxiao的专栏 380

Spring MVC的web.xml配置详解

Spring MVC的web.xml配置详解SpringMVC是创建java web项目时比较常用的框架,其中web.xml配置文件是更不可少的,那么首先先了解java web中的web.xml文件。一、认识web.xml文件1、web.xml的作用 首先java web项目中的并不是必须需要web.xml文件的。其次它主要的是用来配置欢迎页、servlet、filter、listener等以及定

J.Jian博客 1万+

Fluent验证案例03:管道中湍流流动压降计算——采用kw-sst模型计算压降更为准确。

阅读(4053) 评论(0)本案例利用Fluent计算管道中湍流流动压降。

qq_15963745的博客 876

springMVC web.xml 中配置加载顺序

在这里就不详细说web.xml的文件中的具体配置,就简单说明一下其中配置信息的加载顺序: 在web.xml文件中元素的加载顺序与它们在 web.xml 文件中的先后顺序无关。加载的顺序是:context-param->listener -> filter -> servlet   context-param,它用于向 ServletContext 提供键值对,即应用程序上下文信息。我们的

bug_404的博客 3848

【WorkBuddy专栏53】我的WB为什么变聪明了——SOUL与USER配置管理实战(上)

【WorkBuddy专栏53】我的WB为什么变聪明了——SOUL与USER配置管理实战(上)

AI人人懂 244

使用C#和ASP.NET创建登录页面

在Visual Studio中,右键单击项目,选择"添加",然后选择"新建项"。在对话框中选择"Web",然后选择"Web 窗体"。在Visual Studio中,右键单击项目,选择"添加",然后选择"新建项"。在Visual Studio中,选择"新建项目",然后选择"ASP.NET Web应用程序"。在上面的代码中,我们创建了一个简单的用户界面,包含一个用户名输入框、一个密码输入框和一个登录按钮。在上面的代码中,我们创建了一个简单的用户界面,包含一个用户名输入框、一个密码输入框和一个登录按钮。

TzData的博客 763

spring mvc 中web.xml配置信息解释

在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰。         首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关。即不会因为 filter 写在 listener 的前面而会先加载 filter。最终得出的结论是:listener -

专注于互联网架构技术,努力成为一名架构师 2891

一文搞懂YOLO各版本差异:v5易用、v8多任务、v10低延迟,该怎么选?

YOLOv5的“易用”是为了降低入门门槛,适合新手启蒙和旧项目维护;YOLOv8的“多任务”是为了满足工业需求,成为目前的主流版本;YOLOv10的“低延迟”是为了适配边缘计算,代表未来的发展趋势。选型的核心不是“选最新的”,而是“选最适合自己场景的”。记住选型口诀,按场景对号入座,就能避开99%的坑。希望这篇文章能帮你彻底搞懂各版本差异,选对属于自己的YOLO版本!

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1169

Spring MVC的web.xml配置

web.xml配置

weixin_46119670的博客 4587

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java web.xml中加载顺序

web.xml中加载顺序是context-param -> listener -> filter -> servlet 并不因在web.xml中配置顺序而改变 以自己的项目tdsTest为例 1. 首先读取web.xml中设置,根据 name为contextConfigLocation取相应的值,如  classpath:application.xml 2. 获取appli

kielin的专栏 554

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

spring spring mvc 加载顺序

web.xml里 listener加载顺序优先于servlet , 相同的servlet如果load-on-startup的值越小,加载优先级越高 。如果你的spring mvc配置文件在WEB-INF下面且名字是XXX-servlet就可以不用配置在web.xml里,否则就要 contextConfigLocation classpath*

qq_29446453的博客 833

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Spring MVC:使用Java配置类的方式来替代web.xml文件

了解通过Java配置类的方式来配置Spring MVC的方式是非常重要,因为这是Spring官方的推荐,同时了解其原理,更能了解Springboot是如何帮助我们自动配置的。

Hicodden的博客 1994

Spring Web MVC框架(八) 配置Spring Web MVC

这一篇文章对应于Spring参考文档 Configuring Spring MVC,讲的是Spring Web MVC各部分的配置方法,包括Java代码配置和XML文件配置以及MVC命名空间的使用方法。启用MVC Java配置和XML命名空间默认配置要启用MVC Java配置(@Controller等各种注解)和XML命名空间,如果使用的是Java配置,在配置类上再添加@EnableWebMvc注解

乐百川 4773

Spring MVC配置

Spring MVC(Model-View-Controller)是 Spring 框架中专门处理 Web 层的模块。作为一款功能强大的 Web 框架,它遵循 MVC 模式,将应用的各个部分分离开来。具体来说,Spring MVC 是一个前端控制器(DispatcherServlet),用于接收用户请求,并根据不同的请求,分发到具体的 Controller。然 Controller 处理请求逻辑并返回数据,最后将结果交给 ViewResolver 解析为具体的视图。

m0_75260099的博客 1595

基于spring3.0的采用XML配置的spring MVC项目

Spring MVC 框架 Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还可以是 Struts 这样的 Web 框架。通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iTex

jzhf2012的专栏 9658

Spring总结之Web MVC

MVC是Web开发的一种流行架构思想,为了改正以前代码逻辑视图混乱不堪的状况而总结出来的一种模式。在最早是受到观察者模式的启发(观察者模式类似于Java Swing里的ActionListener)。记得大三还在学校自己泡图书馆的时候Struts是很风靡的MVC框架,也可以说是流行起来的第一个比较标准的MVC实现。在Spring推出之后,Spring自己也提供了一套MVC框架,在工作和学习中二

Ant Ren的专栏 1960
上一篇: Spring MVC 笔记(一)
下一篇: iOS输入表情后系统异常
wangl157
博客等级 码龄19年 12粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值