Java_Web基础--JDBC/HTML/Servelet/Web/JSP/jQuery(你必须要懂得基础)

风离紫竹--tryzq521@126.com

01_JDBC

作者: 风离紫竹--tryzq521@126.com
1.为什么需要JDBC技术?
帮助Java程序连接数据库

2.JDBC概述
①不同数据库之间存在实现上的差异

②JDBC提供访问数据库的统一标准

③面向接口编程
在程序开发过程中,根据接口中定义的方法对不同的实现类进行操作
[1]屏蔽不同实现类之间的差异。
[2]当底层实现类发生改变时,上层对实现类的调用不需要改变。
④数据库驱动:在程序中体现为导入第三方jar包


⑤不建议直接操作数据库驱动实现类


3.JDBC操作的步骤

4.获取数据库连接
①连接数据库服务器需要提供四个基本信息
[1]连接数据库的用户名
[2]连接数据库的密码
[3]要连接的目标数据库的URL地址


[4]数据库驱动全类名

②URL地址格式
[1]例子
<util:map id="dbProps">
    <entry key="db.driver" value="com.mysql.jdbc.Driver"/>
    <entry key="db.jdbcurl" value=" jdbc:mysql://localhost:3306/world"/>
    <entry key="db.username" value="myuser"/>
    <entry key="db.password" value="mypass"/>
</util:map>
[2]格式
协议名:子协议名://主机地址:端口号/数据库名称


③注册JDBC驱动
Class.forName("数据库驱动全类名");

Class.forName("com.mysql.jdbc.Driver");

static {
    try {
        java.sql.DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
        throw new RuntimeException("Can't register driver!");
    }
}
Class.forName()执行时会将全类名对应的类所在的.class字节码文件加载到内存中,当一个类被加载到内存中时会执行静态代码块中的内容,从而注册驱动。

④获取Connection对象
public static Connection getConnection(String url,
String user,
String password) throws SQLException
注意:需要导入MySQL驱动的jar包——mysql-connector-java-5.1.7-bin.jar
●导入第三方jar包
[1]在Java工程根目录下创建lib目录
[2]将第三方jar包复制到lib目录下
[3]在jar文件上点右键→Build Path→Add To Build path

5.Statement接口
①代表:SQL语句指令
②对象获取:Statement java.sql.Connection.createStatement()
③功能:执行SQL语句
[1]增删改:int executeUpdate (String sql)
[2]查询:ResultSet executeQuery(String sql)
④缺陷
[1]拼SQL语句中的参数时非常繁琐,容易出错
[2]存在SQL注入问题

6.ResultSet接口
①代表:执行SQL语句查询数据库后的结果的集合
②对象获取:ResultSet executeQuery(String sql)
③结构
  • A ResultSet object maintains a cursor pointing to its current row of data
    一个ResultSet对象维护了一个指向数据中当前行的游标/指针。
  • Initially the cursor is positioned before the first row
    在刚开始的时候这个游标的位置是第一行的前面


The next method moves the cursor to the next row
next()方法将游标移动到下一行

  • and because it returns false when there are no more rows in the ResultSet object
    当游标移动后,发现ResultSet对象中没有数据时,next()方法会返回false
  • The ResultSet interface provides getter methods (getBoolean,getLong, and so on) for retrieving column values from the current row
ResultSet接口提供了很多重载的getXxx()方法,在当前行中查询列的值


  • Values can be retrieved using either the index number of the column or the name of the column
值可以通过列的索引或列名来获取
  • Columns are numbered from 1
索引值从1开始


7.PreparedStatement接口
①代表:预编译SQL语句
②对象获取:PreparedStatement prepareStatement (String sql)
注意:此时需要传入SQL语句字符串
③特点:支持在SQL语句中使用“?”作为占位符,用于动态传入参数的值
INSERT INTO users(user_name,user_pwd) VALUES(?,?)
④传入占位符参数的具体值
void setInt( int parameterIndex, int x) throws SQLException
parameterIndex表示参数的索引,x是具体的值。
⑤执行SQL语句
[1]增删改:executeUpdate()
[2]查询:executeQuery()

