Java系列课程第四十三天 (JavaWEB-JSP)

servlet实现javaweb中多个jsp页面之间的条件跳转,以及通过配置xml文件调整jsp文件的主从关系 servlet实现javaweb中多个jsp页面之间的条件跳转,以及通过配置xml文件调整jsp文件的主从关系 简介 基于IDEA,通过使用servlet框架实现javaweb中多个jsp页面之间条件性的跳转,例如本例中给一个计算器页面加一个登录界面判断账号密码是否正确,只有正确的用户可以使用本计算器(注:关于计算器的项目代码在我的博客页面中有)。 步骤 一、建立Javaweb项目并配置好tomcat服务器(我的个人博客中有详细讲解如何配置) 二、在web文件夹下创建多个jsp页面,本例中创建了三个页面 阅读详情

Day43 JavaWEB-JSP

  1. Servlet
    1.1 Response

  2. Http中响应消息格式
    *格式:
    HTTP/1.1 200 OK
    Content-Type: text/html;charset=UTF-8
    Content-Length: 101
    Date: Wed, 06 Jun 2018 07:08:42 GMT
    (空行)


    🏆 ยอดนิยม: java YHkaifa/article/details/ - Kapook Update 2025


    hello , response

     1) 响应行
     	1. 组成:协议/版本 响应状态码 状态码描述
     	2. 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
     		1. 状态码都是3位数字 
     		2. 分类:
     			1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
     			2xx:成功。代表:200
     			3xx:重定向。代表:302(重定向),304(访问缓存)
     			4xx:客户端错误。
     				* 代表:
     					* 404(请求路径没有对应的资源) 
     					* 405:请求方式没有对应的doXxx方法
     			5xx:服务器端错误。代表:500(服务器内部出现异常)
     			
     2) 响应头:
     	1. 格式:头名称: 值
     	2. 常见的响应头:
     		1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
     		2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据
     			* 值:
     				* in-line:默认值,在当前页面内打开
     				* attachment;filename=xxx:以附件形式打开响应体。文件下载
     	3) 响应空行
     	4) 响应体:传输的数据 
    
  3. Response对象
    HttpServletResponse继承ServletResponse接口,专门封装HTTP响应消息

  4. Response功能

    1. 设置响应行
      1. 格式:HTTP/1.1 200 ok
      2. 设置状态码:setStatus(int sc)
    2. 设置响应头:setHeader(String name, String value)
    3. 设置响应体:
      • 使用步骤:
        1. 获取输出流
          • 字符输出流:PrintWriter getWriter()
          • 字节输出流:ServletOutputStream getOutputStream()
        2. 使用输出流,将数据输出到客户端浏览器
          response.getWriter().println(“xxxx”);
          4)设置编码
          response.setContentType(“text/html;charset=utf-8”);
    4. 简单的重定向方法
      response.sendRedirect("/day15/responseDemo2");
      • 重定向的特点:redirect
        1. 地址栏发生变化
        2. 重定向可以访问其他站点(服务器)的资源
        3. 重定向是两次请求。不能使用request对象来共享数据
          *forward 和 redirect 区别
          Forward是服务器内部跳转,两个页面中数据互通,使用同一个request对象,但是地址栏中依然显示第一次请求的url地址,用户感觉不到页面进行了跳转,也只会发送一次请求。
          在这里插入图片描述
          sendRedirect是重定向,两个页面数据不互通,使用的不是同一个request对象,地址栏中显示的是第二个请求的url地址,会发送两次请求
          在这里插入图片描述
          重定向的特点:redirect
    1. 地址栏发生变化
    2. 重定向可以访问其他站点(服务器)的资源
    3. 重定向是两次请求。不能使用request对象来共享数据
      转发的特点:forward
    4. 转发地址栏路径不变
    5. 转发只能访问当前服务器下的资源
    6. 转发是一次请求,可以使用request对象来共享数据

