SSH框架整合实战

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:SSH整合将Struts2、Spring和Hibernate三大框架集成,构建MVC架构的Java Web应用。本课程设计项目提供完整的整合流程实战,涵盖环境配置、Struts2、Spring、Hibernate的配置和整合,以及MVC模式的代码编写。通过本项目,学生将掌握SSH框架的应用,提升Web开发技能,为企业级应用开发奠定基础。 ssh整合jar包

1. SSH整合Jar包

第一章:SSH框架简介

SSH框架是一种流行的Java Web开发框架,它集成了Struts2、Spring和Hibernate三个优秀的开源框架,为开发者提供了强大的功能和便利性。SSH框架具有以下特性和优势:

  • 模块化设计: SSH框架采用模块化设计,每个模块负责不同的功能,方便开发和维护。
  • 高可扩展性: SSH框架支持自定义扩展,开发者可以根据需要添加或替换模块,满足不同的业务需求。
  • 高性能: SSH框架经过优化,具有较高的性能,可以处理高并发请求。
  • 广泛应用: SSH框架被广泛应用于各种Web开发项目,包括企业级应用、电商系统和博客系统。

2. Struts2配置与应用

2.1 Struts2框架概述

2.1.1 Struts2框架的特性和优势
  • MVC架构: Struts2遵循MVC(模型-视图-控制器)架构,将应用程序逻辑、表示层和业务逻辑分离,提高了代码的可维护性和可扩展性。
  • 基于注解: Struts2广泛使用注解,简化了动作类的配置,提高了开发效率。
  • 拦截器: Struts2提供了强大的拦截器机制,允许在动作执行前后执行特定的代码,增强了应用程序的安全性、日志记录和验证。
  • 结果类型: Struts2支持多种结果类型,包括JSP、Velocity、FreeMarker等,方便开发人员选择最合适的表示层技术。
  • 标签库: Struts2提供了丰富的标签库,用于简化JSP页面的开发,提高了开发效率。
2.1.2 Struts2框架的体系结构

Struts2框架主要由以下组件组成:

  • 控制器(Action): 处理用户请求,负责业务逻辑和数据处理。
  • 拦截器(Interceptor): 在Action执行前后执行,用于增强应用程序的安全性、日志记录和验证。
  • 结果(Result): 指定Action执行后的结果,可以是JSP页面、Velocity模板或其他表示层技术。
  • 值栈(ValueStack): 一个对象栈,用于在Action、拦截器和结果之间传递数据。
  • 标签库(Tag Library): 简化JSP页面的开发,提供用于创建表单、链接和其他HTML元素的标签。

2.2 Struts2配置文件

2.2.1 struts.xml配置文件的结构和内容

struts.xml配置文件是Struts2框架的核心配置文件,用于配置Action、拦截器、结果和其他组件。其结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<struts>
  <package name="default" namespace="/" extends="struts-default">
    <action name="index" class="com.example.IndexAction">
      <result name="success">/index.jsp</result>
    </action>
  </package>
</struts>
  • <package> 元素定义一个包,用于分组和配置相关的Action。
  • <action> 元素定义一个Action,包括其名称、类名和结果。
  • <result> 元素定义一个结果,包括其名称和目标页面。
2.2.2 struts.properties配置文件的配置项

struts.properties配置文件用于配置Struts2框架的全局设置,包括:

  • struts.devMode: 启用或禁用开发模式,在开发模式下,Struts2会提供更详细的错误信息。
  • struts.enable.DynamicMethodInvocation: 启用或禁用动态方法调用,允许Action方法的名称与请求参数匹配。
  • struts.convention.action.suffix: 指定Action类名称的后缀,默认为"Action"。
  • struts.convention.result.suffix: 指定结果类型名称的后缀,默认为"jsp"。

2.3 Struts2动作类

2.3.1 动作类的创建和执行流程

