SpringMVC 知识总结(二):请求参数的绑定

SpringMVC数据绑定:从请求参数到Java对象的转换过程 在实际应用中,经常需要处理一些非标准格式的数据,如自定义日期格式、特殊格式的字符串等。SpringMVC提供了多种自定义类型转换的机制,包括PropertyEditor、Converter和Formatter。PropertyEditor是JavaBeans规范的一部分,主要用于字符串和对象之间的转换;Converter是Spring 3引入的更通用的类型转换接口,可以在任意两种类型之间进行转换;Formatter专注于字符串和对象之间的格式化和解析,尤其适合处理本地化场景。 阅读详情

一: 请求参数的绑定

1.1绑定说明

1.1.1 绑定的机制

我们都知道,表单中请求参数都是基于 key=value 的。SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。
例如:

<a href="account/findAccount?accountId=10">查询账户</a>

中请求参数是:
accountId=10

/**
* 查询账户
* @return
*/
@RequestMapping("/findAccount")
public String findAccount(Integer accountId) {
	System.out.println("查询了账户。。。。 "+accountId);
	return "success";
}

1.1.2 支持的数据类型:

  • 基本类型参数: 包括基本类型和 String 类型
  • POJO 类型参数: 包括实体类,以及关联的实体类
  • 数组和集合类型参数: 包括 List 结构和 Map 结构的集合(包括数组)
  • SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。

1.1.3 使用要求:

如果是基本类型或者 String 类型:要求我们的参数名称必须和控制器中方法的形参名称保持一致。 (严格区分大小写) 如果是 POJO 类型,或者它的关联对象:
要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。如果是集合类型,有两种方式:

  • 第一种: 要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。 给 List 集合中的元素赋值, 使用下标。 给 Map 集合中的元素赋值, 使用键值对。
  • 第二种: 接收的请求参数是 json 格式数据。需要借助一个注解实现。
  • 注意: 它还可以实现一些数据类型自动转换。 内置转换器全都在:
    org.springframework.core.convert.support 包下。 有:
    java.lang.Boolean -> java.lang.String : ObjectToStringConverter java.lang.Character -> java.lang.Number : CharacterToNumberFactory java.lang.Character -> java.lang.String : ObjectToStringConverter
    java.lang.Enum -> java.lang.String : EnumToStringConverter java.lang.Number -> java.lang.Character : NumberToCharacterConverter java.lang.Number -> java.lang.Number : NumberToNumberConverterFactory java.lang.Number -> java.lang.String : ObjectToStringConverter
    java.lang.String -> java.lang.Boolean : StringToBooleanConverter java.lang.String -> java.lang.Character : StringToCharacterConverter java.lang.String -> java.lang.Enum : StringToEnumConverterFactory java.lang.String -> java.lang.Number : StringToNumberConverterFactory java.lang.String -> java.util.Locale : StringToLocaleConverter
    java.lang.String -> java.util.Properties : StringToPropertiesConverter java.lang.String -> java.util.UUID : StringToUUIDConverter
    java.util.Locale -> java.lang.String : ObjectToStringConverter
    java.util.Properties -> java.lang.String : PropertiesToStringConverter java.util.UUID -> java.lang.String : ObjectToStringConverter …
    如遇特殊类型转换要求,需要我们自己编写自定义类型转换器。

1.1.4 使用示例

1.1.4.1 基本类型和 String 类型作为参数

jsp 代码:

<!-- 基本类型示例 -->
<a href="account/findAccount?accountId=10&accountName=zhangsan">查询账户</a>

控制器代码:

/**
* 查询账户
* @return
*/
@RequestMapping("/findAccount")
public String findAccount(Integer accountId,String accountName) {
	System.out.println("查询了账户。。。。 "+accountId+","+accountName);
	return "success";
}

运行结果:
在这里插入图片描述

1.1.4.2 POJO 类型作为参数
实体类代码:
/**
* 账户信息
* @Version 1.0
*/
public class Account implements Serializable {
	private Integer id;
	private String name;
	private Float money;
	private Address address;
	//getters and setters
}
/**
* 地址的实体类
* @author
*/
public class Address implements Serializable {
	private String provinceName;
	private String cityName;
	//getters and setters
}

jsp 代码:

<!-- pojo 类型演示 -->
<form action="account/saveAccount" method="post">
账户名称: <input type="text" name="name" ><br/>
账户金额: <input type="text" name="money" ><br/>
账户省份: <input type="text" name="address.provinceName" ><br/>
账户城市: <input type="text" name="address.cityName" ><br/>
<input type="submit" value="保存">
</form>