1.2 ajax交互
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1.2 ServletContext

  1. 概念
    代表整个web应用,可以和程序的容器(服务器)来通信
  2. 获取
    1. 通过request对象获取 request.getServletContext();
    2. 通过HttpServlet获取 this.getServletContext();
  3. 功能
    1. 获取MIME类型:

      • MIME类型:在互联网通信过程中定义的一种文件数据类型

      • 格式: 大类型/小类型 text/html image/jpeg

      • 获取:String getMimeType(String file)

    2. 域对象:共享数据

      1. setAttribute(String name,Object value)
      2. getAttribute(String name)
      3. removeAttribute(String name)
      • ServletContext对象范围:所有用户所有请求的数据
    3. 获取文件的真实(服务器)路径

      1. 方法:String getRealPath(String path)
        String b = context.getRealPath("/b.txt");//web目录下资源访问 System.out.println(b);

      String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问 System.out.println©;

      String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问 System.out.println(a);

1.2 作用域
getAttribute
setAttribute
removeAttribute
以上三个方式,是request和session 以及servletContext都有的,用来向对应的作用域中保存数据,获取数据,删除数据

1.2.1 request
当前请求有效,如果向request中保存数据,那么仅在当前请求中可以获取
一般用于页面和后端交互时使用

在这里插入图片描述
一直都是0 因为 request当前请求有效

1.2.2 session
当前会话有效,建立的持续通信,一般是浏览器打开到浏览器关闭时一次会话,只不过也可以设置时间
一般用来保存登陆信息

在这里插入图片描述
同会话中,数据共享
1.2.3 servletContext
全局有效
在这里插入图片描述
只要tomcat不重启,数据就一直在

1.3 HttpServlet底层原理
通过生命周期测试,大家发现,真正的Servlet接口中,并没有doGet()和doPost()方法
那么第一个程序中doGet()/doPost()为什么可以执行?
这个问题就发生在HttpServlet类中
HttpServlet中覆写了Servlet中的方法service()方法,并重载添加了一个service()方法,该方法参数为HttpServletRequest和HttpServletResponse
并在原生service()方法中对重载的方法进行调用,然后在重载的service()方法中,根据请求的方式(get/post)去调用doGet()或doPost()方法
所以就把doGet/doPost加入到了Servlet的生命周期中
在技术手册中也有很明白的解释
在这里插入图片描述
所以会有这样一个说法,就是service()方法优先级比doGet()和doPost()优先级高,如果servlet中同时覆写了service/doGet/doPost三个方法,那么只会执行service
额…这个也可以这样说吧,毕竟他们不是优先级的问题,如果我们覆写了service(),那么再多态执行的时候便不会去执行父类的方法,所以也就不会再对doGet/doPost方法进行调用的
那么下面我们就简单模拟一下HttpServlet的实现

1.4 初始化数据
我们可以在web.xml中准备servlet需要用到的数据
有两种方式,一种是数据只能让某一个servlet使用,需要通过ServletConfig对象获取
Web.xml设置 :

_07_InitParam
com.tledu.zrz.servlet._07_InitParam


name
张三

Java中获取 :
servletConfig.getInitParameter(“name”);

另一种是数据可以让所有的serlvet使用,需要通过ServletContext对象获取
Web.xml设置 :

password
root

Java中获取 :
servletConfig.getServletContext().getInitParameter(“password”);

  1. JSP
    2.1 jsp解决了什么问题
    Servlet中,要想将数据等内容打印到客户端页面中,需要在java代码中拼接大量的html代码,非常的不合理。
    Jsp就是解决这个问题。只需要把数据交给jsp,由jsp来完成数据的展示工作。
    2.2 简介
    JSP—Java Server Pages
    拥有servlet的特性与优点(本身就是一个servlet)
    直接在HTML中内嵌JSP代码
    JSP程序由JSP 引擎先将它转换成Servlet代码,接着将它编译成类文件载入执行
    只有当客户端第一次请求JSP时,才需要将其转换、编译
    在这里插入图片描述
    优点:
    优良的性能
    优于CGI,PHP,ASP
    平台无关性
    操作系统无关,Web服务器无关
    可扩展性
    tag的扩展机制,简化页面开发

