Servlet第二篇【Servlet细节、ServletConfig、ServletContext】(修订版)

ServletConfig和ServletContext对象 ServletContext 是针对整个web 应用而言的,在web 应用启动时被容器创建,用来存储应用级别的信息,例如应用名称、上下文路径等。ServletContext不像ServletConfig接口在Servlet标签里配置,而是针对于整个应用的配置,也叫全局的初始化参数;ServletContext是javax.servlet包下的一个接口,又称上下文对象,是配置对象也是一个域对象;ServletContext是javax.servlet包下的一个接口,又称上下文对象,是配置对象也是一个域对象; 阅读详情

前言

只有光头才能变强。

文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y

Servlet的调用图

前面我们已经学过了Servlet的生命周期了,我们根据Servlet的生命周期画出Servlet的调用图加深理解

640?wx_fmt=png

Servlet的细节

一个已经注册的Servlet可以被多次映射

同一个Servlet可以被映射到多个URL上。

        <servlet>	
            <servlet-name>Demo1</servlet-name>	
            <servlet-class>zhongfucheng.web.Demo1</servlet-class>	
        </servlet>	
        <servlet-mapping>	
            <servlet-name>Demo1</servlet-name>	
            <url-pattern>/Demo1</url-pattern>	
        </servlet-mapping>	
        <servlet-mapping>	
            <servlet-name>Demo1</servlet-name>	
            <url-pattern>/ouzicheng</url-pattern>	
        </servlet-mapping>

无论我访问的是http://localhost:8080/Demo1还是http://localhost:8080/ouzicheng。我访问的都是Demo1。

640?wx_fmt=png

640?wx_fmt=png

Servlet映射的URL可以使用通配符

