全注解SSH

基于Maven的SSH全注解框架的搭建流程 基于Maven的SSH全注解框架的搭建流程 本章写这个全注解的SSH框架的搭建流程,这个是我学习之余自己总结的一个流程,如有不足还请多多指教。 如果想看半注解的SSH框架的搭建流程可以转到 https://blog.csdn.net/weixin_42322648/article/details/88954986 这里就写一个简单的登录的功能吧。 1、创建一个Maven项目 这里我命名为SSHPr... 阅读详情


全注解SSH 
一,hibernate annotation 
Class注解: 
1. @Entity:表明当前类是一个持久化类 
2. @Table(name="team",catalog="NBA"):映射一个表team,所对应的数据库是NBA,可以省略 
字段属性注解: 
1. @GenericGenerator(name = "generator", strategy = "increment") 
@Id 
@GeneratedValue(generator = "generator") 
@Column(name = "id", unique = true, nullable = false) 
解释:表明该字段是主键,自增长,不为空而且是唯一的 
2. @Column(name = "description", length = 500) 
解释:映射表中的description字段,长度是500 
3. @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "category") 
解释:级联操作:cascade = CascadeType.ALL,延迟加载:fetch = FetchType.LAZY,映射:mappedBy = "category",一对多方式 
4. @ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "category_id") 
解释:延迟加载:多对一方式,关联信息:外键name = "category_id" 
OneToMany事例代码: 
数据库:mysql 
category表:id,name,description (<Pk>id) 
product表:id,name,price,description,category_id 
(<pk>id ,<fk>category_id) 
Category.java 
package com.b510.examples; 
import java.util.HashSet; 
import java.util.Set; 
// 标准注解 
import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 
//增加的注解 
import org.hibernate.annotations.GenericGenerator; 
//当前的类是一个持久化类,是Category这个类。他映射了一个表category。所对应的 数据库是users 
//这句:@Table(name = "category", catalog = "users") 可以省略 
@Entity 
@Table(name = "category", catalog = "users") 
public class Category implements java.io.Serializable { 
private static final long serialVersionUID = 3240281547213597385L; 
private Integer id; 
private String name; 
private String description; 
private Set<Product> products = new HashSet<Product>(0); 

public Category() { 
} 
public Category(String name, String description, Set<Product> products) { 
this.name = name; 
this.description = description; 
this.products = products; 
} 
// 主键 :@Id 主键生成方式:strategy = "increment" 
//映射表中id这个字段,不能为空,并且是唯一的 
@GenericGenerator(name = "generator", strategy = "increment") 
@Id 
@GeneratedValue(generator = "generator") 
@Column(name = "id", unique = true, nullable = false) 
public Integer getId() { 
return this.id; 
} 
public void setId(Integer id) { 
this.id = id; 
} 
//映射表中name这个字段 ,长度是500 
@Column(name = "name", length = 500) 
public String getName() { 
return this.name; 
} 
public void setName(String name) { 
this.name = name; 
} 

//映射表中description这个字段 ,长度是500 
@Column(name = "description", length = 500) 
public String getDescription() { 
return this.description; 
} 
public void setDescription(String description) { 
this.description = description; 
} 
//级联操作:cascade = CascadeType.ALL 
//延迟加载:fetch = FetchType.LAZY 
//映射:mappedBy = "category" 
//一对多方式 
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "category") 
public Set<Product> getProducts() { 
return this.products; 
} 
public void setProducts(Set<Product> products) { 
this.products = products; 
} 
} 

Product.java 
代码: 
package com.b510.examples; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.Table; 
import org.hibernate.annotations.GenericGenerator; 

@Entity 
@Table(name = "product", catalog = "users") 
public class Product implements java.io.Serializable { 
private static final long serialVersionUID = -1546206493725028472L; 
private Integer id; 
private Category category; 
private String name; 
private String price; 
private String descripton; 

public Product() { 
} 
public Product(Category category, String name, String price, 
String descripton) { 
this.category = category; 
this.name = name; 
this.price = price; 
this.descripton = descripton; 
} 

@GenericGenerator(name = "generator", strategy = "increment") 
@Id 
@GeneratedValue(generator = "generator") 
@Column(name = "id", unique = true, nullable = false) 
public Integer getId() { 
return this.id; 
} 
public void setId(Integer id) { 
this.id = id; 
} 
//延迟加载:多对一方式 
//关联信息:外键name = "category_id" 
@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "category_id") 
public Category getCategory() { 
return this.category; 
} 
public void setCategory(Category category) { 
this.category = category; 
} 
@Column(name = "name", length = 500) 
public String getName() { 
return this.name; 
} 
public void setName(String name) { 
this.name = name; 
} 
@Column(name = "price", length = 10) 
public String getPrice() { 
return this.price; 
} 
public void setPrice(String price) { 
this.price = price; 
} 
@Column(name = "descripton", length = 500) 
public String getDescripton() { 
return this.descripton; 
} 
public void setDescripton(String descripton) { 
this.descripton = descripton; 
} 
} 