动作类是Struts2框架的核心组件,负责处理用户请求和执行业务逻辑。其创建和执行流程如下:

  1. 创建一个Java类,继承自 com.opensymphony.xwork2.ActionSupport
  2. 在动作类中定义方法,用于处理不同的用户请求。
  3. 在struts.xml配置文件中配置动作类,指定其名称、类名和结果。
  4. 用户向服务器发送请求,Struts2框架根据请求参数匹配动作类。
  5. Struts2框架创建动作类的实例,并调用其对应的方法。
  6. 动作类执行业务逻辑,并返回一个结果类型。
  7. Struts2框架根据结果类型,渲染相应的表示层页面。
2.3.2 动作类的注解和配置

Struts2支持使用注解来配置动作类,简化了开发过程。常用的注解包括:

  • @Action :指定动作的名称和路径。
  • @Result :指定动作执行后的结果。
  • @Interceptor :指定在动作执行前后执行的拦截器。
@Action(value="index")
public class IndexAction extends ActionSupport {

  @Override
  public String execute() {
    // 业务逻辑
    return SUCCESS;
  }

  @Result(name="success", location="/index.jsp")
  public String success() {
    // 返回成功结果
    return null;
  }

}

2.4 Struts2结果类型

2.4.1 常用的结果类型

Struts2支持多种结果类型,用于指定动作执行后的处理方式。常用的结果类型包括:

  • JSP: 渲染JSP页面。
  • Velocity: 渲染Velocity模板。
  • FreeMarker: 渲染FreeMarker模板。
  • Redirect: 重定向到指定的URL。
  • Forward: 转发到指定的Action。
2.4.2 自定义结果类型

除了内置的结果类型,Struts2还允许开发人员自定义结果类型。可以通过实现 com.opensymphony.xwork2.Result 接口来创建自定义结果类型。

public class MyResult implements Result {

  @Override
  public void execute(ActionInvocation invocation) throws Exception {
    // 自定义结果逻辑
  }

}

3. Spring配置与应用

3.1 Spring框架概述

3.1.1 Spring框架的特性和优势

Spring框架是一个轻量级、可扩展的Java应用程序框架,旨在简化企业级应用程序的开发。其主要特性和优势包括:

  • 依赖注入(DI): Spring框架使用依赖注入机制,通过容器将依赖关系注入到对象中,简化了对象之间的耦合关系。
  • 面向方面编程(AOP): Spring框架支持面向方面编程,允许开发者将横切关注点(如日志记录、安全性和事务管理)从业务逻辑中分离出来。
  • 容器管理: Spring框架提供了一个容器,负责管理对象的创建、配置和生命周期。
  • 声明式事务管理: Spring框架提供了声明式事务管理功能,允许开发者通过注解或XML配置轻松管理事务。
  • 测试支持: Spring框架提供了一套全面的测试支持工具,简化了应用程序的测试。

3.1.2 Spring框架的体系结构

Spring框架采用分层体系结构,每一层都提供特定的功能:

  • 核心容器: 核心容器负责管理Bean的生命周期和依赖注入。
  • 数据访问层: 数据访问层提供对各种数据源(如JDBC、Hibernate)的访问支持。
  • Web层: Web层提供对Web应用程序的支持,包括MVC框架和RESTful Web服务。
  • AOP层: AOP层提供面向方面编程的支持。
  • 测试层: 测试层提供测试支持工具。

3.2 Spring配置文件

3.2.1 applicationContext.xml配置文件的结构和内容

applicationContext.xml 是Spring框架的主要配置文件,用于定义Bean和配置应用程序。其结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- Bean定义 -->

</beans>

Bean定义是配置文件中最重要的部分,用于定义Spring容器管理的对象。每个Bean定义包含以下元素:

  • <bean> :定义一个Bean。
  • id :Bean的唯一标识符。
  • class :Bean的类名。
  • property :Bean的属性设置。

3.2.2 bean标签和property标签的用法

bean 标签用于定义Bean, property 标签用于设置Bean的属性。以下是一个示例:

<bean id="myBean" class="com.example.MyBean">
    <property name="name" value="John Doe" />
    <property name="age" value="30" />