通配符有两种格式:

  1. *.扩展名

  2. 正斜杠(/)开头并以“/*”结尾。

匹配所有

640?wx_fmt=png

匹配扩展名为.jsp的

640?wx_fmt=png

如果.扩展名和正斜杠(/)开头并以“/”结尾两种通配符同时出现,匹配的是哪一个呢?

  1. 看谁的匹配度高,谁就被选择

  2. *.扩展名的优先级最低

Servlet映射的URL可以使用通配符和Servlet可以被映射到多个URL上的作用:

  1. 隐藏网站是用什么编程语言写的【.php,.net,.asp实际上访问的都是同一个资源】

  2. 用特定的后缀声明版权【公司缩写】

         <servlet>	
            <servlet-name>Demo1</servlet-name>	
            <servlet-class>zhongfucheng.web.Demo1</servlet-class>	
        </servlet>	
        <servlet-mapping>	
            <servlet-name>Demo1</servlet-name>	
            <url-pattern>*.jsp</url-pattern>	
        </servlet-mapping>	
        <servlet-mapping>	
            <servlet-name>Demo1</servlet-name>	
            <url-pattern>*.net</url-pattern>	
        </servlet-mapping>	
        <servlet-mapping>	
            <servlet-name>Demo1</servlet-name>	
            <url-pattern>*.asp</url-pattern>	
        </servlet-mapping>	
        <servlet-mapping>	
            <servlet-name>Demo1</servlet-name>	
            <url-pattern>*.php</url-pattern>	
        </servlet-mapping>

Servlet是单例的

为什么Servlet是单例的

浏览器多次对Servlet的请求,一般情况下,服务器只创建一个Servlet对象,也就是说,Servlet对象一旦创建了,就会驻留在内存中,为后续的请求做服务,直到服务器关闭。

每次访问请求对象和响应对象都是新的

对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。

线程安全问题

当多个用户访问Servlet的时候,服务器会为每个用户创建一个线程。当多个用户并发访问Servlet共享资源的时候就会出现线程安全问题。

原则:

  1. 如果一个变量需要多个用户共享,则应当在访问该变量的时候,加同步机制synchronized (对象){}

  2. 如果一个变量不需要共享,则直接在 doGet() 或者 doPost()定义.这样不会存在线程安全问题


load-on-startup

如果在元素中配置了一个元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。

640?wx_fmt=png

640?wx_fmt=png

作用:

  1. 为web应用写一个InitServlet,这个servlet配置为启动时装载,为整个web应用创建必要的数据库表和数据

  2. 完成一些定时的任务【定时写日志,定时备份数据】


在web访问任何资源都是在访问Servlet

当你启动Tomcat,你在网址上输入http://localhost:8080。为什么会出现Tomcat小猫的页面?

这是由缺省Servlet为你服务的!

  • 我们先看一下web.xml文件中的配置,web.xml文件配置了一个缺省Servlet

    <servlet>	
        <servlet-name>default</servlet-name>	
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>	
        <init-param>	
            <param-name>debug</param-name>	
            <param-value>0</param-value>	
        </init-param>	
        <init-param>	
            <param-name>listings</param-name>	
            <param-value>false</param-value>	
        </init-param>	
        <load-on-startup>1</load-on-startup>	
    </servlet>	
    <servlet-mapping>	
        <servlet-name>default</servlet-name>	
        <url-pattern>/</url-pattern>	
    </servlet-mapping>
  • 什么叫做缺省Servlet?凡是在web.xml文件中找不到匹配的元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求

  • 既然我说了在web访问任何资源都是在访问Servlet,那么我访问静态资源【本地图片,本地HTML文件】也是在访问这个缺省Servlet【DefaultServlet】

  • 证实一下:当我没有手工配置缺省Servlet的时候,访问本地图片是可以访问得到的

640?wx_fmt=png

  • 现在我自己配置一个缺省Servlet,Demo1就是我手工配置的缺省Servlet,覆盖掉web.xml配置的缺省Servlet

    <servlet>	
        <servlet-name>Demo1</servlet-name>	
        <servlet-class>zhongfucheng.web.Demo1</servlet-class>	
    </servlet>	
    <servlet-mapping>	
        <servlet-name>Demo1</servlet-name>	
        <url-pattern>/</url-pattern>	
    </servlet-mapping>
  • 下面我继续访问一下刚才的图片,此时输出的是Demo1这个Servlet写上的内容了

640?wx_fmt=png

  • 总结:无论在web中访问什么资源【包括JSP】,都是在访问Servlet。没有手工配置缺省Servlet的时候,你访问静态图片,静态网页,缺省Servlet会在你web站点中寻找该图片或网页,如果有就返回给浏览器,没有就报404错误


ServletConfig对象

ServletConfig对象有什么用?

通过此对象可以读取web.xml中配置的初始化参数。

现在问题来了,为什么我们要把参数信息放到web.xml文件中呢?我们可以直接在程序中都可以定义参数信息,搞到web.xml文件中又有什么好处呢?

好处就是:能够让你的程序更加灵活【更换需求,更改配置文件web.xml即可,程序代码不用改】

获取web.xml文件配置的参数信息

  • 为Demo1这个Servlet配置一个参数,参数名是name,值是zhongfucheng

    <servlet>	
        <servlet-name>Demo1</servlet-name>	
        <servlet-class>zhongfucheng.web.Demo1</servlet-class>	
        <init-param>	
            <param-name>name</param-name>	
            <param-value>zhongfucheng</param-value>	
        </init-param>	
    </servlet>	
    <servlet-mapping>	
        <servlet-name>Demo1</servlet-name>	
        <url-pattern>/Demo1</url-pattern>	
    </servlet-mapping>
  • 在Servlet中获取ServletConfig对象,通过ServletConfig对象获取在web.xml文件配置的参数 640?wx_fmt=png


ServletContext对象

什么是ServletContext对象?

当Tomcat启动的时候,就会创建一个ServletContext对象。它代表着当前web站点

ServletContext有什么用?

  1. ServletContext既然代表着当前web站点,那么所有Servlet都共享着一个ServletContext对象,所以Servlet之间可以通过ServletContext实现通讯。

  2. ServletConfig获取的是配置的是单个Servlet的参数信息,ServletContext可以获取的是配置整个web站点的参数信息

  3. 利用ServletContext读取web站点的资源文件

  4. 实现Servlet的转发【用ServletContext转发不多,主要用request转发】

Servlet之间实现通讯

ServletContext对象可以被称之为域对象

到这里可能有一个疑问,域对象是什么呢?其实域对象可以简单理解成一个容器【类似于Map集合】

实现Servlet之间通讯就要用到ServletContext的setAttribute(String name,Object obj)方法, 第一个参数是关键字,第二个参数是你要存储的对象

  • 这是Demo2的代码

        //获取到ServletContext对象	
        ServletContext servletContext = this.getServletContext();	
        String value = "zhongfucheng";	
        //MyName作为关键字,value作为值存进   域对象【类型于Map集合】	
        servletContext.setAttribute("MyName", value);
  • 这是Demo3的代码

        //获取ServletContext对象	
        ServletContext servletContext = this.getServletContext();	
        //通过关键字获取存储在域对象的值	
        String value = (String) servletContext.getAttribute("MyName");	
        System.out.println(value);
  • 访问Demo3可以获取Demo2存储的信息,从而实现多个Servlet之间通讯

640?wx_fmt=png


获取web站点配置的信息

如果我想要让所有的Servlet都能够获取到连接数据库的信息,不可能在web.xml文件中每个Servlet中都配置一下,这样代码量太大了!并且会显得非常啰嗦冗余。

  • web.xml文件支持对整个站点进行配置参数信息【所有Servlet都可以取到该参数信息】

    <context-param>	
        <param-name>name</param-name>	
        <param-value>zhongfucheng</param-value>	
    </context-param>
  • Demo4代码

        //获取到ServletContext对象	
        ServletContext servletContext = this.getServletContext();	
        //通过名称获取值	
        String value = servletContext.getInitParameter("name");	
        System.out.println(value);

640?wx_fmt=png

  • 试一下Demo3是否能拿到,相同的代码

        //获取到ServletContext对象	
        ServletContext servletContext = this.getServletContext();	
        //通过名称获取值	
        String value = servletContext.getInitParameter("name");	
        System.out.println(value);

640?wx_fmt=png


读取资源文件

第一种方式:

  • 现在我要通过Servlet111读取1.png图片

640?wx_fmt=png

  • 按我们以前的方式,代码应该是这样的。

        FileInputStream fileInputStream = new FileInputStream("1.png");	
        System.out.println(fileInputStream);
  • 当我们访问的时候,却出错了!说找不到1.png文件

640?wx_fmt=png

  • 这是为什么呢?我们以前读取文件的时候,如果程序和文件在同一包名,可以直接通过文件名称获取得到的!,原因很简单,以前我们写的程序都是通过JVM来运行的,而现在,我们是通过Tomcat来运行的

  • 根据web的目录规范,Servlet编译后的class文件是存放在WEB-INF\classes文件夹中的

640?wx_fmt=png

  • 看到这里,我们知道了要进入classes目录中读取文件,所以我们将代码改成以下方式

        FileInputStream fileInputStream = new FileInputStream("D:\\zhongfucheng\\web\\WEB-INF\\classes\\zhongfucheng\\web\\1.png");	
        System.out.println(fileInputStream);
  • 再去读取时,就发现可以获取到文件了。

  • 但是现在问题又来了,我读取文件的时候都要写上绝对路径,这样太不灵活了。试想一下,如果我将该读取文件的模块移到其他的web站点上,我的代码就又要修改了【因为web站点的名字不一样】。

  • 我们通过ServletContext读取就可以避免修改代码的情况,因为ServletContext对象是根据当前web站点而生成的

  • 代码如下所示:

        //获取到ServletContext对象	
        ServletContext servletContext = this.getServletContext();	
        //调用ServletContext方法获取到读取文件的流	
        InputStream inputStream = servletContext.getResourceAsStream("/WEB-INF/classes/zhongfucheng/web/1.png");

640?wx_fmt=png


第二种方式:

  • 如果我的文件放在web目录下,那么就简单得多了!,直接通过文件名称就能获取

640?wx_fmt=png

  • 代码如下所示

        //获取到ServletContext对象	
        ServletContext servletContext = this.getServletContext();	
        //调用ServletContext方法获取到读取文件的流	
        InputStream inputStream = servletContext.getResourceAsStream("2.png");

640?wx_fmt=png


第三种方式:

通过类装载器读取资源文件。

  • 我的文件放在了src目录下【也叫做类目录】

640?wx_fmt=png

  • 代码如下所示

        //获取到类装载器	
        ClassLoader classLoader = Servlet111.class.getClassLoader();	
        //通过类装载器获取到读取文件流	
        InputStream inputStream = classLoader.getResourceAsStream("3.png");

640?wx_fmt=png

  • 我的文件放在了src目录下的包下

640?wx_fmt=png

  • 代码如下,添加包名路径即可。

        //获取到类装载器	
        ClassLoader classLoader = Servlet111.class.getClassLoader();	
        //通过类装载器获取到读取文件流	
        InputStream inputStream = classLoader.getResourceAsStream("/zhongfucheng/web/1.png");

原则:如果文件太大,就不能用类装载器的方式去读取,会导致内存溢出


最后

乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,不妨来关注一下!

640?wx_fmt=jpeg

有帮助?好看!转发!640
西安交通大学SQ轴承数据集(文末附数据) 西安交通大学SQ轴承数据集 阅读详情

相关推荐

基于MATLAB对地下水水位的数据处理

本文借用Matlab强大的计算功能和绘图功能,对某阿拉干监测数据进行曲线拟合,得到拟合函数。再利用GM(1.1)时间序列模型构建地下深埋的预测模型,进而对阿拉干 2021,四个位置H1,H2,H3,H4年度各监测井平均深埋位置变化进行分析。

keykangkang1001的博客 1244

Servlet+Ajax+Echarts实现饼图动态数据可视化

在这追求美的时代,页面数据可视化可谓是一个很好的例子,它不仅可以带来用户更直观、更方便的认识,还能把冷冰冰的数据以一种美感活灵活现的表现出来。今天我想和大家聊聊如果用Ajax、百度的Echarts来实现一个简单的饼图动态数据可视化。

weixin_42572590的博客 2221

MDM主数据清洗和编码集成说明

绝大多数的企业业务系统是伴随业务发展而建设的,但随着业务发展单一系统难以支撑企业业务闭环。MDM主数据管理平台可以满足企业数据治理的需求,本文针对主数据清洗和编码集成进行梳理。...

数通畅联 3319

前端与Servlet交互 详解

浏览器不让从一个域名的网页去请求另一个域名网页的资源,这是浏览器的同源策略造成的, 是javaScript加的安全限制跨域的定义是: 只要协议 域名 端口 有任何一个不同 就是跨域 为什么要限制跨域访问万一是另外一个恶意网站响应的数据,会导致服务器出问题 为什么要跨域公司的不同子域需要相互调用资源时后端解决跨域后端可以实现过滤器接口,告诉浏览器此次的访问是安全的location.assign 并不会出现跨域问题, 他会重新开一个窗口,跟原服务器没关系如下图。

weixin_69252724的博客 3970

告别MATLAB!用Python的PYPOWER搞定电力系统潮流计算(附Case30完整代码)

本文介绍了如何从MATLAB迁移到Python,使用PYPOWER工具包进行电力系统潮流计算。通过详细的环境准备、数据接口兼容性实践、潮流计算实现及最优潮流计算进阶,帮助工程师和学生无缝过渡到Python生态。文章还展示了结果处理与可视化技巧,并附有Case30完整代码示例。

weixin_30411819的博客 299

深入解析STM32F103R6的USB OTG_FS双重角色设备(DRD)设计与应用

本文深入解析了STM32F103R6的USB OTG_FS双重角色设备(DRD)设计与应用。详细阐述了其作为USB主机和设备双重角色的硬件设计要点,包括VBUS电源管理与ID引脚配置,并提供了设备模式(如虚拟串口CDC)与主机模式(如读取U盘文件)的软件实现实战指南,帮助开发者充分发挥该芯片的OTG潜力。

weixin_29195615的博客 265

Servlet第二篇【Servlet调用图、Servlet细节、ServletConfig、ServletContext】

Servlet的调用图 前面我们已经学过了Servlet的生命周期了,我们根据Servlet的生命周期画出Servlet的调用图加深理解 Servlet的细节 一个已经注册的Servlet可以被多次映射 同一个Servlet可以被映射到多个URL上。 &lt;servlet&gt; &lt;servlet-name&gt;Dem...

3y 436

Python程序—定子故障三相永磁同步电动机振动与电流数据集

1.0 kW 电机匝间短路故障数据: 正常匝间短路振动数据: 匝间短路故障,严重度为2.26%: 匝间短路故障,严重度为2.70%: 匝间短路故障,严重度为3.35%: 匝间短路故障,严重度为4.41%: 匝间短路故障,严重度为6.48%: 匝间短路故障,严重度为12.17%: 匝间短路故障,严重度为21.69%1.5 kW 电机匝间短路故障数据: 正常匝间短路振动数据: 匝间短路故障,严重度为1.57%: 匝间短路故障,严重度为1.88%: 匝间短路故障,严重度为2.34%

m0_66465741的博客 1320

Servlet超详解+流程图

1.servlet处理用户请求的完整流程 针对Servlet的每次请求,Web 服务器在调用 service() 方法之前,都会创建 HttpServletRequest 和 HttpServletResponse 对象。其中,HttpServletRequest 对象用于封装 HTTP 请求消息,简称 request 对象。HttpServletResponse 对象用于封装 HTTP 响应消息,简称 response 对象。浏览器访问 Servlet 的交互过程如图 1 所示。 图 1浏览器..

代码是程序员的语言,博客是思想的桥梁,连接你我,共享智慧之光。 9213

XGBoost详解(原理篇)

XGBoost全称为eXtreme Gradient Boosting,即极致梯度提升树。XGBoost是Boosting算法的其中一种,Boosting算法的思想是将许多弱分类器集成在一起,形成一个强分类器(个体学习器间存在强依赖关系,必须串行生成的序列化方法)。Note:关于Boosting算法详见博文集成学习详解_tt丫的博客-优快云博客XGBoost是一种提升树模型,即它将许多树模型集成在一起,形成一个很强的分类器。其中所用到的树模型则是CART回归树模型。

tt丫的博客 7万+

全志F1C200S嵌入式驱动开发(lcd屏幕驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 lcd RGB屏幕作为比较经济、实用的显示工具,在实际场景中使用较多。它的信号来说,一般也比较简单,除了常规的数据信号,剩下来就是行同步、场同步、数据使能和时钟信号了。数据信号方面,常见的格式有RGB888、RGB666、RGB565。为什么有什么多选择,主要还是取决于soc pin脚的多少来定。当然,pin脚越多,显示的颜色就越精准,还原度就越高。 举例来说,假设

嵌入式-老费,一个分享专业嵌入式知识的blog 2794

servlet返回数据_Servlet(九)

Servlet之间的跳转Servlet之间可以实现跳转,从一个Servlet跳到另一个Servlet,利用Servlet的跳转技术可以很方便的把一块业务模块分开,比如使用后一个Servlet接收用户提交数据,使用另一个Servlet读取数据库,最后跳转到另一个Servlet把处理结果显示出来。这也就是MVC模式(model、view、controller)MVC:用一种业务逻辑、数据、界面显示分离...

weixin_39541189的博客 623

109. SAP ABAP 应用程序中的锁机制和工作原理介绍

SAP ABAP 系统中的锁概念,是 SAP ABAP 为了保证`数据一致性`而引入的一种保护机制。 像 SAP 这种复杂的企业级应用,系统中同一时间段的同一份数据,可能会有多个 Transaction(终端用户或者 API )同时进行读写操作。为了防止出现数据不一致,SAP ABAP 引入了锁机制。 这种锁机制并非数据库服务器层面的锁,而是在 SAP ABAP 应用服务器层面上工作,加锁和解锁都由专门的 ABAP Function Module 来完成。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1468

servlet 返回可访问文件_Servlet第二篇【Servlet细节、ServletConfig、ServletContext】(修订版)...

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3yServlet的调用图前面我们已经学过了Servlet的生命周期了,我们根据Servlet的生命周期画出Servlet的调用图加深理解Servlet的细节一个已经注册的Servlet可以被多次映射同一个Servlet可以被映射到多个URL上。 ...

weixin_39997173的博客 85

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Servlet | ServletConfig接口、ServletContext接口详解

Servlet | ServletConfig接口、ServletContext接口详解

m0_61933976的博客 2508

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ServletConfig与ServletContext详解

ServletContext 是 servlet 与 servlet 容器(如 Tomcat)之间直接通信的接口。在启动一个 Web 工程时,servlet 容器会为该工程创建一个唯一的 ServletContext 对象,即 servlet 的上下文环境。每个 Web 工程都有且仅有一个 ServletContext 对象。

hailuochaofan的博客 1199

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ServletConfig与ServletContext

ServletConfig与ServletContext

汤键的博客 1752

Servlet-04ServletConfig和ServletContext

是 Java Servlet 规范中的一个接口,它为 Servlet 提供了初始化信息。当 Servlet 容器(如 Tomcat)创建一个 Servlet 实例时,它会传递一个对象给 Servlet 的init方法。对象包含了 Servlet 配置信息,这些信息主要来自于 Web 应用的部署描述符(web.xml文件)。为Servlet提供初始配置参数的一种对象,每个Servlet都有自己独立唯一的ServletConfig对象。

2301_80295548的博客 1329

Servlet中的ServletConfig对象、ServletContext对象以及Servlet3.0

Servlet 1. ServletConfig对象 ServletConfig是javax.servlet.包下的一个接口,ServletConfig它是Servlet的一个配置对象; ServletConfig是由tomcat容器创建,通过init方法传入给Servlet; 作用: 获取Servlet的名称servlet-name标签内容,getServletName 获取Servlet的...

Willing卡卡的博客 3827

ServletConfig和ServletContext详解

ServletConfig和ServletConTextServletConfig一、ServletConfig概述二、ServletConfig常用方法 ServletConfig 一、ServletConfig概述 二、ServletConfig常用方法

weixin_49992390的博客 1498

JavaWeb 速通Servlet(ServletConfig和ServletContext)

JavaWeb——ServletConfig 和 ServletContext 内容分享。

优快云 / 稀土掘金/ B站 / GitHub: Cyan_RA9 1938

Servlet基础之ServletConfig与ServletContext接口详解

本文从源码上分了ServletConfig和ServletContext两个接口,ServletConfig是相对于每个Servlet实例的,根据web.xml中的配置或者@WebServlet注解来生成的;ServletContext是相对于web 应用的,在一个web应用(一个虚拟机中运行的一个web应用)中是全局唯一的,ServletContext中封装了许多功能强大的方法,其中比较重要的就是对资源文件的使用,通过Servlet容器可以方便的使用web应用中的资源,这也需要我们多练习,熟练掌握。

丹丹的后花园 2210
上一篇: Servlet第五篇【介绍会话技术、Cookie的API、详解、应用】(修订版)
下一篇: Java程序员的Spring学习指南!
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值