控制器代码:

/**
* 保存账户
* @param account
* @return
*/
@RequestMapping("/saveAccount")
public String saveAccount(Account account) {
	System.out.println("保存了账户。。。。 "+account);
	return "success";
}

运行结果:
在这里插入图片描述

1.1.4.3 POJO 类中包含集合类型参数

实体类代码:

/**
* 用户实体类
* @Version 1.0
*/
public class User implements Serializable {
	private String username;
	private String password;
	private Integer age;
	private List<Account> accounts;
	private Map<String,Account> accountMap;
	//getters and setters
	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password + ", age="
		+ age + ",\n accounts=" + accounts
		+ ",\n accountMap=" + accountMap + "]";
	}
}

jsp 代码:

<!-- POJO 类包含集合类型演示 -->
<form action="account/updateAccount" method="post">
用户名称: <input type="text" name="username" ><br/>
用户密码: <input type="password" name="password" ><br/>
用户年龄: <input type="text" name="age" ><br/>
账户 1 名称: <input type="text" name="accounts[0].name" ><br/>
账户 1 金额: <input type="text" name="accounts[0].money" ><br/>
账户 2 名称: <input type="text" name="accounts[1].name" ><br/>
账户 2 金额: <input type="text" name="accounts[1].money" ><br/>
账户 3 名称: <input type="text" name="accountMap['one'].name" ><br/>
账户 3 金额: <input type="text" name="accountMap['one'].money" ><br/>
账户 4 名称: <input type="text" name="accountMap['two'].name" ><br/>
账户 4 金额: <input type="text" name="accountMap['two'].money" ><br/>
<input type="submit" value="保存">
</form>

控制器代码:

/**
* 更新账户
* @return
*/
@RequestMapping("/updateAccount")
public String updateAccount(User user) {
	System.out.println("更新了账户。。。。 "+user);
	return "success";
}

运行结果:
在这里插入图片描述

1.1.4.4 请求参数乱码问题

post 请求方式:
在 web.xml 中配置一个过滤器

<!-- 配置 springMVC 编码过滤器 -->
<filter>
	<filter-name>CharacterEncodingFilter</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>
	<!-- 启动过滤器 -->
	<init-param>
		<param-name>forceEncoding</param-name>
		<param-value>true</param-value>
	</init-param>
</filter>
<!-- 过滤所有请求 -->
<filter-mapping>
	<filter-name>CharacterEncodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

在 springmvc 的配置文件中可以配置,静态资源不过滤:

<!-- location 表示路径, mapping 表示文件, **表示该目录下的文件以及子目录的文件 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/scripts/" mapping="/javascript/**"/>

get 请求方式:
tomacat 对 GET 和 POST 请求处理方式是不同的, GET 请求的编码问题, 要改 tomcat 的 server.xml配置文件,如下:

<Connector connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"/>

改为:

<Connector connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"
useBodyEncodingForURI="true"/>

如果遇到 ajax 请求仍然乱码,请把:

useBodyEncodingForURI="true"改为 URIEncoding="UTF-8"

即可。

1.2特殊情况

1.2.1 自定义类型转换器

1.2.1.1 使用场景:

jsp 代码:

<!-- 特殊情况之:类型转换问题 -->
<a href="account/deleteAccount?date=2018-01-01">根据日期删除账户</a>

控制器代码:

/**
* 删除账户
* @return
*/
@RequestMapping("/deleteAccount")
public String deleteAccount(String date) {
	System.out.println("删除了账户。。。。 "+date);
	return "success";
}

运行结果:
在这里插入图片描述
当我们把控制器中方法参数的类型改为 Date 时:

/**
* 删除账户
* @return
*/
@RequestMapping("/deleteAccount")
public String deleteAccount(Date date) {
	System.out.println("删除了账户。。。。 "+date);
	return "success";
}

运行结果:
在这里插入图片描述
异常提示:

Failed to bind request element:
org.springframework.web.method.annotation.MethodArgumentTypeMismatchException:Failed to convert value of type 'java.lang.String' to required type'java.util.Date'; nested exception is
org.springframework.core.convert.ConversionFailedException:
Failed to convert from type [java.lang.String] to type [java.util.Date] for
value '2018-01-01'; nested exception is java.lang.IllegalArgumentException
1.2.1.2 使用步骤