ManyToMany事例代码: 
你可以通过@ManyToMany注解可定义的多对多关联. 同时,你也需要通过注解@JoinTable描述关联表和关联条件. 如果是双向关联,其中一段必须定义为owner,另一端必须定义为inverse(在对关联表进行更新操作时这一端将被忽略): 
@Entity 
public class Employer implements Serializable { 
@ManyToMany( 
targetEntity=org.hibernate.test.metadata.manytomany.Employee.class, 
cascade={CascadeType.PERSIST, CascadeType.MERGE} 
) 
@JoinTable( 
name="EMPLOYER_EMPLOYEE", 
joinColumns=@JoinColumn(name="EMPER_ID"), 
inverseJoinColumns=@JoinColumn(name="EMPEE_ID") 
) 
public Collection getEmployees() { 
return employees; 
} 
... 
} 

@Entity 
public class Employee implements Serializable { 
@ManyToMany( 
cascade = {CascadeType.PERSIST, CascadeType.MERGE}, 
mappedBy = "employees", 
targetEntity = Employer.class 
) 
public Collection getEmployers() { 
return employers; 
} 
} 


二,Spring注释 
@Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository、@Service 和 @Controller。在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层、业务层和控制层(Web 层)相对应。虽然目前这 3 个注释和 @Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能。所以,如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释。 

@Controller 
例如 
@Controller 
public class SoftCreateController extends SimpleBaseController {} 
或者 
@Controller("softCreateController") 
说明:@Controller 负责注册一个bean 到spring 上下文中,bean 的ID 默认为类名称开头字母小写 

@Service 
例如 
@Service 
public class SoftCreateServiceImpl implements ISoftCreateService {} 
或者 
@Service("softCreateServiceImpl") 
说明:@Service 负责注册一个bean 到spring 上下文中,bean 的ID 默认为类名称开头字母小写 

@Autowired 
例如 
@Autowired 
private ISoftPMService softPMService; 
或者 
@Autowired(required=false) 
private ISoftPMService softPMService = new SoftPMServiceImpl(); 
说明: 
@Autowired 根据bean 类型从spring 上线文中进行查找,注册类型必须唯一,否则报异常。与@Resource 的区别在于,@Resource 允许通过bean 名称或bean 类型两种方式进行查找@Autowired(required=false) 表示,如果spring 上下文中没有找到该类型的bean 时, 才会使用new SoftPMServiceImpl(); 


@RequestMapping 
类 
@Controller @RequestMapping("/bbtForum.do") 
public class BbtForumController 
{ 
@RequestMapping(params = "method=listBoardTopic") 
public String listBoardTopic(int topicId,User user) 
{} 
} 
方法 
@RequestMapping("/softpg/downSoftPg.do") 
@RequestMapping(value="/softpg/ajaxLoadSoftId.do",method= POST) 
@RequestMapping(value = "/osu/product/detail.do", params = { "modify=false" }, method =POST) 
说明:@RequestMapping 可以声明到类或方法上 
参数绑定说明如果我们使用以下的 URL 请求: 
http://localhost/bbtForum.do?method=listBoardTopic&topicId=1&userId=10&userName=tomtopicId URL 参数将绑定到 topicId 入参上,而 userId 和 userName URL 参数将绑定到 user 对象的 userId 和 userName 属性中。和 URL 请求中不允许没有 topicId 参数不同,虽然 User 的 userId 属性的类型是基本数据类型,但如果 URL 中不存在 userId 参数,Spring 也不会报错,此时 user.userId 值为 0 。如果 User 对象拥有一个 dept.deptId 的级联属性,那么它将和 dept.deptId URL 参数绑定。 


@ModelAttribute 
作用域:request 
例如 
@RequestMapping("/base/userManageCooper/init.do") 
public String handleInit(@ModelAttribute("queryBean") ManagedUser sUser,Model model,){} 
或者 
@ModelAttribute("coopMap")// 将coopMap 返回到页 面 
public Map<Long,CooperatorInfo> coopMapItems(){} 
说明 
@ModelAttribute 声明在属性上,表示该属性的value 来源于model 里"queryBean" ,并被保存到model 里@ModelAttribute 声明在方法上,表示该方法的返回值被保存到model 里 