8.Dao
Data Access Object数据访问对象
通常在操作数据库时,将数据库操作封装到Dao类中

9.练习
①登录
检查用户名、密码是否正确
boolean UserDao. login(String userName,String userPwd);
true:表示登录成功
false:表示登录失败
②注册
[1]检查用户名是否被占用
boolean UserDao. checkUserName(String userName);
true:表示用户名被占用——不能注册
false:表示用户名没有被占用——可以注册

[2]在用户名可用的情况下保存用户信息
void UserDao. saveUser(String userName,String userPwd);


02_HTML

作者: 风离紫竹--tryzq521@126.com
1.网页:WebApplication的界面



Web2.0标准的思想将网页划分成三个组成部分
①结构:网页上要显示的数据,由HTML定义的
②表现:网页上数据的显示方式,由CSS定义的
③行为:网页对用户操作的响应,由JavaScript实现的

2.HTML概述
①含义
Hyper Text Markup Language
超文本标记语言
②超文本:网页上的超链接
③标记:标签
成对的标签:<p>这是一个段落</p>段落标签
单标签:<br/>换行标签

3.HelloWorld


4.HTML VS XML
①HTML是用于显示数据:数据最终是给人看的
②XML是用于保存或组织数据:数据最终是给程序看的

5.在Eclipse中使用HTML
①创建static web project
②在WebContent目录下创建HTML文件
③编辑
④查看结果:HTML文件上点右键→open with→Web Browser


03_Servlet

作者: 风离紫竹--tryzq521@126.com
1. Why?为什么要使用Servlet?


目的:通过使用Servlet在Java程序中接收浏览器 请求,并给浏览器返回 响应数据。

2. What?什么是Servlet?
①含义:Server+let=Servlet服务器端的小程序
②从API角度:javax.servlet.Servlet接口及其实现类


3.Ho w?如何使用Servlet?
①使用Servlet接口
[1]使用接口的传统的方法
(1)创建实现类,让实现类实现接口
(2)创建实现类的对象
(3)调用实现类对象的方法
[2]Servlet接口
(1)创建实现类
(2)Servlet实现类的对象是交给“Servlet容器”来创建的,此时必须将Servlet实现类在动态Web工程的web.xml文件中注册才行
<!-- 注册Servlet。目的:让Servlet容器创建Servlet对象,并将浏览器请求的地址和Servlet关联起来 -->
<!-- 1.Servlet实现类全类名的声明 -->
< servlet >
     <!-- 给Servlet指定一个简短的“友好名称”,便于引用 -->
     < servlet-name > HelloWorldServlet </ servlet-name >
     < servlet-class > com.atguigu.servlet.HelloWorldServlet </ servlet-class >
</ servlet >

<!-- 2.访问Servleturl地址和Servlet建立关联关系 -->
< servlet-mapping >
     < servlet-name > HelloWorldServlet </ servlet-name >
     < url-pattern > /GoodUrl </ url-pattern >
</ servlet-mapping >

(3)在服务器接收到浏览器请求后,会自动调用Servlet实现类对象的指定方法
②使用Eclipse自动生成Servlet

04_HTTP协议

作者: 风离紫竹--tryzq521@126.com
1.作用:定义浏览器和服务器之间交互时,请求和响应的数据格式。
2.请求的数据格式


①请求行:请求方式 URL地址 HTTP协议版本
②请求消息头:当前请求需要告诉服务器的相关信息
③请求体:POST请求发送的请求参数
④GET请求和POST请求的区别
  GET POST
请求参数 浏览器地址栏是否可见 可见 不可见
请求参数的位置 附着在URL地址后面 请求体中
发送请求参数数据容量 有限制 无限制

3.响应的数据格式


①响应状态行:协议版本 响应状态码 响应状态说明
[1]响应状态码的作用:告诉浏览器,服务器对你的请求处理的结果
[2]常见的响应状态码
200:表示服务器成功响应请求
302:表示重定向
404:表示找不到资源
500/505:服务器内部错误
……

②响应消息头:服务器要告诉浏览器的关于当前响应数据的信息。告诉浏览器如何解析当前响应数据。
响应数据:商品
响应消息头:产品说明书
③响应体:真正要在浏览器窗口中显示的内容