2.3 简单语法
<%! %> 表示servlet的类体
<% %> 表示service()方法体
<%= %> 表示 println(); 用于向页面输出内容
<%@ pager %> 指令,比如导包,嵌套页面等
常用属性
contentType 设置类型和字符编码
contentType=”text/html;charset=UTF-8”
errorPage 定义错误页面,出错的时候发生跳转
errorPage=”xxxx.jsp” 被跳转的页面需要设置isErrorPage属性
isErrorPage 可以设置true/false,表示此页面是否为错误页面

Import 导包, import=”java.util.*”
Language 定义脚本语言,目前只能用java
pageEncoding 设置字符编码 pageEncoding=”UTF-8”

<%@include file=“fileURL%> 静态包含其他页面,两个页面合并为一个页面,只生成一个class文件
与之类似的还有<jsp:include page=“fileURL” flush=“true”> 动态包含,两个页面生成两个class , 动态调用
*(flush属性,默认为 false,设置为true时,服务器端会做页面缓冲。服务器在解释jsp文件时是一步一步进行的,默认不做缓冲时,解释生成一句html就会发送给客户端一句,做了缓冲后,会一部分一部分的发送,缩短客户端延迟,避免数据泄露造成错误)
<%@ taglib %> 导入别的扩展包,比如 JSTL

2.4 九大内置对象
内置对象,在jsp中默认内置好的java对象,可以直接使用。在servlet中,一些对象,需要我们手动创建对象,并不能直接使用,比如说session对象。那在jsp中,如何使用session等对象呢。直接用即可。这也是为什么叫内置对象。
变量名 真实类型 作用

  • pageContext PageContext 当前页面共享数据,还可以获取其他八个内置对象
  • request HttpServletRequest 一次请求访问的多个资源(转发)
  • session HttpSession 一次会话的多个请求间
  • application ServletContext 所有用户间共享数据
  • response HttpServletResponse 响应对象
  • page Object 当前页面(Servlet)的对象this
  • out JspWriter 输出对象,数据输出到页面上
  • config ServletConfig Servlet的配置对象
  • exception Throwable 异常对象

Out : 内置对象是一个缓冲的输出流,用来给客户端返回信息。它是javax.servlet.jsp.JspWriter的一个实例
用于向页面输出内容
常用方法
println():向客户端输出各种类型数据
newLine():输出一个换行符
jsp的newLine()函数只是在组装html代码的时候对html的源代码进行了换行
close():关闭输出流

out.clear()是直接清空缓冲区数据,不输出到客户端且刷新缓存时抛出异常
out.flush()先输出缓冲区数据再清空
out.clearBuffer() 清空缓冲区,不输出到客户端
*缓冲问题:
在这里插入图片描述
分析:如果按没有jsp缓存和servlet缓存的话,输出的结果应该是abc,但是输出的却是bac,为什么呢?按照我们上面所说的原理进行分析,out对象是先将其输出到JSP缓存中,所以a加入了jsp缓存,response.getWriter().print(“b”)是直接将b输出到servlet缓存中,然后又使用out对象将c输出到jsp缓存,到程序结束,servlet缓存中有b,然后jsp会将缓存中的内容就刷新到servlet缓存中,serlvet就是bac了,然后到浏览器也就得到我们的输出结果了。如果将out.flush()注释去掉,答案就是abc。原因是我们手动的将jsp缓存里面的数据刷新到servlet缓存里面了。

Request :内置对象表示的是调用JSP页面的请求。通常,request对象是javax.servlet.http.HttpServletRequest接口的一个实例

常用方法
getMethod():返回客户端向服务器端传送数据的方法
getParameter(String paramName):返回客户端向服务器端传送的参数值,该参数由paramName指定
getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举类型数据(Enumeration)
getParameterValues(String name):获得指定参数的所有值,由name指定
getRequestURI():获得发出请求字符串的客户端地址
getRemoteAddr():获取客户端的IP地址
getRemoteHost():获取客户端机器名称
getServerName():获取服务器的名字
getServletName():客户端所请求的脚本文件路径
getServerPort():获取服务器端的端口
getContextPath() 获取当前项目名 /xxx