第一步:定义一个类,实现 Converter 接口,该接口有两个泛型。

public interface Converter<S, T> {//S:表示接受的类型, T:表示目标类型
	/**
	* 实现类型转换的方法
	*/
	@Nullable
	T convert(S source);
}
/**
* 自定义类型转换器
* @Version 1.0
*/
public class StringToDateConverter implements Converter<String, Date> {
	/**
	* 用于把 String 类型转成日期类型
	*/
	@Override
	public Date convert(String source) {
		DateFormat format = null;
		try {
			if(StringUtils.isEmpty(source)) {
				throw new NullPointerException("请输入要转换的日期");
			}
			format = new SimpleDateFormat("yyyy-MM-dd");
			Date date = format.parse(source);
			return date;
		} catch (Exception e) {
			throw new RuntimeException("输入日期有误");
		}
	}
}

第二步:在 spring 配置文件中配置类型转换器。
spring 配置类型转换器的机制是,将自定义的转换器注册到类型转换服务中去。

<!-- 配置类型转换器工厂 -->
<bean id="converterService" class="org.springframework.context.support.ConversionServiceFactoryBean">
	<!-- 给工厂注入一个新的类型转换器 -->
	<property name="converters">
		<array>
			<!-- 配置自定义类型转换器 -->
			<bean class="com.test.web.converter.StringToDateConverter"></bean>
		</array>
	</property>
</bean>

第三步:在 annotation-driven 标签中引用配置的类型转换服务

<!-- 引用自定义类型转换器 -->
<mvc:annotation-driven
conversion-service="converterService"></mvc:annotation-driven>

运行结果:
在这里插入图片描述

1.2.2 使用 ServletAPI 对象作为方法参数

SpringMVC 还支持使用原始 ServletAPI 对象作为控制器方法的参数。支持原始 ServletAPI 对象有:

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
  • java.security.Principal
  • Locale
  • InputStream
  • OutputStream
  • Reader
  • Writer

我们可以把上述对象,直接写在控制的方法参数中使用。
部分示例代码:
jsp 代码:

<!-- 原始 ServletAPI 作为控制器参数 -->
<a href="account/testServletAPI">测试访问 ServletAPI</a>

控制器中的代码:

/**
* 测试访问 testServletAPI
* @return
*/
@RequestMapping("/testServletAPI")
public String testServletAPI(HttpServletRequest request,HttpServletResponse response,
HttpSession session) {
	System.out.println(request);
	System.out.println(response);
	System.out.println(session);
	return "success";
}

执行结果:
在这里插入图片描述

springmvc常用注解和请求参数绑定 三层架构 我们的开发架构一般都是基于两种形式,一种是 C/S 架构,也就是客户端/服务器,另一种是 B/S 架构,也就 是浏览器服务器。在 JavaEE 开发中,几乎全都是基于 B/S 架构的开发。那么在 B/S 架构中,系统标准的三层架构 包括:表现层、业务层、持久层。 表现层: 也就是我们常说的web层。它负责接收客户端请求,向客户端响应结果,通常客户端使用http协议请求 web ... 阅读详情

相关推荐

保姆级教程:用Zemax 18.9复现单模光纤耦合仿真(附康宁SMF-28e参数)

本文提供了一份详细的Zemax 18.9单模光纤耦合仿真教程,以康宁SMF-28e为例,涵盖从软件设置、材料参数输入到系统构建和优化的全流程。通过光束耦合分析和物理光学传播(POP)技术,帮助用户准确模拟光纤耦合效率,并解决常见问题,适用于光学设计初学者和专业人士。

weixin_27330481的博客 313

Java服务端获取URL请求参数的几种方法以及接收参数注解说明

一、下面为7种服务端获取前端传过来的参数的方法 常用的方法为:@RequestParam和@RequestBody 1、直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交。 /** * 1.直接把表单的参数写在Controller相应的方法的形参中 * @param username * @param password * @return */ @RequestMapping("/addUser1") public String addUs

Hzz的博客 2万+

C# WinForm项目目录结构详解:从入门到精通(附常见问题解决方案)

本文详细解析了C# WinForm项目目录结构,从解决方案与项目基础结构到核心文件功能,再到关键目录解析,帮助开发者快速掌握WinForm项目组织方式。文章还提供了常见问题解决方案,如引用丢失、配置文件不生效等,是WinForm开发从入门到精通的实用指南。

dream的博客 647

SpringMVC——请求参数的绑定