*如果是Android程序请求的响应,通常应该是Servlet返回的JSON数据,而不是一个页面。

④404错误产生的原因
[1]路径错误,目标资源确实不存在。
[2]访问了WEB-INF目录下的资源,而WEB-INF目录下的资源是不允许浏览器直接访问的。
[3]web.xml配置文件有错误,在Web应用启动时就在控制台抛出了异常,此时任何资源都不能访问。
[4]服务器端缓存造成的,清理服务器端缓存即可。
(1)停止服务器


(2)移除全部Web应用工程






05_Web应用中请求和响应的中文乱码问题

作者: 风离紫竹--tryzq521@126.com
1.请求
①GET请求:找到Tomcat配置文件中的server.xml,在第一个Connector标签内添加如下属性
URIEncoding = "UTF-8"
URL是URI的一种,所以URIEncoding就是设置URL的 解码字符集。
*编码和解码
编码:'a'→10101
解码:10101→'a'
乱码:编码和解码使用的字符集不同
*在Tomcat的Eclipse镜像中做修改,并不会自动同步到Tomcat原始的解压目录下,如果有需要只能手动修改。
②POST请求:在request.getParameter()方法执行前执行如下代码
request.setCharacterEncoding( "UTF-8" );
*注意:上述操作一定要在request.getParameter()方法执行前执行,否则无效
2.响应
①针对调用response.getWriter();方法返回响应数据的方式
②解决方式:response.setContentType("text/html;charset=UTF-8");
[1]含义:设置响应体数据的解码字符集。Tomcat服务器非常智能,会自动根据“解码”字符集作为编码字符集进行编码。
[2]注意:这个操作需要在response.getWriter();方法调用之前执行,否则无效


06_路径问题

作者: 风离紫竹--tryzq521@126.com
1.相对路径是有问题的
如果转发到一个目标页面,再从目标页面通过相对路径点击超链接,那么就有可能发生问题访问不到资源。
原因是:转发时浏览器地址栏不变,导致到达目标页面时,相对路径的基准有可能是错误的。

2.URL地址的结构



3.使用绝对路径
①概念
[1]相对路径:没有使用“/”开头的路径
[2]绝对路径:使用“/”开头的路径
②事实:对于以“/”开头的绝对路径,浏览器和服务器解析的方式
[1]浏览器:会把开头的“/”看成是当前主机地址
http://localhost:8989

[2]服务器:会把开头的“/”看成是当前Web应用
http://localhost:8989/Web07_Path
③编写绝对路径地址的步骤
[1]写开头的“/”
[2]判断当前地址是由谁解析的,或者也可以说这个地址是给谁看的
[3]如果是给浏览器看的,那么斜杠代表当前主机,在当前主机下面找Web应用
[4]如果是给服务器看的,那么斜杠代表当前Web应用,直接在Web应用下找资源
④路径的归类
[1]浏览器解析的
HTML标签内的地址
重定向的地址

[2]服务器解析的
请求的转发
web.xml中url-pattern的配置

07_JSP

作者: 风离紫竹--tryzq521@126.com
1.在页面上动态显示错误消息
①HTML
[1]长处:便于编写HTML标签
[2]短处:不能根据条件进行判断
②Servlet
[1]长处:能够动态的根据条件进行判断
[2]短处:不能很方便的编写HTML标签

2.JSP概述
①JSP含义:Java Server Page
JSP=HTML+Servlet
JSP就是一个穿着HTML衣服的Servlet
②JSP的HelloWorld


③JSP原理和本质[不需要记]
[1]传统的Java程序:xxx.java→编译→xxx.class→执行
[2]JSP:xxx.jsp→翻译→xxx_jsp.java→编译→xxx_jsp.class→执行
工作区\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\工程名\org\apache\jsp
[3]JSP本质:Servlet
(1)证据1:JSP文件翻译后得到的Java源文件中的类继承自javax.servlet.http.HttpServlet
(2)证据2:在全局的web.xml中存在JSP对应的Servlet的注册信息
(3)证据3:JSP翻译得到的类中有与Servlet相似的生命周期方法

