javaWeb项目之Servlet学习笔记----响应对象HttpServletResponse

JavaWeb开发(二)IDEA创建Java Web项目并部署及目录结构 (1)点击“Create New Project”按钮新建项目。(2)选择“ Java Enterprise”,勾选“Web Application”,然后点击“Next”按钮。(3)修改项目名称,然后点击“Finish”按钮。(4)项目创建完成。 阅读详情

https://www.cnblogs.com/fjdingsd/p/4847015.html

 

一个完整的http响应包括响应行,若干响应头和响应数据主体三部分构成。如果我们能用响应对象来进行这三部分的处理,就能向客户发送特定的响应数据包。

  先从HttpServletResponse对象的方法中可以看到有如下方法(部分):

  

  这只是一部分,但是我们却可以看出,通过响应对象的方法,我们就能设置响应客户端数据的一些信息。比如setStatus(int sc)方法,我们从HttpServletResponse的API中的字段定义可找到已经设置好的响应码(部分):

  

  我们通过setHeader或者addHeader就能对一些数据进行跟客户端的告知,比如我想让某个页面的数据在客户端保存一天,也就是如果客户端再向我请求的话,则它应该去缓存中获取,直到一天之后才能重新向我请求,那么我就必须使用到了“Expires”响应头,将这个响应头的值设为一天后的时间告诉给客户端:

  在MyEclipse中的【myservlet】web工程下,创建名为ServletDemo1的Servlet,代码如下:

public class ServletDemo1 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        long expiresTime = System.currentTimeMillis()+1*24*60*60*1000; //将缓存截止时间设置为一天后
        response.setDateHeader("expires", expiresTime);
        
    }
}

这时候用浏览器来访问这个Servlet(访问之前最好现将浏览器中的缓冲清除干净),访问之后我们再来看看这个缓存的页面文件:

  

右键查看其属性:

  

可以看到我们是在9月28日访问的这个文件,而服务器已经将这个文件的缓冲时间设置为了29日。

  注意:对于”Expires”响应头的设置必须使用setDateHeader方法,使用setHeader方法无效。

 

通过HttpServletResponse对象的父类ServletResponse对象的getOutputStream方法和getWriter方法可以获取向响应对象的数据实体中写入数据。这里如果传送的是英文数据一般都没有什么问题,而中文编码则是会令人头疼的。

getOutputStream

首先我们来看响应对象的getOutputStream方法,我们在一个Servlet程序中代码如下:

1     String data = "银魂";
2     OutputStream out = response.getOutputStream();
3     out.write(data.getBytes());

而在浏览器中访问这个Servlet,看到的是:

  

是的,没有出现乱码的问题,这主要有两点原因:

  一个是浏览器本身的解码方式是根据平台语言环境来设置的,我的操作系统是Windows的中文版本,因此浏览器的解码采用的编码表为“GB2312”:

  

 

  另一个原因是因为,在将字符串转为字节数组时,采用了getBytes()方法,这个方法在String类的API文档中明确说明了采用平台默认的字符集,根据我的系统这个方法也采用了“GB2312”编码表。

  因此服务器编码和客户端解码都采用同一编码表这就不会出现中文乱码问题。

 

  如果我在getBytes方法中采用UTF-8编码,那么结果自然会出错:

1     String data = "银魂";
2     OutputStream out = response.getOutputStream();
3     out.write(data.getBytes("UTF-8"));

  

除非你也在浏览器中更改编码方式,改成UTF-8就可以重新看到正确的中文数据了:

  

  

当然这肯定不适合给用户这么操作,毕竟不是谁都懂浏览器的编码。

  如果我们一定要将中文数据采用“UTF-8”的方式(UTF-8有利于国际化),有这么两种解决采用UTF-8编码方式的中文乱码问题:

  第一种解决方式:使用HttpServletResponse响应对象的setHeader的方法,将“Content-type”这个响应头中设置编码方式,关于这个这个响应头请看之前的博客《HTTP协议的请求和响应学习》。同时,sun公司也提供了更便捷的代码语句setContentType给编程人员使用。

  在Servlet中的代码:

1   response.setHeader("content-type", "text/html;charset=UTF-8");
2   //response.setContentType("text/html;charset=UTF-8");   //这句功能同上一句
3     String data = "银魂";
4     OutputStream out = response.getOutputStream();
5     out.write(data.getBytes("UTF-8"));

这样在浏览器中可以看到正确的中文数据,并且浏览器自动将编码方式采用UTF-8:

  

附带从HttpWatch中观察到的数据包:

  

注意:如果response.setHeader("content-type", "text/html;charset=UTF-8");中将"text/html;charset=UTF-8"中的分号“;”写成了逗号“,”就会变成下载该Servlet文件。

  所以书写要注意。

  第二种解决方式:我们不直接在响应对象中设置“Content-type”这个响应头,而是通过HTML的<meta>标签,该标签的作用就是模拟一个响应头,这样在回传的响应对象中,某些响应头就不会被设置,但是还是有这个响应头的功能,例如我们在HTML页面中经常能见到的<meta http-equiv="content-type" content="text/html;charset=utf-8">这个标签,是不是和第一种方式很像。相关代码为:

1     String data = "银魂";
2     OutputStream out = response.getOutputStream();
3     out.write("<meta http-equiv='content-type' content='text/html;charset=utf-8'>".getBytes());
4     out.write(data.getBytes("UTF-8"));

这时候在浏览器中同样能观察到正确的中文数据,同时可以看到浏览器已经自动采用“UTF-8”编码方式:

  

同时,在浏览器浏览源代码和观察HttpWatch窗口:

  

从上面可以看出,服务器发回的响应中没有“Content-type”这个响应头,但是在响应数据实体中有<meta>标签,浏览器能解析这个HTML语言,得到这个标签中设置的“Content-type”模拟响应头,因此能根据这个模拟响应头中的编码方式来设置浏览器应该采用的码表。

 

         如果我们用输出流直接输出数字的话,会是输出这个数字在编码表中代表的字符,如代码为:

 

1 public void doGet(HttpServletRequest request, HttpServletResponse response)
2             throws ServletException, IOException {
3         
4       response.getOutputStream().write(97);
5     }
6         

 

在浏览器中得到:a。

Writer对象

说完了从响应对象中得到OutputSteam对象,接着我们来讨论从响应对象中得到Writer对象,众所周知,字符流是由字节流加编码表组成,那么在响应对象中的字符流采用什么编码表方式呢?我们来看看HttpServletResponse对象的getWriter()方法的API手册说明:

  

从这里面看出如果没有为这个getWriter()方法设置编码表,那么则默认采用 “ISO-8859-1”编码表。或者采用响应对象的getCharacterEncoding()方法查看也可以。

 

  那么在服务器端如果要改变对封装数据的编码格式可以有两种方式:

  第一种:使用响应对象的setCharacterEncoding()方法来设置服务器采用的编码表,接着使用setContendType或者setHeader告知客户端服务器采用的编码表,后者在上面已经说过。

  示例代码:

 

 1 public class ServletResponse2 extends HttpServlet {
 2 
 3     public void doGet(HttpServletRequest request, HttpServletResponse response)
 4             throws ServletException, IOException {
 5         
 6         response.setCharacterEncoding("UTF-8");
 7         response.setContentType("text/html;charset=UTF-8");
 8         PrintWriter writer = response.getWriter();
 9         String data = "银魂";
10         writer.write(data);    
11     }
12 }

 

注意,光只有setCharacterEncoding()方法只能改变服务器端采用的编码表,而没能通知客户端,所以需要setContentType设置“Content-type”响应头,或者如之前所说的写入<meta>标签来模拟“Content-type”响应头。

 

  第二种:直接使用setContentType方法,通过这种方法,可以在服务器和客户端同时设置编码表,也就是第一种方式中两个方法的结合,因此上述示例的代码如下:

 