</bean>

此示例定义了一个名为 myBean 的Bean,其类名为 com.example.MyBean 。Bean有两个属性: name age ,其值分别为 "John Doe" 30

3.3 Spring Bean

3.3.1 Bean的创建和生命周期

Spring框架使用反射机制创建Bean。Bean的生命周期由以下阶段组成:

  • 实例化: Spring容器使用反射机制创建Bean实例。
  • 属性设置: Spring容器使用依赖注入机制设置Bean的属性。
  • 初始化: Spring容器调用Bean的 init() 方法(如果存在)。
  • 使用: 应用程序使用Bean。
  • 销毁: Spring容器调用Bean的 destroy() 方法(如果存在)。

3.3.2 Bean的依赖注入和自动装配

Spring框架支持两种依赖注入方式:

  • 构造器注入: 通过Bean的构造函数注入依赖关系。
  • 属性注入: 通过Bean的属性注入依赖关系。

Spring框架还支持自动装配功能,可以自动将容器中符合条件的Bean注入到其他Bean中。

3.4 Spring事务管理

3.4.1 事务的概念和实现

事务是一组原子操作,要么全部成功,要么全部失败。Spring框架使用 TransactionManager 接口和 @Transactional 注解实现事务管理。

3.4.2 Spring事务管理的配置和使用

Spring事务管理的配置和使用需要以下步骤:

  • applicationContext.xml 中配置 TransactionManager Bean。
  • 在需要事务管理的方法上添加 @Transactional 注解。

以下是一个示例:

@Service
public class MyService {

    @Transactional
    public void doSomething() {
        // 事务性操作
    }
}

此示例中, doSomething() 方法被标记为事务性方法。当调用此方法时,Spring框架将自动开启一个事务,在方法执行完毕后提交或回滚事务。

4. Hibernate配置与应用

4.1 Hibernate框架概述

4.1.1 Hibernate框架的特性和优势

  • 对象/关系映射(ORM): Hibernate是一个ORM框架,它允许开发者使用面向对象的编程语言(如Java)来操作关系型数据库。
  • 透明性: Hibernate在对象和关系数据之间提供了一个透明层,开发者无需直接处理SQL语句或数据库连接。
  • 持久化: Hibernate管理对象的持久化,自动将对象状态同步到数据库中。
  • 查询语言(HQL): Hibernate提供了一种类似于SQL的查询语言(HQL),用于查询和检索数据库中的数据。
  • 缓存: Hibernate使用缓存机制来提高查询性能,避免重复的数据库访问。

4.1.2 Hibernate框架的体系结构

Hibernate框架主要由以下组件组成:

  • SessionFactory: 负责创建和管理Session对象。
  • Session: 代表与数据库的连接,用于执行查询和持久化操作。
  • Transaction: 管理数据库事务,确保数据的完整性。
  • Criteria: 一种基于对象的查询机制,允许开发者使用面向对象的条件来查询数据库。
  • Query: 一种基于HQL的查询机制,用于执行复杂的查询。

4.2 Hibernate配置文件

4.2.1 hibernate.cfg.xml配置文件的结构和内容

hibernate.cfg.xml配置文件是Hibernate框架的核心配置文件,它包含了连接数据库、配置缓存和映射实体类等信息。

配置文件的基本结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <!-- 数据库连接配置 -->
    <session-factory>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/hibernate_demo</property>
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>
    </session-factory>
    <!-- 缓存配置 -->
    <cache provider_class="org.hibernate.cache.EhCacheProvider">
        <property name="cache.provider_configuration_file_resource_path">/ehcache.xml</property>
    </cache>
    <!-- 实体类映射 -->
    <mapping class="com.example.entity.User" />
</hibernate-configuration>

4.2.2 SessionFactory和Configuration对象的创建

// 创建Configuration对象,用于读取配置文件
Configuration configuration = new Configuration().configure("hibernate.cfg.xml");