3.JSP语法
①JSP模板元素:JSP页面上的HTML标签
②JSP表达式
[1]格式:<%=要输出的数据 %>
[2]作用:将数据输出到页面上
[3]本质:调用了out对象的print()方法,而重载的一系列print()方法中有一个接收Object类型数据的,所以任何数据类型都可以输出。
[4]限制:至少要确实是一个数据
<%=System.out.print("aaa")%>

③JSP脚本片段
[1]格式:<% Java代码 %>
[2]作用:执行Java代码
[3]本质:直接拿到_jspService()方法中
[4]语法要求
(1)语句结尾必须加分号
(2)Java的方法中不允许写的代码不能写
[5]注意:JSP表达式和JSP脚本片段中的代码可以是不完整的,但所有脚本片段和表达式中的代码组合在一起后必须是完整的。
<%
     for ( int i = 0; i < 10; i++) {
         if (i % 2 == 0) {
%>
             <%= i %> < br />< br />
<%
        }
    }
%>


④JSP注释

08_会话控制

作者: 风离紫竹--tryzq521@126.com
1.保持登录等用户状态
HTTP协议是一个无状态的协议,每次发送请求都是建立独立的连接,上一次请求和这一次请求之间没有任何关系。需要借助会话控制技术识别用户状态。
结论: 要在整个会话过程中保持数据不丢失,只需要将数据保存到Session对象的属性域中即可

2.情景举例
一个咖啡厅要进行一次促销活动。顾客累计消费5杯咖啡就赠送一杯。具体应该如何操作呢?
①咖啡厅的服务员无法靠记忆识别每一个顾客——无状态。
②办会员卡:在顾客的卡片上记录消费的数量——Cookie。
③办会员卡:在顾客的卡片上只记录顾客的编号,根据编号在自己咖啡店的电脑中记录消费的数量——Session。

3.Cookie
①工作机制
[1]“办卡”:创建Cookie对象
[2]“发卡”:将Cookie数据返回给浏览器
(1)response.addCookie(cookie);
(2)响应消息头
键                  值
Set-Cookie    myCookieName=myCookieValue

[3]“带卡”:浏览器携带Cookie访问服务器
键           值
Cookie    myCookieName=myCookieValue

[4]“读卡”:服务器从请求中读取Cookie的信息
//1.读取Cookie信息
Cookie[] cookies = request.getCookies();
if (cookies != null ) {
     for ( int i = 0; i < cookies. length ; i++) {
        Cookie cookie = cookies[i];
        String name = cookie.getName();
        String value = cookie.getValue();
        
         //2.通过响应数据显示Cookie信息
        writer.write(name+ "=" +value);
        writer.write( "<br/>" );
    }
    
} else {
    writer.write( "当前没有Cookie信息!" );
}

②时效性
[1]根据时效性对Cookie进行分类
(1)会话级Cookie[默认]:被浏览器保存在内存中,浏览器关闭后释放内存,同时Cookie也会被释放。
(2)持久化Cookie:被浏览器保存在硬盘上,到预先指定的时间时就会被释放。只要还没有到时间就不受浏览器关闭的影响。
[3]cookie.setMaxAge(int age);
(1)age<0:将Cookie设置为会话级
(2)age==0:告诉浏览器删除Cookie
(3)age>0:将Cookie设置为持久化Cookie,并保持age秒

3.Session
①工作机制:request.getSession();
[1]请求中没有携带JSESSIONID的Cookie
(1)服务器创建一个新的Session对象
(2)创建一个新的Cookie,这个Cookie的name是JSESSIONID,value值是一个唯一值
(3)将JSESSIONID这个Cookie返回给浏览器
[2]请求中携带了JSESSIONID的Cookie,那么就会根据这个JSESSIONID的值查找对应的Session对象
(1)能够找到:将找到的Session对象返回给request.getSession()方法的调用者
(2)找不到:就创建新的Session对象,并返回新的JSESSIONID Cookie
[3]服务器端是以一个Map形式保存Session对象的
KEY VALUE
JSESSIONID值 Session对象
0001 session0001
0002 session0002
…… ……
根据JSESSIONID的值查找以前使用过的Session对象,从而保持会话状态。另外浏览器每次请求服务器时都会携带Cookie也是非常关键的一点。
[4]相关API
(1)isNew():返回boolean值
true:表示当前Session是新创建的
false:表示当前Session不是新创建的
(2)getId():返回当前Session对象的JSESSIONID值