Response : 表示的是返回给客户端的响应
是javax.servlet.http.HttpServletResponse接口的一个实例
经常用于设置HTTP标题,添加cookie、设置响应内容的类型和状态、发送HTTP 重定向和编码URL
常用方法:
addCookie(Cookie cookie):添加一个Cookie对象,用于在客户端保存特定的信息
addHeader(String name,String value):添加HTTP头信息,该Header信息将发送到客户端
containsHeader(String name):判断指定名字的HTTP文件头是否存在
sendError(int):向客户端发送错误的信息
sendRedirect(String url):重定向JSP文件
和jsp:forward的区别
sendRedirect通过客户端发起二次申请,不同的request对象
Jsp:forward是同一个request,在服务器内部转发
setContentType(String contentType):设置MIME类型与编码方式

session和application
<% @page session=“true”%>–表示session功能已经在jsp页面中启动,一次会话
session常用方法:
void setAttribute(String name,Object value)
Object getAttribute(String name)
boolean isNew() 判断是否是新建的session
application
就是ServletContext,全局作用域

Exception : 异常对象,如果有什么异常信息,页面可以使用exception直接获取

config : ServletConfig 配置对象

pager : Object pager = this , 也是域,代表当前页面有效
可以参考运行jsp之后生成的java文件,在TomCat的work下,所谓内置对象,其实就是在生成的Servlet中service()方法中的局部变量
2.5 jsp实现跳转方式
跳转我们经常用到,不管是页面之间跳转还是页面跳转到java后台,还是在java后台跳转到对应的页面,都经常用到
而跳转方式又被分为两种,Forward和 sendRedirect
Jsp写法
重定向跳转
<%
response.sendRedirect("_06_page.jsp");
后面的代码依旧会执行,和跳转页面用的是同一个request对象
会请求两次,并且地址栏会变成跳转的页面的地址
如果 对页面传值 比如 A.jsp?name=222 在 被跳转页面 request.getParameter 是获取不到数据的
同理 调用request.setAttribute(“aa”, 11); 方法设置的值,在被跳转页面 依然获取不到
因为 是两次请求,两个request对象,数据不互通
%>
Forward跳转
<jsp:forward page="/xxx" />
后面代码不会执行,并且和跳转页面不是同一个request对象
只会请求一次,并且地址栏不变

通过地址栏传递值 A.jsp?name=222 在 被跳转页面 request.getParameter 可以获取数据
同理 调用request.setAttribute(“aa”, 11); 方法设置的值,在被跳转页面 依然能获取到数据
因为 是1次请求,1个request对象,数据互通
总结 : response.sendRedirect 和jsp:forward的区别
1 前者后面代码会执行,后者不会执行
2 前者地址栏会发生变化,显示被跳转页面的路径,后者不变,依旧是请求的页面地址
3 前者是两个request对象,数据不互通,后者是1个对象,数据互通
4 前者需要客户端往返,后者直接在服务器内部跳转

Java写法
sendRedirect :
response.sendRedirect( request.getContextPath() + “/xxx.jsp” );
这里 / 默认定位到 webapps 下,也就是服务器根目录,所需 需要加上项目名进行访问
如果不加 / 就是相对路径,相当于请求的上级
比如 是请求 a/b 到的这个servlet 那么如果直接写 response.sendRedirect(“c.jsp” );
就会去找 a/c.jsp
运行地址 127.0.0.1:8080/JSP_01/sTj
Forward:
this.getServletConfig().getServletContext()
.getRequestDispatcher("/xxx").forward(request, response);
必须加 / ,代表项目根目录(webroot)
并且 跳转后面的代码,会执行,jsp的不会执行,是因为生成servlet的时候,自动加了return,
运行地址 127.0.0.1:8080/JSP_01/sTjf

基于javaweb+jsp的人事员工管理系统(JavaWeb MySQL JSP Bootstrap Servlet SSM SpringBoot) 基于javaweb+jsp的人事员工管理系统(JavaWeb MySQL JSP Bootstrap Servlet SSM SpringBoot) JavaWeb JavaBean JSP MVC MySQL Tomcat JavaScript Bootstrap. 基础JSP+ServletJSP+SSM(Spring、SpringMVC、MyBatis)框架或JSP+SSM+Maven(pom.xml)框架或SpringBoot...均可 开发工具:eclipse/idea/myeclipse 阅读详情