@Cacheable 和@CacheFlush 
@Cacheable :声明一个方法的返回值应该被缓 存例如:@Cacheable(modelId = "testCaching") 
@CacheFlush :声明一个方法是清空缓存的触发器例如:@CacheFlush(modelId = "testCaching") 

@Resource 
例如 
@Resource 
private DataSource dataSource; // inject the bean named 'dataSource' 
或者 
@Resource(name="dataSource") 
@Resource(type=DataSource.class) 

说明 
@Resource 默认按bean 的name 进行查找,如果没有找到会按type 进行查找,此时与@Autowired 类 似 
@PostConstruct 和@PreDestroy 
@PostConstruct 
在方法上加上注解@PostConstruct ,这个方法就会在Bean 初始化之后被Spring 容器执 行(注:Bean 初始化包括,实例化Bean ,并装配Bean 的属性(依赖注入))。 
@PreDestroy在方法上加上注解@PreDestroy ,这个方法就会在Bean 被销毁前被Spring 容器执行。 


@Repository 
与@Controller 、@Service 类似,都是向spring 上下文中注册bean ,不在赘述。 


@Component (不推荐使用) 
@Component 
@Component 是所有受Spring 管理组件的通用形式,Spring 还提供了更加细化的注解形式: @Repository 、@Service 、@Controller ,它们分别对应存储层Bean ,业务层Bean ,和展示层Bean 。 
目前版本(2.5 )中,这些注解与@Component 的语义是一样的,完全通用, 在Spring 以后的版本中可能会给它们追加更多的语义。 所以,我们推荐使用@Repository 、@Service 、@Controller 来替代@Component 。 


@Scope 
例如 
@Scope("session") 
@Repository() 
public class UserSessionBean implementsSerializable {} 
说明 

在使用XML 定义Bean 时,可以通过bean 的scope 属性来定义一个Bean 的作用范围,同样可以通过@Scope 注解来完成 


@SessionAttributes 
说明 
Spring 允许我们有选择地指定 ModelMap 中的哪些属性需要转存到 session 中,以便下一个请求属对应的 ModelMap 的属性列表中还能访问到这些属性。这一功能是通过类定义处标注 @SessionAttributes 注解来实现的。@SessionAttributes 只能声明在类上,而不能声明在方法上。 

例如 
@SessionAttributes("currUser") // 将ModelMap 中属性名为currUser 的属性@SessionAttributes({"attr1","attr2"}) 
@SessionAttributes(types=User.class) 
@SessionAttributes(types={User.class,Dept.class}) 
@SessionAttributes(types = {User.class,Dept.class},value={"attr1","attr2"}) 

@InitBinder 
说明 
如果希望某个属性编辑器仅作用于特定的 Controller ,可以在 Controller 中定义一个标注 @InitBinder 注解的方法,可以在该方法中向 Controller 了注册若干个属性编辑器 

例如 
@InitBinderpublic 
void initBinder(WebDataBinder binder) 
{ 
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
dateFormat.setLenient(false); 
binder.registerCustomEditor(Date.class, 
new CustomDateEditor(dateFormat, false)); 
} 
SSH框架整合实践:全注解配置方式 SSH框架是指Spring、Struts2和Hibernate这三个主流Java开发框架的整合。Spring主要负责业务逻辑层的事务管理与依赖注入;Struts2作为表现层框架,主要处理用户请求;Hibernate则作为数据持久层框架,进行数据库操作。此整合模式起源于Java EE开发的历史,因其强大的功能组合,一度成为企业级应用开发的首选方案。在Struts2中,@Action注解是最为核心的注解之一。它用于标记一个方法或类作为Struts2的Action。 阅读详情

相关推荐

SSH纯注解开发

struts2 spring hibernate 三大框架纯注解开发。。。。。。。。

ssh ajax怎么返回text,SSH系列:(15)自定义Result返回类型(StrutsResultSupport)

总的来说,写一个自定义的Result Type有三个步骤:(1)写一个实现了Result接口的类(2)对该类进行注册(3)使用该类下面分成两个部分:第1个部分,只要是侧重于项目上的使用方式,第2部分是整理自Sturcts In Action书上的自定义返回Json类型的Result Tye。1、对错误的特殊处理(项目中)在有些特殊情况下,如果没有异常信息,但是有错误,并且有错误信息等内容,此时也需...

weixin_39802784的博客 283

weblogic启动异常故障处理(boot认证失败)