1 public void doGet(HttpServletRequest request, HttpServletResponse response)
2             throws ServletException, IOException {
3         response.setContentType("text/html;charset=UTF-8");
4         
5         PrintWriter writer = response.getWriter();
6         String data = "银魂";
7         writer.write(data);    
8 }
9 }

 

  以上分别从响应对象HttpServletResponse中根据获取的字节流或者字符流向客户端输出数据时会碰到的中文乱码问题做出了分析和解决。关于响应对象和请求对象能实现的更多方法和功能请在之后的篇章中说明。

 

下载文件

使用setHeader方法结合HTTP协议的content-disposition响应头可以将某些web资源以下载方式回传给客户端。但是在下载中文文件的时候会有一些问题,这问题会怎么发生呢?

  我们现在来进行从客户端向服务器端下载一个图片文件,先在MyEclipse的自创建【myservlet】web工程下准备一个图片文件,放置在web目录下的【download】文件夹中:

  

创建名为ServletResponse的Servlet,代码如下:

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //1,获取将要下载的文件路径和文件名
        ServletContext context = this.getServletContext();
        String filePath = context.getRealPath("/download/银魂全家福.jpg");
        String fileName = filePath.substring(filePath.lastIndexOf("\\")+1);
        
        //2,使用HTTP协议的Content-Disposition请求头告诉客户端以下载方式接受这个数据(文件)
        response.setHeader("content-disposition", "attachment;filename="+fileName);
        
        //3,通过流向响应对象写数据实体,然后由响应对象提交给客户端    
        FileInputStream fis = null;
        try{
            OutputStream out = response.getOutputStream();
            fis = new FileInputStream(filePath);
            byte[] buff = new byte[1024];
            int len = 0;
            while((len =fis.read(buff))>0) {
                out.write(buff, 0, len);
            }
        }
        finally {
            if(fis!=null) {
                fis.close();
            }
        }
    }

而这样,当在浏览器中访问该Servlet时就会出现下载请求的弹窗:

  

这里就有一个问题了,下载文件的名称不对,如果是英文文件名就不会出现这个问题,而中文文件名就必须通过URL编码:

将上述代码中的response.setHeader("content-disposition", "attachment;filename="+fileName);

改为:response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8")); 即可。

  我们重新发布该工程,然后再在浏览器中访问该Servlet,看到这回的下载弹窗:

  

这回就可以下载了,当我们下载后就可以看到确实是服务器上得资源:

  (真棒!)

所以中文文件下载方式要先通过URLEncoder进行编码后再写入相应对象中。

 

写入数据前要设置编码表

首先来看响应对象控制浏览器定时刷新,在我的web应用【myservlet】中创建Servlet,在该Servlet中设置响应头,定时刷新的代码很简单:

response.setHeader("refresh", "3 ");    //3秒刷新一次

就可告知浏览器3秒刷新一次网页。当然“Refresh”响应头还是可以定时跳转到指定页面,如下代码:

response.setHeader("refresh", "3;url='/myservlet/index.jsp'");

将会在访问我这个Servlet的3秒后访问我的【myservlet】web应用下的index.jsp资源。

 

  之前说过,使用<meta>标签可以模拟响应头,同样在这里可以使用Servlet向客户端写数据时将<meta>标签写入响应数据实体,由浏览器解析后再来控制:

1 String data = "银魂";
2 response.setContentType("text/html;charset=UTF-8");
3 response.getWriter().write("<meta http-equiv='refresh' content='3;url=/myservlet/index.jsp' >");
4 response.getWriter().write(data);

 

  这里请注意:在向响应对象写入任何数据之前,请先设置好使用的编码表,如果在写入数据之后再设置编码表则无效,例如下面代码:

1 String data = "银魂";
2 response.getWriter().write(data);
3 response.setContentType("text/html;charset=UTF-8");

通过查看HttpWathch可以知道,编码表并没有设置成功:

  

把设置编码表的代码放置在向响应对象写入数据也是不行的,如下:

1 String data = "银魂";
2 response.getWriter().write("<meta http-equiv='refresh' content='3;url=/myservlet/index.jsp' >");
3 response.setContentType("text/html;charset=UTF-8");
4 response.getWriter().write(data);

这样也会设置编码表无效,造成中文乱码问题,所以在向响应对象写入任何数据之前请确保先将编码表设置好。

 

请求重定向:

之前在http协议中学习了响应码302和“Location”响应头可以设置请求重定向。

一个简单的代码示例(web工程名为【myservlet】):

1   response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);  //302状态码
2   response.setHeader("location", "/myservlet/index.jsp");

对于不太熟悉HTTP协议的编程人员来说,当然还有更快捷的方式:

1 response.sendRedirect("/myservlet/index.jsp");

验证:在浏览器中的地址栏中键入该Servlet的地址,浏览器则是会跳转至该web目录下的index.jsp,这个可以从浏览器地址栏上看出。

  关于请求重定向中的细节:

  一次请求重定向会向服务器发送两次请求。也就是说会产生两次response响应对象和request请求对象;同时浏览器的地址栏是会发生变化的,URL将跳转到重定向后的页面地址。这点和转发不同。

 

Javaweb Servlet核心接口学习记录(4)—HttpServletResponse接口 Javaweb Servlet核心接口学习记录(3)—HttpServletResponse接口  HttpServletResponse 接口继承自 ServletResponse 接口,主要用于封装 HTTP 响应消息。由于 HTTP 响应消息分为状态行、响应消息头、消息体三部分。因此,在 HttpServletResponse 接口中定义了向客户端发送响应状态码、响应消息头、响应消息体的方法... 阅读详情

相关推荐

JAVAWEB——Servlet

JAVAWEB——Servlet

qq_54354111的博客 631

The static field HttpServletResponse.SC_MOVED_TEMPORARILY should be accessed in a static way

这是重定向的语句, 如果提示错误,不妨直接使用 response.sendRedirect("identityError.jsp") 这是有一定依据的: 1.代码简洁; 2.使用sendRedirect,Servlet会自动构造一个包含新链接的页面(用于那些不能自动重定向的老式浏览器); 3.sendRedirect能够处理相对URL,自动把它们转换成绝对URL; 4.他万一解决了报错的问题了呢~ ...

冷夜 830

Neurocomputing 投稿指南

Generation Information:选择论文所属领域。上传附件(利益声明,手稿,摘要)审稿人偏好:可以选择期待的审稿人。

qq_41174671的博客 2万+

6.2 Servlet跳转之重定向(Redirect)

重定向是利用服务器返回的状态码来实现的。客户端浏览器请求服务器的时候,服务器端会返回一个状态码。服务器端通过HttpServletResponse的setStatus(int status)方法设 置状态码。如果服务器返回301或302,则浏览器会到新的网址重新请求该资源。301:永久重定向,302:临时重定向,下面的代码将访问该Servlet的请求重定向到林和一个网 址。

oYeYuanXinZhiZhu1的专栏 848

Lmbench测试集 --- 延迟测试工具lat_mem_rd

lmbench测试集简介 以及 lat_mem_rd延迟测试工具: 如何测试、测试结果、源码分析

MonologueYY的博客 1万+

LightGBM处理类别特征和缺失值有多省心?一个真实业务数据案例带你上手

本文通过真实电商数据案例,详细解析了LightGBM如何高效处理类别特征和缺失值。相比传统方法,LightGBM仅需一行代码即可自动处理高基数类别特征和缺失值,大幅提升模型训练效率和预测准确度,特别适合业务场景中的脏数据处理。

weixin_30689307的博客 460

Servlet 网页重定向

重定向是实现页面跳转的一种方式。当文档移动到新的位置,我们需要向客户端发送这个新位置时,我们需要用到网页重定向。 实现方式一:使用 response 对象的 sendRedirect() 方法 public void HttpServletResponse.sendRedirect(String location) throws IOException 方式二:setStatus() 和...