// 创建SessionFactory对象,用于创建Session对象
SessionFactory sessionFactory = configuration.buildSessionFactory();

4.3 Hibernate实体类

4.3.1 实体类的映射和注解

Hibernate使用注解或XML映射文件将Java实体类映射到关系型数据库表。

@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "username")
    private String username;

    @Column(name = "password")
    private String password;

    // 省略其他属性和方法
}

4.3.2 实体类的持久化和查询

// 创建Session对象
Session session = sessionFactory.openSession();

// 创建一个User对象
User user = new User();
user.setUsername("admin");
user.setPassword("123456");

// 开始事务
session.beginTransaction();

// 保存User对象到数据库
session.save(user);

// 提交事务
session.getTransaction().commit();

// 关闭Session对象
session.close();
// 创建Session对象
Session session = sessionFactory.openSession();

// 创建Criteria对象,用于查询User对象
Criteria criteria = session.createCriteria(User.class);

// 添加查询条件
criteria.add(Restrictions.eq("username", "admin"));

// 执行查询,返回User对象列表
List<User> users = criteria.list();

// 关闭Session对象
session.close();

4.4 Hibernate查询语言(HQL)

4.4.1 HQL的基本语法和用法

HQL是一种类似于SQL的查询语言,用于查询和检索数据库中的数据。

SELECT u FROM User u WHERE u.username = 'admin'

4.4.2 HQL的高级查询和关联查询

HQL支持高级查询和关联查询,可以方便地查询复杂的数据关系。

// 关联查询,查询User对象及其关联的Role对象
SELECT u, r FROM User u JOIN u.roles r WHERE u.username = 'admin'

5. SSH框架整合流程

5.1 SSH框架整合的原理和步骤

5.1.1 Struts2、Spring和Hibernate的协作关系

SSH框架整合的原理在于将Struts2、Spring和Hibernate这三个框架有机地结合在一起,发挥各自的优势,实现一个完整的Web应用程序开发框架。

  • Struts2 :负责处理用户请求,并根据请求将控制权转发给相应的动作类。
  • Spring :负责管理应用程序中的Bean,提供依赖注入和事务管理等功能。
  • Hibernate :负责管理与数据库的交互,提供对象-关系映射和持久化功能。

这三个框架协同工作,形成一个完整的Web应用程序开发框架,可以满足企业级应用程序开发的需求。

5.1.2 SSH框架整合的配置文件配置

SSH框架整合需要在配置文件中进行配置,以指定框架之间的协作关系。

Struts2配置文件

<!-- struts.xml -->
<struts>
    <package name="default" namespace="/" extends="struts-default">
        <action name="index" class="com.example.action.IndexAction">
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>

Spring配置文件

<!-- applicationContext.xml -->
<beans>
    <bean id="indexAction" class="com.example.action.IndexAction" scope="prototype"/>
</beans>

Hibernate配置文件

<!-- hibernate.cfg.xml -->
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">123456</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <mapping class="com.example.entity.User"/>
    </session-factory>
</hibernate-configuration>

通过这些配置文件的配置,Struts2、Spring和Hibernate这三个框架就可以协同工作,实现一个完整的Web应用程序开发框架。

5.2 SSH框架整合的常见问题和解决方法

在SSH框架整合过程中,可能会遇到一些常见问题,需要及时解决。

5.2.1 依赖冲突问题

由于Struts2、Spring和Hibernate都是第三方框架,可能会出现依赖冲突的问题。解决方法是使用依赖管理工具,如Maven或Gradle,来管理依赖关系,确保使用兼容的版本。

5.2.2 Bean注入失败问题

在Spring中,Bean的注入可能失败,原因可能是Bean的名称不正确或依赖关系没有正确配置。解决方法是检查Bean的名称是否正确,并确保依赖关系在Spring配置文件中正确配置。

5.3 SSH框架整合的最佳实践

为了确保SSH框架整合的最佳实践,需要遵循以下原则:

5.3.1 分层架构和模块化设计