root 用户生成的文件属主为 root,WebLogic进程将无权读取,直接导致认证失败。· ⚠️ 密码必须完全一致:第3步 AdminAccount 命令中设置的密码,与第5步所有 boot.properties 文件中 password= 字段的值,必须保证完全一致。如果您的域下配置了受管服务器实例(如 ms_server1、ms_server2 等),必须逐一更新各实例下的免密启动文件,确保实例重启时密码与AdminServer保持一致,否则实例启动会因认证失败而报错。此步骤至关重要,必须执行。

weixin_53389944的博客 220

SSH整合方式3——纯注解

目录 1. 引入jar包 2. 引入配置文件 2.1 web.xml 2.2 jdbc.properties 2.3 log4j.properties 2.4 applicationContext.xml 3. 配置Action 3.1 在spring中配置action,将action交给spring管理 3.2 配置Action的访问 3.2.1 在action类上再添加访问...

武汉小喽啰 712

用Linkboy玩转Arduino:3小时搞定智能倒车雷达(附仿真文件下载)

本文详细介绍了如何利用Linkboy图形化编程工具,在3小时内快速搭建一个基于Arduino的智能倒车雷达项目。通过仿真环境,初学者无需硬件即可学习超声波测距原理、报警逻辑设计,并完成从虚拟仿真到实体硬件的完整流程。文章提供了清晰的步骤、调试技巧及功能扩展思路,并附有仿真文件,是入门Arduino和智能硬件制作的绝佳实践指南。

weixin_29159441的博客 403

思科路由器、交换机组网实验报告

通过思科模拟器搭建路由交换网络

ghj528的博客 1335

spring注解开发和全注解开发

一、常用的一些注解说明: (1)Spring针对bean管理中为 创建对象/实例化对象提供注解 @Component(组件,范围大,没有明确的角色,可以通用) @Service在业务逻辑层使用(service层) @Controller在展现层(web)使用,控制器的声明(C) @Repository 在数据访问层使用(dao层) 上面四个注解的功能都是一样的,都可以用来创建bean 对象/实例。后三个更是见名知意,角色清晰。 (2)Spring针对bean 为对象的属性设置属性值也 提供注解 @Aut

weixin_38568503的博客 1232

计算机视觉——多视图几何