参数绑定说明 绑定机制 1.表单中请求参数都是基于key=value格式的 例:username=hehe&password=123 2.SpringMVC的参数绑定过程就是把表单请求的请求参数,作为控制器中方法的参数进行绑定的 3.要求表单提交的请求参数和控制器中方法的参数名称相同 请求参数支持的数据类型 1.基本数据类型和字符串类型 2.POJO类型参数:包括实体类、以及关联的实体类 3.数组和集合类型参数:包括List和Map等 数据类型使用要求 1.基本类型或String类型:要求请求参

Rong_zhe的博客 291

基于simulink的变压器保护仿真设计【MATLAB源码+Word文档】

电力系统变压器保护MATLAB/simulink仿真设计。纵联差动保护-过电流保护-距离保护

weixin_761237174的博客 1270

最全中文停用词表(可直接复制)

最全的停用此表整理 词表名 词表文件 中文停用词表 cn_stopwords.txt 哈工大停用词表 hit_stopwords.txt 百度停用词表 baidu_stopwords.txt 机器智能实验室停用词库 scu_stopwords.txt 以上停用词表链接:https://github.com/goto456/stopwords 以下是我常用的1893个停用词,可直接复制 ! " # $ % & ' ( ) * + , - -- . .. ... ....

dilifish的博客 12万+

mybatis传多个参数(不使用@param注解情况下),3.4.2版本之后使用#{0}-#{n}引起的参数绑定异常,以及settings属性中useActualParamName的作用。

解决方案:mybatis的xml配置文件中声明settings属性的useActualParamName参数值为false<setting name="useActualParamName" value="false" />代码展示:Dao层函数User getUserBys(int id,String name);对应的mapping.xml<select id="getUserBys" resu

彼岸的包子的博客 9364

Win10安全模式下修改C盘权限的完整指南(附解决开始菜单失灵方案)

本文提供了一份在Win10安全模式下修复因C盘权限误改导致开始菜单失灵的完整指南。文章深入剖析了权限体系,特别是TrustedInstaller角色的重要性,并详细讲解了通过安全模式进入系统、使用ICACLS命令或图形界面精准重置C盘关键目录权限的步骤,最终恢复系统核心功能。

weixin_29250403的博客 234

spring boot 基础学习 - 请求参数映射与参数j校验