采用分层架构和模块化设计,将应用程序划分为不同的层和模块,提高代码的可维护性和可扩展性。

5.3.2 依赖管理和版本控制

使用依赖管理工具管理依赖关系,并使用版本控制系统管理代码版本,确保应用程序的稳定性和可维护性。

6. MVC模式实践

6.1 MVC模式概述

6.1.1 MVC模式的原理和优势

MVC(Model-View-Controller)模式是一种设计模式,它将应用程序的逻辑和表示层分离开来。在MVC模式中,模型负责业务逻辑和数据处理,视图负责呈现数据,控制器负责处理用户输入和协调模型和视图之间的交互。

MVC模式的主要优势包括:

  • 可维护性: MVC模式将应用程序的逻辑和表示层分离开来,使得代码更容易维护和修改。
  • 可测试性: 模型和视图是独立的,这使得它们更容易进行单元测试。
  • 可扩展性: MVC模式允许轻松地添加或修改视图,而不会影响模型。
  • 灵活性: MVC模式允许使用不同的视图技术,例如JSP、Velocity和FreeMarker。

6.1.2 SSH框架中MVC模式的实现

SSH框架中MVC模式的实现如下:

  • 模型: 模型负责业务逻辑和数据处理。它通常由JavaBean或POJO(Plain Old Java Object)表示。
  • 视图: 视图负责呈现数据。它通常由JSP、Velocity或FreeMarker模板表示。
  • 控制器: 控制器负责处理用户输入和协调模型和视图之间的交互。它通常由Struts2 Action类表示。

6.2 SSH框架中MVC模式的实践

6.2.1 控制器的设计和实现

控制器是MVC模式的核心组件。它负责处理用户输入和协调模型和视图之间的交互。在SSH框架中,控制器通常由Struts2 Action类表示。

Action类是一个Java类,它继承自 com.opensymphony.xwork2.ActionSupport 类。Action类包含以下方法:

  • execute()方法: 该方法是Action类的入口点。它负责处理用户输入并协调模型和视图之间的交互。
  • prepare()方法: 该方法在 execute() 方法之前调用。它用于准备数据或执行其他初始化任务。
  • validate()方法: 该方法在 execute() 方法之前调用。它用于验证用户输入。

6.2.2 视图的渲染和数据绑定

视图负责呈现数据。在SSH框架中,视图通常由JSP、Velocity或FreeMarker模板表示。

视图模板使用OGNL表达式访问模型中的数据。OGNL表达式是一种类似于XPath的表达式语言,它允许从模型中提取数据。

6.2.3 模型的创建和维护

模型负责业务逻辑和数据处理。在SSH框架中,模型通常由JavaBean或POJO表示。

模型对象可以通过以下方式创建:

  • 手动创建: 可以手动创建模型对象并将其存储在请求或会话中。
  • 依赖注入: 可以使用Spring框架的依赖注入功能将模型对象注入到控制器中。

模型对象可以通过以下方式维护:

  • 持久化: 可以使用Hibernate框架将模型对象持久化到数据库中。
  • 缓存: 可以使用缓存框架将模型对象缓存起来,以提高性能。

7. SSH框架实战案例

7.1 基于SSH框架的博客系统

7.1.1 系统需求分析和设计

需求分析:

  • 用户注册和登录
  • 文章发布和管理
  • 评论和点赞功能
  • 后台管理系统

系统设计:

  • 数据库设计: 采用MySQL数据库,设计用户表、文章表、评论表等
  • Struts2配置: 使用Struts2框架处理用户请求和响应
  • Spring配置: 使用Spring框架管理Bean和事务
  • Hibernate配置: 使用Hibernate框架进行对象-关系映射和数据持久化
7.1.2 系统实现和部署