多视图几何1.前言1.1 多视图几何概念2. 基本原理2.1 对极几何2.2 基础矩阵2.2.1 基础矩阵推导2.2.2 求解基础矩阵3. 实验过程3.1 实验数据准备3.2 实验代码3.3 实验结果及分析4. 实验中遇到的问题 1.前言 1.1 多视图几何概念 多视图几何是利用在不同视点所拍摄图像间的关系,来研究照相机之间或者特征之间关系的一门科学。 多视图几何(Multiple View ...

RuiMa的博客 7715

SSH全注解框架整合

SSH全注解框架整合 原创地址 https://blog.csdn.net/duoluo9/article/details/78062797 1、ssh框架开发的应用层级结构 j2ee应用可以分为3层: 1、表示层2、业务逻辑层3、数据服务层ssh将应用分层更加细化(ssh将业务逻辑层划分了4层): 1、action层(控制层mvc中的c层)2、service层 &nbsp;(业务层mvc中的m层...

Alone5256的博客 332

S4 codingblock增加客户化字段的一些小问题

今天使用codingblock增加了两个客户化字段后(S4版本),查看常用的几个表 ACDOCA BSEG 等等两个客户化字段安静的出现在表内,以为没有问题了 。结果后来MM那边查看物料凭证时程序直接dump,后来开发查明原因居然是因为财务增加的这两个增强字段的原因。 报错如下图所示: 主要是因为增加了字段后,更新了后台表,但是没有自动更新到视图。就是MSEG表增加了这两个字段,但是呢他对应的视图NSDM_V_MSEG没有增加,导致两边的结构不一致。 所以要解决这个问题,只能在视图NSDM_V_MSEG增

m0_46145967的博客 3919

基于CLICKHOUSE的数据仓库分层规范

接入层。

zjyy1987的博客 769

SSH框架全注解需要注意的事项

今天刚用SSH全注解做项目,前端 用Ajax处理数据和进行页面跳转,但是不知道为什么跳转老是进不了action类里面,检查甚至重写了很多遍也是没用,后来跟同事讨论,多次修改发现是action类名的问题,我的原类名是Member_Mangager,后来改成了Member_MangagerAction就可以了,原来类名一定要以‘action’结尾,多加个单词都不行,包括包名也是这样,虽然不知道是什么原

Tranquility_111的博客 531

dolphinscheduler服务注册中心源码解析(一)服务注册与发现整体设计

下一篇文章我们开始讲解dolphinscheduler基于Zookeeper实现注册中心的源码解析。

最爱嫣夜来 375

ssh全注解框架整合

1、ssh框架开发的应用层级结构 j2ee应用可以分为3层: 1、表示层 2、业务逻辑层 3、数据服务层 ssh将应用分层更加细化(ssh将业务逻辑层划分了4层): 1、action层(控制层mvc中的c层) 2、service层  (业务层mvc中的m层) 3、dao层(数据访问层) 4、entity层(数据实体层

DL-ZhangTeng的博客 7370

在 ABAP Cloud 中玩转 CL_ABAP_PARALLEL 并行处理:从原理到实战

ABAP并行处理框架CL_ABAP_PARALLEL解析 本文系统介绍了SAP ABAP环境中实现并行处理的CL_ABAP_PARALLEL框架。该框架通过封装异步RFC和对话进程,为开发者提供了面向对象的API,显著提升大批量数据处理的效率。 文章首先分析了ABAP环境需要并行处理的原因:传统的串行处理在面对百万级数据时效率低下。然后详细介绍了CL_ABAP_PARALLEL的设计思路,它是一个"小型线程池"式的同步并行框架,适用于批量计算场景。此外,文章重点讲解了控制并行任务的关键参

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

VC中sqlite的使用

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

ssh全注解出现的一些问题

1、ssh全注解当我们继承hibernatedaosupport类时出现如下错误信息: Caused by: java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required 解决方法:在applicationContext.xml配置文件中的scheme中加入:    default

luopengdlc的专栏 390

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

SSH整合之用户登录(全注解)

SSH整合之用户登录(全注解)开发步骤 创建web工程 导入整合需要的jar包 创建实体类 创建DAO类 创建Service类 创建Action类 创建JSP页面 配置web.xml 配置application.xml 配置struts.xml 创建web工程导入整合需要的jar包创建实体类package com.zhang.domain;import javax.persistence.Entit

狼行千里 915

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

基于全注解方式的SSH基础框架

这是我为新项目专门搭建的基于全注解方式的SSH基础框架,虽然是老掉牙的的东西,自我感觉很良好,好东西不敢独享,晒晒等拍砖。 概述:基于struts2.23 + spring2.5.6 + hibernate3.6.4 + hibernate-generic-dao1.0(除了spring,我整合的都是最新的GA包,hibernate-generic-dao是google项目库中一个开源的ba

小兵qwer的专栏 566

SSH全注解方式遇到问题sessionFactory or hibernateTemplate is required

在SSH搭建工程时使用全注解方式 在运行时出现问题 sessionFactory or hibernateTemplate is required 查看HibernateDaoSupport的源代码得知:setSessionFactory方法是: public final void setSessionFactory(SessionFactory sessionFactory) {

wonder1053的专栏 3653

基于全注解的SSH简单框架

1, hibernate版本hibernate-distribution-3.6.10.Final struts版本struts-2.3.1.2 spring版本spring-framework-3.1.1.RELEASE aspectj版本aspect-1.6.12(用来产生动态代理的,所谓面向切面编程) 2, 包的列表,这边就不分了吧。。spring是全导进去了的,hibe

aimsam的专栏 1065

基于全注解的ssh的拦截器的写法

最近在用ssh框架写一个项目,是基于全注解的,上网搜了搜,这才发现全注解的struts的拦截器跟基于xml的拦截的写法略有不同,在这里小结一下,以备以后在写的时候忘了该怎么用。       struts.xml &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;!DOCTYPE struts PUBLIC "-//Apache ...

iteye_20932的博客 358

学习SSH全注解实例 过程(一)

SSHSpringHibernateMySQLlog4j 原文链接:http://www.java3z.com/cwbwebhome/article/article8/81135.html   在JavaEE 企业级开发中,以SSH2 框架为核心的应用非常广,大象根据项目实践经验,通过一个实例,详细的为大家讲解如何实现全注解式的开发。     开发环境     JDK

guozhanqiok的专栏 1051

学习SSH全注解实例

在JavaEE 企业级开发中,以SSH2 框 架为核心的应用非常广,大象根据项目实践经验,通过一个实例,详细的为大家讲解如何实现全注解式的开发。 开发环境 JDK 1.6.0 _18 Eclipse 3.2.1 MyEclipse 5.1.0 Tomcat 6.0.10 MySQL 5.0.27 Navic...

weixin_34107955的博客 74
上一篇: struts2 拦截器
下一篇: mysql 数据库配置
keepAction
博客等级 码龄15年 28粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值