②时效性管理
[1]Session管理的是“空闲”时间。



如果Session的空闲状态,超过预先设定的值,那么就会被服务器释放。
[2]相关API
(1)默认的最大空闲时间:30分钟
(2)读取:session.getMaxInactiveInterval();
(3)修改:session.setMaxInactiveInterval(int seconds);
(4)立即失效:session.invalidate();


09_Filter

作者: 风离紫竹--tryzq521@126.com
1.为什么要使用Filter?
在很多情况下,需要在请求到达目标资源之前进行统一的操作。
2.什么是Filter?
过滤器,对Web应用中的请求进行统一的过滤和处理的组件。
javax.servlet.Filter接口
3.如何使用Filter?
①拦截:通过在web.xml配置文件中声明url-pattern元素指定要拦截的目标资源的URL地址
②过滤:根据需要设定过滤条件
③放行:chain.doFilter(..);
4.HelloWorld




5.Filter的注册方式
     <!-- 注册一个Filter -->
     < filter >
         < filter-name > HelloWorldFilter </ filter-name >
         < filter-class > com.atguigu.filter.HelloWorldFilter </ filter-class >
     </ filter >
     < filter-mapping >
         < filter-name > HelloWorldFilter </ filter-name >
        
         <!-- ★指定要拦截的目标资源的URL地址 -->
         < url-pattern > /target.jsp </ url-pattern >
     </ filter-mapping >







11_JavaScript

作者: 风离紫竹--tryzq521@126.com
1.为什么要使用JavaScript
为了实现网页上的动态效果。
2.什么是JavaScript?
运行在浏览器上的一门弱类型的解释型脚本语言。
●强类型:
int a = 10;
a = "ss";

●弱类型:
var b = 100;
b = true;
b = "abc";
b = new Object();

●JavaScript引擎:浏览器运行JavaScript程序的内部模块,类似于运行Java程序的JVM。
●JavaScript宿主
○浏览器:运行在浏览器上的JavaScript就是我们通常实现网页特效的JavaScript语言
○服务器:运行在服务器上的JavaScript就是Node.js

3.HelloWorld
①基本语法
②绑定事件响应函数
③为什么要使用window.onload?
④document.getElementById()是干什么的?

4.JSON
①JavaScript中创建数组或对象的数据格式。
②格式描述
[1]最外层只能是[]或{}
[2]如果最外层是[],那么称为JSON数组;如果最外层是{},那么称为JSON对象。
[3]JSON对象的格式:一组键值对
{key:value,key:value,...,key:value}
[4]JSON数组的格式:一组值
[value,value,...,value]
[5]key的类型:只能是字符串,可以不加引号,即使不加引号也不会被识别为变量名,仍然是字符串。但建议使用引号明确它是字符串。
[6]value的类型:可以是基本数据类型,也可以是引用类型——JSON对象或JSON数组。

5.绑定事件响应函数
①操作步骤
[1]找到要绑定事件响应函数的控件
[2]声明事件响应函数
[3]将函数的引用赋值给控件对象的事件属性
②类比
地雷
事件响应函数
兵工厂生产地雷 声明响应函数
找到埋设地雷的位置 找到绑定事件响应函数的控件
埋设地雷 将函数的引用绑定到控件上
触发地雷的引信 用户触发事件
爆炸 系统调用响应函数

6.为什么要使用window.onload?
①本质:给window对象的onload事件绑定一个响应函数。
②目的:让响应函数中的操作,在整个窗口中的内容全部加载完成后再执行。
③分析原因
[1]浏览器在加载HTML文档内容时,是从上到下加载
[2]如果遇到script标签,则停下来执行script标签中的JavaScript代码
[3]执行JavaScript代码完成之后再继续加载script标签后面的HTML标签
[4]所以如果script标签在body标签的前面,那么script标签中的代码执行时就获取不到body标签内的元素对象
[5]所以将script标签放在body标签后面可以解决上述问题,但不符合习惯
[6]为了能够在符合习惯的head标签内编写JavaScript程序,就需要借助window对象的onload事件,在整个文档加载完成后再执行操作