spring boot 支持多种类型的请求参数映射 1.简单数据的映射 简单数据我们只需要给handler添加相应的形参,保证形参名称和页面请求参数的名称一致,spring 就会回自动的帮我们将请求参数进行格式装换并封装到形参中: handler代码: @RequestMapping("paramstest") public String simpleparam(Integer id

bugs4j的博客 3775

海康视觉脚本开发全流程解析

本文详细解析了海康机器视觉平台(VM)中脚本模块的开发全流程。从创建第一个脚本模块入手,深入讲解了输入参数、输出参数与内部变量的定义与区别,并提供了C#脚本编写、公用函数调用、代码结构组织以及编译调试的实用指南。旨在帮助开发者掌握海康视觉脚本开发的核心技巧,高效实现复杂的自定义视觉逻辑处理。

beer8的博客 601

swl安装无法与服务器建立链接,如何解决?

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 备注:部分问题/疑难杂症搜集于互联网。

**My Coding Family** 2075

SpringMVC01----请求匹配、参数绑定、常用注解

文章目录

LLturn的博客 949

鲁棒控制理论 --- H∞ 控制(被裁篇)

鲁棒控制理论 --- H∞ 控制

记录老板的每次pua,分享领导每天的毒鸡汤... 6万+

Spring MVC 请求参数绑定

Spring MVC 是一个用于构建 Web 应用程序的框架,它提供了一种方便的方式来处理 HTTP 请求和响应。在 Spring MVC 中,请求参数绑定是将 HTTP 请求中的参数映射到控制器方法的参数上的过程。Spring MVC 提供了多种方式来实现请求参数绑定。

write less , do more 6896

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

SpringMVC_请求参数的绑定

/** * 请求参数绑定 */ @Controller @RequestMapping(value = "/param") public class ParamController { } 绑定的机制 我们都知道,表单中请求参数都是基于 key=value 的,SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。 <h3>请求...

底层码农 6673

STM32F407中文手册

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

SpringMVC学习01:请求路径匹配和参数绑定

SpringMVC学习01:请求路径匹配和参数绑定SpringMVC入门案例案例程序案例执行流程分析SpringMVC核心组件请求路径匹配`@RequestMapping`注解: 匹配路径与处理器`@PathVaribale`注解: 绑定URL占位符,支持REST风格URLREST风格URL`@PathVaribale`注解的使用请求参数的绑定参数绑定的示例`@RequestParam`注解: 为...

ncepu_Chen的博客 6088

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

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

SpringMVC 请求参数绑定

1、@RequestMapping 作用:用于建立请求URL和处理请求方法之间的对应关系。 当该注解放在类上的时候就表示的是一级访问目录。 当该方法放在方法上的时候就表示是二级访问目录。 属性: value:用于指定请求的URL。它和path属性的作用是一样的。 method:用于指定请求的方式。 @RequestMapping(path = “/hello”,method = {Request...

Zystem 2635

SpringMVC请求参数的绑定

在 Web 开发中,表单提交、URL 传参等请求数据都是 k=v 格式(例如 username=haha&password=123)。SpringMVC 的参数绑定就是将这些请求数据自动映射到控制器方法的参数中,无需手动解析 Request 对象,极大简化了数据获取流程。// 主实体类:User// 用户名// 年龄// 嵌套引用类型(地址信息)// 集合类型(多个地址)// 全参构造、无参构造(可选,建议保留)// Getter + Setter(必须!

m0_62724751的博客 781

SpringMVC映射请求;SpringMVC返回值类型;SpringMVC参数绑定;

SpringMVC映射请求;SpringMVC返回值类型;SpringMVC参数绑定;

weixin_72637723的博客 1663

SpringMVC中请求参数的绑定【绑定机制、支持的数据类型、使用要求、乱码解决】(超详细)

请求参数的绑定请求参数绑定的概述绑定机制支持的数据类型使用要求支持的数据类型使用示例基本类型和 String 类型作为参数POJO 类型作为参数POJO 类中包含集合类型参数注意:这里我在浏览器输入了汉字,这里会涉及到乱码的解决,不处理会乱码 请求参数绑定的概述 绑定机制 1、表单提交的数据都是 key=value格式的,例如:username=Keafmd&password=666 2、SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的。 3、要求:提交表单

『愚』的博客 3520

SpringMVC 请求参数的绑定

文章目录 注:这篇博客主要讲的是 SpringMVC 中请求参数的绑定,里面涉及的 环境搭建以及代码 已经在上一篇博客中给出(SpringMVC环境搭建)。

Zzz5270的博客 812

SpringMVC 请求参数绑定全解析

-- 注册自定义转换器 -->

2302_79797878的博客 1066

SpringMvc中请求参数的绑定

文章目录1.请求参数的绑定说明2.请求参数绑定基本数据类型和字符串类型3.请求参数绑定实体类型3.1实体类中仅包含基本对象和字符串类型3.2 实体类型中包含引用类型4.配置解决中文乱码的过滤器(Post方式提交数据)5.请求参数绑定集合类型 1.请求参数的绑定说明 绑定机制: 1.表单提交的数据都是k=v格式的,username=hh&password=123 2.SpringMvc的参...

你今天真好看呀 948

【SpringMVC】请求参数绑定

【SpringMVC】请求参数绑定1. 基本类型参数+String类型参数2. POJO类型参数3. 数组和集合类型参数4. 自定义类型转换器5. 使用ServletAPI对象作为参数6. 解决请求参数乱码问题 如果是基本类型或者 String 类型: 要求我们的参数名称必须和控制器中方法的形参名称保持一致。 (严格区分大小写) 如果是 POJO 类型,或者它的关联对象: 要求表单中参数名称和 ...

来日浅谈的博客 722

SpringMVC框架 - 请求参数的绑定

请求参数绑定是SpringMVC框架自动将HTTP请求参数转换为控制器方法参数的过程,支持基本类型、实体对象和集合类型。绑定要求表单name属性与方法参数名一致且区分大小写。示例演示了基本类型绑定:通过User实体类、Controller方法和JSP表单实现数据自动填充,需配置前端控制器和字符编码过滤器。此外还介绍了嵌套对象绑定,如在User类中引用Address对象的情况。整体流程包括实体类定义、Controller编写、JSP表单创建和SpringMVC配置,最终实现请求参数到Java对象的自动转换。

m0_64928156的博客 851
上一篇: SpringMVC 知识总结(一):SpringMVC基本概念与入门
下一篇: SpringMVC 知识总结(三):常用注解及其使用示例
金心靖晨
博客等级 码龄9年 460粉丝 211原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值