实现步骤:

  1. 创建Struts2配置文件 struts.xml ,配置动作类和结果类型
  2. 创建Spring配置文件 applicationContext.xml ,配置Bean和事务管理器
  3. 创建Hibernate配置文件 hibernate.cfg.xml ,配置SessionFactory和实体类映射
  4. 创建实体类,如 User Article Comment
  5. 创建动作类,如 UserAction ArticleAction CommentAction
  6. 创建JSP页面,如 index.jsp article.jsp comment.jsp

部署步骤:

  1. 将项目打包成WAR文件
  2. 部署WAR文件到Tomcat服务器
  3. 启动Tomcat服务器

7.2 基于SSH框架的电商系统

7.2.1 系统需求分析和设计

需求分析:

  • 商品管理
  • 订单管理
  • 支付和物流
  • 会员管理

系统设计:

  • 数据库设计: 采用MySQL数据库,设计商品表、订单表、支付表等
  • Struts2配置: 使用Struts2框架处理用户请求和响应
  • Spring配置: 使用Spring框架管理Bean和事务
  • Hibernate配置: 使用Hibernate框架进行对象-关系映射和数据持久化
7.2.2 系统实现和部署

实现步骤:

  1. 创建Struts2配置文件 struts.xml ,配置动作类和结果类型
  2. 创建Spring配置文件 applicationContext.xml ,配置Bean和事务管理器
  3. 创建Hibernate配置文件 hibernate.cfg.xml ,配置SessionFactory和实体类映射
  4. 创建实体类,如 Product Order Payment
  5. 创建动作类,如 ProductAction OrderAction PaymentAction
  6. 创建JSP页面,如 index.jsp product.jsp order.jsp

部署步骤:

  1. 将项目打包成WAR文件
  2. 部署WAR文件到Tomcat服务器
  3. 启动Tomcat服务器

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:SSH整合将Struts2、Spring和Hibernate三大框架集成,构建MVC架构的Java Web应用。本课程设计项目提供完整的整合流程实战,涵盖环境配置、Struts2、Spring、Hibernate的配置和整合,以及MVC模式的代码编写。通过本项目,学生将掌握SSH框架的应用,提升Web开发技能,为企业级应用开发奠定基础。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园2.0是高校信息化建设的新阶段,它面对着外部环境变化和内生动力的双重影响。国家战略要求和信息技术的快速发展,如云计算、大数据、物联网等,为智慧校园建设提供了机遇,同时也带来了挑战。智慧校园2.0强调以服务至上的办学理念,推动了教育模式的创新,并对传统人才培养模式产生了重大影响。 智慧校园建设的解决之道是构建一个开放、共享的信息化生态系统,利用互联网思维,打造柔性灵活的基础设施和强大的基础服务能力。这种生态系统支持快速迭代的开发和持续运营交付能力,同时注重用户体验,推动服务创新和管理变革。智慧校园的核心思想是“大平台+微应用+开放生态”,通过解耦、重构和统一运维监控,实现服务复用和深度融合,促进业务的快速迭代和自我演化。 智慧校园的总体框架包括多端协同,即“端”,它强调以人为中心,全面感知和捕获行为数据。这涉及到智能感知设备、超级APP、校园融合门户等,实现一“码”或“脸”通行,提供线上线下服务端的无缝连接。此外,中台战略是智慧校园建设的关键,包括业务中台和数据中台,它们支持教育资源域、教学服务域等多个领域,实现业务的深度融合和数据的全面治理。 在技术层面,智慧校园的建设需要分期进行,逐步解耦应用,优先发展轻量级应用,并逐步覆盖更多业务场景。技术升级路径包括业务数据化、数据业务化、校园设施智联化等,利用IoT/5G等技术实现设备的泛在互联,并通过人工智能与物联网技术的结合,建设智联网。这将有助于实现线上线下一网通办,提升校园安全和学习生活体验,同时支持人才培养改革和后勤管理的精细化。 智慧校园的建设不仅仅是技术的升级,更是对教育模式和管理方式的全面革新。通过构建开放、共享的信息化生态系统,智慧校园能够更好地适应快速变化的教育需求,提供更加个性化和高效的服务,推动教育创新和人才培养的高质量发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值