7.DOM
①含义:Document Object Model 文档对象模型
文档:HTML或XML文件
②DOM是W3C组织制定的一套用来解析HTML或XML文本的技术标准。
③作用:便于以对象的形式操作HTML页面上的标签。
④节点
[1]类型上的关系




⑤树形结构
[1]父子关系:在树形结构中上下直接相连的节点之间
[2]兄弟关系:在数学结构中水平相连的节点之间
[3]祖先后代关系:在树形结构中上下直接或间接相连的节点之间

12_jQuery

作者: 258406984@qq.com
1.jQuery是一款JavaScript框架。作用是简化JavaScript开发。jQuery的口号:Write less,do more!

2.jQuery使用
①结论:使用jQuery的基本方法就是首先调用jQuery的核心函数,返回jQuery对象,然后使用jQuery对象完成功能。
②核心函数:$
[1]参数是函数:jQuery就会在整个文档加载完成后执行这个函数,作用相当于windon.onload
[2]参数是“选择器字符串”:根据这个选择器字符串在文档中查找对应的元素

3.选择器
①本质:字符串形式的表达式
②作用:用来在整个文档中查找想要的元素
③例子:#id值,就表示根据id的值在文档中查找对应的元素。
PS:在HTML文档中,id属性的值是不允许重复的。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、JDBC(Java Database Connection):java连接数据库统一接口API,底层主要通过直接的JDBC驱动和 JDBC-ODBC桥驱动实现与数据库的连接。 1>.JDBC驱动程序类型: <1>.JDBC-ODBC桥加ODBC驱动程序:需要ODBC驱动,适合于企业网或三层结构应用程序 <2>.本地API:需要驱动程序的二进制代码支持 <3>.JDBC网络纯java驱动程序:将JDBC转换为与DBMS无关的网络协议,又被某服务器转换为一种DBMS 协议,以操作各种数据库 <4>.本地协议纯java驱动程序:将JDBC调用直接转换成JDBC所使用的网络协议 2、JDBC操作基本流程: 1>.导入驱动:实例化时自动向DriverManager注册(DriverManager.registerDriver()) <1>.Class.forName(driver) <2>.Class.forName(driver).newInstance() <3>.new driver() 2>.取得数据库连接(Connect to the DataBase) <1>.用DriverManager取数据库连接 Connection cn = DriverManager.getConnection(url,uid,pwd); <2>.用jndi(java的命名和目录服务)方式:多用于jsp Context ctx = (Context) new InitialContext().lookup("java:comp/env"); DataSource ds = (DataSource) ctx.lookup(jndi); Connection cn = ds.getConnection(); 3>.执行sql语句(Execute the SQL) <1>.用Statement来执行sql语句 Statement sm = cn.createStatement(); sm.executeQuery(sql); // 执行数据查询语句(select) sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等) <2>.用PreparedStatement来执行sql语句 String sql = "insert into user (id,name) values (?,?)"; PreparedStatement ps = cn.prepareStatement(sql); ps.setInt(1,xxx); ps.setString(2,xxx); ... ResultSet rs = ps.executeQuery(); // 查询 int c = ps.executeUpdate(); // 更新 4>.处理执行结果: <1>.查询语句,返回记录集ResultSet <2>.更新语句,返回数字,表示该更新影响的记录数 <3>.ResultSet的方法:while(re.next()) next(),将游标往后移动一行,如果成功返回true;否则返回false getInt("id")或getSting("name"),返回当前游标下某个字段的值 5>.释放数据库连接 rs.close(); ps.close(); /stat.close(); con.close(); 3、创建可滚动、更新的记录集 1>.创建Statement时指定参数:该Statement取得的ResultSet就是可滚动的 Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE, ResultSet.CONCUR_READ_ONLY); 2>.创建PreparedStatement时指定参数 PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs.absolute(9000);

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值