相关推荐

基于javaweb+jsp的健康体检信息管理系统(JavaWeb JSP MySQL Servlet SSM SpringBoot Bootstrap)

基于javaweb+jsp的健康体检信息管理系统(JavaWeb JSP MySQL Servlet SSM SpringBoot Bootstrap) JavaWeb JavaBean JSP MVC MySQL Tomcat JavaScript Bootstrap 基础JSP+ServletJSP+SSM(Spring、SpringMVC、MyBatis)框架或JSP+SSM+Maven(pom.xml)框架或SpringBoot...均可 开发工具:eclipse/idea/myeclips

m0_70029695的博客 2910

Servlet跳转到jsp页面的几种方法

1.sendRedirect方式 sendRedirect("/a.jsp"); 可以将页面跳转到任何路径,不局限于web应用中,跳转的过程中url地址变化,无法使用request.setAttribute来传递。 2.forward方式 request.getRequestDispatcher("/a.jsp").forward(request.response); url地址不变,只能...

weixin_30713953的博客 6193

基于javaweb+jsp的银行信息管理系统(JavaWeb MySQL JSP Bootstrap Servlet SSM SpringBoot)

基于javaweb+jsp的银行信息管理系统(JavaWeb MySQL JSP Bootstrap Servlet SSM SpringBoot) JavaWeb JavaBean JSP MVC MySQL Tomcat JavaScript Bootstrap. 基础JSP+ServletJSP+SSM(Spring、SpringMVC、MyBatis)框架或JSP+SSM+Maven(pom.xml)框架或SpringBoot...均可 开发工具:eclipse/idea/myeclipse

m0_70029952的博客 2540

servlet跳转到JSP页面的两种方法

servlet调用jsp,有两种方式:转向和重定向 转向:是在一个Web工程内部,各组件之间的调用。在调用时,request对象中的信息不会丢失(request对象不消亡),进入另一个组件后,request对象中的数据可以在新组件继续使用。 重定向:可以在一个Web工程内部,各组件之间实现调用,也可以直接跳转到其他Web工程的Jsp页面。并且,在跳转到新组件后,重新创建request对象。 转向:在servlet中实现转向,需要有请求对象(HttpServletRequest request)获得一个转发

Mtf007的博客 8327

Servlet跳转页面的几种方法总结

servlet跳转页面的方法: 跳转分为两部分,一部分发生在servlet,另一部分发生在JSPJSP就是servlet,但是两者还是有部分差异。 Servlet:(跳转发生在doGet,doPost等方法里) (1)redirect方式 response.sendRedirect(“/index.jsp);页面的路径是相对路径。sendRedirect可以将页面

小怪兽 6万+

ServletServletJSPServlet的跳转

ServletServlet之间的跳转 ServletServlet之间的跳转,可以通过请求转发来实现,即RequestDispatcher对象的forward方法;也可以使用重定向方法,即HttpServletResponse对象的sendRedirect方法。 ...

lanadelrey13的博客 3045

Java基础系列JavaWeb入门

JavaWeb 是一种使用 Java 编程语言开发 Web 应用程序的技术体系。它是建立在 Java 平台上的一组技术和规范,用于创建动态、交互性和可扩展的 Web 应用程序。JavaWeb 通常涉及到使用 Java ServletJavaServer Pages(JSP)、JavaBeans、Enterprise JavaBeans(EJB)等技术。JavaWeb 技术的使用使开发者能够构建功能强大、可维护和可扩展的 Web 应用程序。

CSDN站内信: https://i.csdn.net/#/msg/chat/qyj19920704 1万+

eclipse新建javaweb项目——javaweb系列()

eclipse新建javaweb项目——javaweb系列()

qq_23858785的博客 9953

JavaWeb】之JSP

JavaWeb基础JSP相关知识详细介绍~

小新要变强的博客 2941

JavaWebJSP详解

JSP = Java Server Page = html + Java代码 + JSP动态标签通常在前台开发人员给出静态页面后,后台开发人员只需在静态页面中添加动态信息即可,而不用再使用Servlet一行一行的去输出了内置对象是在JSP页面中无需创建就可以直接使用的变量。在JSP中一共有9个这样的对象page(当前JSP的真身类型)out最为常用的方法是print(),即向页面输出。它与response.getWriter()基本相同config。