ziyonghong的博客 2094

MS51内部振荡器

MS51内部有两个RC振荡器,一个高速16MHz或24MHz(HIRC),可通过HIRC24(RCTRIM1.4)位进 行选择配置,以及一个低速10 kHz(LIRC)。它们都可被选择用作系统时钟。通过设置HIRCEN (CKEN.5)位使能HIRC,设备上电时LIRC被使能。用户可设置OSC[1:0] (CKSWT [2:1])为[0,0]选择HIRC 作为系统时钟,设置OSC[1:0](CKSWT [1:0])为[1,0]选择LIRC作为系统时钟。注意:MS51上电后HIRC 和 LIRC都被...

seraphseraphhill2008的博客 808

Springboot通过Filter过滤HttpServletRequest和HttpServletResponse的数据作为日志并通过@Async异步入库

Springboot通过Filter过滤HttpServletRequest和HttpServletResponse的数据作为日志并通过@Async异步入库

Meta39的博客 1476

MATLAB2021b详细安装教程

1.下载 2.安装 下载安装包后打开iso文件,若是无法打开请用解压软件打开。 ①打开MATLAB_R2021b_win64,双击软件开始安装 ② 一直点击下一步,直到步骤③ ③选择我已有我的许可证的文件密钥,并输入62551-02011-26857-57509-64399-54230-13279-37181-62117-65158-40352-64197-45508-24369-45954-39446-39538-16936-10698-58393-44718-32560-10501-40

惜洛-Jankin的博客 9万+

【python】epub的电子书繁体字与简体字转换

中文繁体与简体转换

xiexianyou666的博客 3088

HttpServletResponse

转发与重定向

qq_41204609的博客 2220

STM32实战:ADXL345传感器驱动与数据采集全解析(IIC/SPI双模式适配)

本文详细解析了STM32驱动ADXL345传感器的全流程,包括IIC和SPI双模式适配、硬件连接、寄存器配置及数据采集处理。通过实战代码示例和常见问题排查指南,帮助开发者快速实现高精度加速度数据采集,适用于运动检测、姿态识别等多种嵌入式应用场景。

weixin_29171087的博客 313

JavaWeb 入门 - HttpServletResponse 响应对象 详解

本文详细介绍了JavaWeb中的HttpServletResponse响应对象,主要包含三个核心部分: 响应行:设置HTTP状态码,包括成功(200)、重定向(302)和错误状态码(404/500)等,通过setStatus()和sendError()方法实现。 响应头:控制响应附加信息,如Content-Type(数据类型)、Location(重定向地址)、Set-Cookie(会话管理)等,通过setHeader()方法设置。 响应体:通过字符流(PrintWriter)或字节流(ServletOutp

2201_75355172的博客 1330

L型探测器几何畸变矫正

定位像素空间位置 -> 计算水平面投影点 -> 统一物理分辨率 -> 重采样生成新图。

如果想成为中心,那么就到中心去吧。 241

精雕软件(JDpaint) 5.5 绿色版

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

JavaWeb之Servlet详解

zxc412728的博客 9220

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Tomcat和Servlet的学习笔记总结

Tomcat JavaWeb的概念 什么是JavaWeb? JavaWeb是指通过Java语言编写可以通过浏览器访问的程序的总称。JavaWeb是基于请求和响应来开发的。 请求是指:客户端给服务器发送数据,叫做请求Reques。 响应是指:服务器给客户端回传数据,叫做响应response。 请求与响应的关系?成对出现的,有请求就有响应。 web资源的分类 web资源按实现的技术和呈现的效果的不同,又分为静态资源和动态资源两种。 静态资源:html,css,js,txt,mp4视频,jpg图片。 动态资源:

Nohara Rin 4507

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

JavaWeb 15.详解Servlet及其源码

无需在程序运行时通过代码运行生成的资源,在程序运行之前就写好的资源,例如:html、css、js、img、音频文件和视频文件Servlet (server applet)是运行在服务端(tomcat)的Java小程序,是sun公司提供一套定义动态资源规范;从代码层面上来讲Servlet就是一个接口不是所有的JAVA类都能用于处理客户端请求,能处理客户端请求并做出响应的一套技术标准就是Servlet其主要功能在于交互式地浏览和修改数据,生成动态Web内容。

m0_73983707的博客 1986

JavaWeb之Servlet(四)HttpServletRequest与HttpServletResponse

导航 ·JavaWeb之Servlet(一)Maven创建Servlet项目时的换源与运行时404的可能解决方案 ·JavaWeb之Servlet(二)Servlet生命周期方法与GET/POST请求分发 ·JavaWeb之Servlet(三)ServletConfig 和 ServletContext ·JavaWeb之Servlet(四)HttpServletRequest类 文章目录导航前言一、常用方法二、请求转发特点完 前言 –>视频教程传送门<– 一、常用方法 每当产生一次请求,S

Ho1aAs‘s Blog 665

JavaWeb ——HttpServletResponse 响应对象全解析(附代码)

设置响应头信息(如 Content-Type、Refresh、Cookie 等)输出响应正文(如 HTML 内容、字符串数据、JSON 数据等)设置响应状态码(如 200 成功、404 资源不存在、500 服务器错误等)实现请求重定向(客户端跳转)解决响应中文乱码问题本质:服务器响应编码与浏览器解码不一致(默认 ISO-8859-1 不支持中文)(一步到位,推荐)关键:编码设置必须在或之前调用,否则无效。

2201_75940978的博客 741

HttpServletResponse对象-Javaweb请求与响应

HttpServletRequest对象 Servlet最主要的作用就是处理客户端请求,并向客户端做出响应。为此,针对Servlet的每次请求,Web服务器在调用service()方法之前,都会创建两个对象,分别是HttpServletRequest和HttpServletResponse。其中,HttpServletRequest用于封装HTTP请求消息,简称request对象。HttpServletResponse用于封装HTTP响应消息,简称response对象。request对象和response

~本特利~的博客 958

JavaWeb——ServletAPI之HttpServletResponse对象

一、概述

Lemon 1179

JavaWeb:HttpServletResponse和HttpServletRequest

请求响应流程图response1、response概述response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletResponse。在客户端发出每个请求时,服务器都会创建一个response对象,并传入给Servlet.service()方法。response对象是用来对客户端进行响应的,这说明在service()方法中使用res

JackChan 6512

Javaweb04-Servlet技术2(HttpServletResponse, HttpServletRequest)

HttpServletResponce对象是继承ServletResponse接口,专门用于封装Http请求设置响应头字段的方法设置常见响应头字段注意:一个Servlet中只可以有一个流对象,否则会报500的错误1.定义:请求重定向,指的是Web服务器接收到客户端的请求后,可能由于某些条件限制,不能访问当前请求URL所指向的Web资源,而是指定了一个新的资源路径,让客户端重新发送请求。

XYX_888的博客 1191

JavaWeb核心Servlet技术

Servlet (server applet) 是运行在服务端(Tomcat)的Java小程序,是sun公司提供一套定义动态资源规范;代码层面上Servlet就是一个接口。用来接收、处理客户端请求、响应给浏览器的动态资源。在整个Web应用中,Servlet主要负责接收处理请求、协同调度功能以及响应数据。我们可以把Servlet称为Web应用中的控制器。不是所有的JAVA类都能用于处理客户端请求,能处理客户端请求并做出响应的一套技术标准就是Servlet。

2302_78998188的博客 916

JavaWeb基础专项复习5——请求对象和响应对象request and response

用于响应客户端请求,包括设置响应头信息、发送状态码、设置响应正文、重定向等功能。

2301_78566776的博客 1327
上一篇: javaWeb项目之Servlet学习笔记----ServletContext的读取方法
下一篇: HTTP协议的请求和响应学习笔记
iamlinuxasd
博客等级 码龄10年 4粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值