2302_78914800的博客 1003

JavaWeb基础专项复习2——JSP文件

JavaWeb早期JavaWeb中期:servlet,在servlet中需要写大量的JavaWeb后期JSP,只需要在html中直接添加动态信息,即java代码片段就可以了。服务器会把所有的<html>语句转换成response.getWriter().println(“<html>”);html + java代码 + JSP动态标签 = jspJSP 是在传统的网页 HTML 文件中插入 Java 代码和 JSP 标签,从而形成 JSP 文件,后缀名为.jsp

2301_78566776的博客 1397

JavaWeb系列9——jsp

🔥本篇概览:详细讲解了JavaWeb系列9——jsp的方方面面,包括底层运用转化等。🌈⭕🔥

做一个善良的人,做好自己的事,如果愿意,再发一份光。 952

JavaJavaEE、JavaWeb 的关系

一、JavaJavaEE、JavaWeb的关系 Java是一种语言,也是一种平台。 JavaEE(Java Platform Enterprise Edition,Java平台企业版)是企业级应用开发的一种标准。 Spring 诞生之初是为了改进 Java EE 开发的体验,后来逐渐成为了 JavaWeb开发的实际标准。 JavaEE号称有十三种核心技术。它们分别是:JDBC、JN...

moqiyong666的博客 3230

视频教程-JavaWEB课程-Java

JavaWEB课程 毕业于师范院校,曾就职于中科软、传智播客、北京宇信科技,...

weixin_28760195的博客 533

JavaWeb开发(九)JSP技术

jsp被翻译成servlet的时候,service方法内部有九个对象定义并初始化,这九个对象被称为隐式对象。

qq_36158551的博客 1347

JavaWeb核心技术系列教程(19)——JSP入门及运行原理

JSP(全称JavaServer Pages)是由Sun公司研发的建立在Servlet规范之上的动态网页开发技术。在我们之前的学习中常用HTML显示页面 ,但是,HTML页面是静态的,也就是说:我们无论何时访问该页面看到的总是同样的内容。在不少情况下,静态页面的短板难以实现动态的效果;例如,每次打开新闻页面时浏览次数需动态生成;每次打开火车购票页面看到的车票余额需动态生成;每次打开气预报页面需动态生成近期气情况。显然,单纯地依靠HTML时无法完成类似的开发工作。此时,我们可使用Servlet技术将页面动

谷哥的小弟 1092

javaweb从入门到精通教程,7彻底搞定javaweb

当初想学习javaweb开发的时候,希望能够全方面地学习(这样找工作时就胸有成足了)。 但是对这个根本不理解,又不认识从事这方面的熟人,所以学习起来无从下手。 经过了一年的“死”学习,从网上,从书本,从视频里面深入了解了javaweb。 目前,Java Web开发领域的学习教程有很多,但是能真正把技术讲解透彻的并不是很多。 这个【Java Web从入门到精通】从初学者的角度出发,由浅入深地讲解了使用Java语言和开源框架进行Web程序开发应该掌握的各项技术。 Javaweb课程内容涵盖: 网

Javanewspaper的博客 2069

基于javaweb+jsp的设备维修管理系统(JavaWeb JSP MySQL Servlet SSM SpringBoot Bootstrap)

基于javaweb+jsp的设备维修管理系统(JavaWeb JSP MySQL Servlet SSM SpringBoot Bootstrap) JavaWeb JavaBean JSP MVC MySQL Tomcat JavaScript Bootstrap 基础JSP+ServletJSP+SSM(Spring、SpringMVC、MyBatis)框架或JSP+SSM+Maven(pom.xml)框架或SpringBoot...均可 开发工具:eclipse/idea/myeclipse/

m0_70029952的博客 1761
上一篇: Java系列课程第三十九天 (jQueryHTML与插件)
下一篇: Java系列课程第四十二天 (JavaWEB-JSP)
JavaStudy_YH
博客等级 码龄5年 0粉丝 29原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值