SpringMVC项目配置全过程详解

刚学习springmvc不久,各种配置我怕记不住,就写个随笔记录一下。

我的项目是springmvc+hibernate4。环境是windows+myeclipse(或eclipse)+jdk7+tomcat7+mysql

项目文件层级关系如图所示:

配置springmvc+hibernate4步骤:(如果使用hibernate3会有一些差别)

第一步:引入jar包。第一次为了方便,我将很多jar包和依赖包全部直接拷进去了,实际上只需要一部分。具体需要什么,就加什么,可以在网上查到。

注意:把jar包导入后需要对所有包Add to Build Path;然后对工程名右键Build Path——>configure Build Path——>Add External JARS选择tomcat路径,添加"servlet-api.jar"  "el-api.jar"  "jsp-api.jar" 这三个jar包。

 

第二步:配置数据源,注解扫描包。spring-context.xml(名字可以随便取)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">

    <!-- 注解扫描包 -->
    <context:component-scan base-package="main.java.lms" />
    <!-- 开启注解 -->
    <context:annotation-config />

    <!--数据源-mysql -->
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/laboratory" />
        <property name="username" value="root" />
        <property name="password" value="root" />
    </bean>
    <!--数据源-sqlserver -->
    <!-- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
        <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/> 
        <property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=laboratory"/> 
        <property name="username" value="root" /> <property name="password" value="root" 
        /> </bean> -->
    <!--数据源-oracle -->
    <!-- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> 
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/> <property 
        name="username" value="root" /> <property name="password" value="root" /> 
        </bean> -->


    <!-- Hibernate SessionFactory,hibernate3为class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" -->
    <!--设置属性说明  -->
    <!--hibernate.dialect设置方言  -->
    <!--hibernate.format_sql输出格式化的sql  -->
    <!--hibernate.show_sql控制台输出sql  -->
    <!--hibernate.hbm2ddl.auto 自动创建|更新|验证数据库表结构。有以下几个参数: 
        create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
        create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
        update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了
        但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。
        validate :每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。 -->
    <!--current_session_context_class使用缓存机制。(hibernate3:Thread或jta);(hibernate4:org.springframework.orm.hibernate4.SpringSessionContext)  -->
    <!--hibernate.cache.provider_class 使用Ehcache缓存;hibernate3是org.hibernate.cache.HashtableCacheProvider;hibernate4是net.sf.ehcache.hibernate.EhCacheProvider  -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
                <!-- <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop> -->
                <!-- <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> -->
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.format_sql">true</prop>
            </props>
        </property>
        <!--自动扫描(实体类)注解包 -->
        <property name="packagesToScan" value="main.java.lms"></property>
    </bean>
</beans>

 

 

第三步:配置试图解析器等,springmvc-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
    
    <!-- 注解扫描包 -->
    <context:component-scan base-package="main.java.lms" />

    <mvc:annotation-driven />

    <mvc:default-servlet-handler />

    <!-- spring mvc 视图解析器 -->
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/pages/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>
    
    
    <!--spring对hibernate的事务管理  -->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    
    <!-- 自动扫描事务注解 -->
    <tx:annotation-driven transaction-manager="transactionManager" />
    
    
    <!-- <bean id="exceptionResolver"
        class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="defaultErrorView">
            <value>error</value>
        </property>
        <property name="exceptionMappings">
            <props>
                <prop key="java.lang.RuntimeException">error</prop>
            </props>
        </property>
    </bean> -->

    <import resource="spring-context.xml" />
</beans>

 

 

第四步:配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>LaboratorySystemSpringmvc</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/log4j.properties</param-value>
  </context-param>
  <context-param>
    <param-name>log4jRefreshInterval</param-name>
    <param-value>3000</param-value>
  </context-param>
  <listener>
    <listener-class>  
            org.springframework.web.util.Log4jConfigListener  
        </listener-class>
  </listener>
  
   <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring-context.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <filter>
    <filter-name>encodingFilter</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>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
  </listener>
  <servlet>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/springmvc-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  
  <!--getCurrentSession()事务会自动关闭,所以在所有jsp页面查询数据都会关闭session。要想在jsp查询数据库需要加入下面这个  -->
  <filter>
    <filter-name>SpringOpenSessionInViewFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>SpringOpenSessionInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

 

 

第五步:新建实例

package main.java.lms.entities;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

/**
 * 用户表
 * 
 */
@Entity
@Table(name="lms_user")
public class User implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = -1461373625778051299L;
    private int userId;
    private String loginNumber;// 登陆名,即学号或工号
    private String loginPassword;
    private String userName;
    private String userIdentity;// 身份:学生,老师管理员:3,2,1

    // 用户扩展表(与用户一对一级联关系)
    private UserExtends userExtends;

    public User(String loginNumber, String loginPassword) {
        this.loginNumber = loginNumber;
        this.loginPassword = loginPassword;
    }

    public User() {
    }

    
    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="user_ex_loginName",unique=true,referencedColumnName="user_ex_loginName")
    public UserExtends getUserExtends() {
        return userExtends;
    }

    public void setUserExtends(UserExtends userExtends) {
        this.userExtends = userExtends;
    }

    @Id
    @Column(name = "user_id", unique = true, nullable = false)
    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    @Column(name = "user_loginName", unique = true, nullable = false)
    public String getLoginNumber() {
        return loginNumber;
    }

    public void setLoginNumber(String loginNumber) {
        this.loginNumber = loginNumber;
    }

    @Column(name = "user_loginPassword", nullable = false)
    public String getLoginPassword() {
        return loginPassword;
    }

    public void setLoginPassword(String loginPassword) {
        this.loginPassword = loginPassword;
    }

    @Column(name = "user_name", nullable = false)
    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    @Column(name = "user_identity", nullable = false)
    public String getUserIdentity() {
        return userIdentity;
    }

    public void setUserIdentity(String userIdentity) {
        this.userIdentity = userIdentity;
    }

}

 

package main.java.lms.entities;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;

/**
 * 用户扩展表
 * 
 */
@Entity
@Table(name = "lms_userextends")
public class UserExtends implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 8046904045928469438L;
    // 用户(与用户扩展表一对一级联关系)
    private User user;
    private String userExLoginNumber;
    private int sex;
    private String idCard;
    private String national;// 民族
    private String politicalLandscape;// 政治面貌
    private String placeOfOrigin;// 籍贯

    private String studyType;// 学生类别,本科专科:1本2专
    private String studentDepartment;// 所在系别
    private String studentProfessional;// 专业
    private String studentProfessionalDirection;// 专业方向
    private int stduentClass;// 班级
    private int grade;// 年级

    private String workDepartment;// 工作部门单位
    private String workPosition;// 工作职位
    private String workTitle;// 职称

    private String phoneNumber;
    private String email;
    private String address;
    private int postalCode;

    @OneToOne(mappedBy="userExtends",cascade=CascadeType.ALL)
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Id
    @Column(name = "user_ex_loginName", unique = true, nullable = false)
    public String getUserExLoginNumber() {
        return userExLoginNumber;
    }

    public void setUserExLoginNumber(String userExLoginNumber) {
        this.userExLoginNumber = userExLoginNumber;
    }

    @Column(name = "user_sex")
    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    @Column(name = "user_idCard")
    public String getIdCard() {
        return idCard;
    }

    public void setIdCard(String idCard) {
        this.idCard = idCard;
    }

    @Column(name = "user_national")
    public String getNational() {
        return national;
    }

    public void setNational(String national) {
        this.national = national;
    }

    @Column(name = "user_politicalLandscape")
    public String getPoliticalLandscape() {
        return politicalLandscape;
    }

    public void setPoliticalLandscape(String politicalLandscape) {
        this.politicalLandscape = politicalLandscape;
    }

    @Column(name = "user_placeOfOrigin")
    public String getPlaceOfOrigin() {
        return placeOfOrigin;
    }

    public void setPlaceOfOrigin(String placeOfOrigin) {
        this.placeOfOrigin = placeOfOrigin;
    }

    @Column(name = "user_studyType")
    public String getStudyType() {
        return studyType;
    }

    public void setStudyType(String studyType) {
        this.studyType = studyType;
    }

    @Column(name = "user_studentDepartment")
    public String getStudentDepartment() {
        return studentDepartment;
    }

    public void setStudentDepartment(String studentDepartment) {
        this.studentDepartment = studentDepartment;
    }

    @Column(name = "user_studentProfessional")
    public String getStudentProfessional() {
        return studentProfessional;
    }

    public void setStudentProfessional(String studentProfessional) {
        this.studentProfessional = studentProfessional;
    }

    @Column(name = "user_studentProfessionalDirection")
    public String getStudentProfessionalDirection() {
        return studentProfessionalDirection;
    }

    public void setStudentProfessionalDirection(
            String studentProfessionalDirection) {
        this.studentProfessionalDirection = studentProfessionalDirection;
    }

    @Column(name = "user_studentClass")
    public int getStduentClass() {
        return stduentClass;
    }

    public void setStduentClass(int stduentClass) {
        this.stduentClass = stduentClass;
    }

    @Column(name = "user_grade")
    public int getGrade() {
        return grade;
    }

    public void setGrade(int grade) {
        this.grade = grade;
    }

    @Column(name = "user_workDepartment")
    public String getWorkDepartment() {
        return workDepartment;
    }

    public void setWorkDepartment(String workDepartment) {
        this.workDepartment = workDepartment;
    }

    @Column(name = "user_workPosition")
    public String getWorkPosition() {
        return workPosition;
    }

    public void setWorkPosition(String workPosition) {
        this.workPosition = workPosition;
    }

    @Column(name = "user_workTitle")
    public String getWorkTitle() {
        return workTitle;
    }

    public void setWorkTitle(String workTitle) {
        this.workTitle = workTitle;
    }

    @Column(name = "user_phoneNumber")
    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    @Column(name = "user_email")
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Column(name = "user_address")
    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Column(name = "user_postalCode")
    public int getPostalCode() {
        return postalCode;
    }

    public void setPostalCode(int postalCode) {
        this.postalCode = postalCode;
    }

}

 

第六步:controller层

@Controller
public class UserController {
    
    @Autowired
    private UserServices userServices;/**
     * 映射首页的地址,如果已登录跳转到首页,未登录跳转到登录界面
     * @param request
     * @param response
     * @return
     */
    @RequestMapping(value="/index.html",method=RequestMethod.GET)
    public String toIndex(HttpServletRequest request,HttpServletResponse response){
        HttpSession session=request.getSession();
        if(session.getAttribute("user")!=null){
            return "user/index";
        }else {
            try {
                response.sendRedirect(request.getContextPath()+"/login.html");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return "user/login";
        }
    }/**
     * 执行登录操作
     * @param request
     * @param response
     * @throws IOException
     */
    @RequestMapping(value="/login.action",method=RequestMethod.POST)
    public void Login(HttpServletRequest request,HttpServletResponse response) throws IOException{
        HttpSession session=request.getSession();
        String userName=request.getParameter("loginName");
        String userPassword=request.getParameter("loginPassword");
        String yanzhengma=request.getParameter("yanzhengma");
        String randNum=(String) request.getSession().getAttribute("random");
        System.out.println("系统生成的验证码:"+randNum);
        System.out.println("登陆界面传过来的验证码:"+yanzhengma);
        //不区分大小写比较相等
        if(!randNum.equalsIgnoreCase(yanzhengma)){
            response.setContentType("text/html;charset=UTF-8");
            response.getWriter().print("yanzhengmaError");
            return;
        }
        User user=new User();
        user.setLoginNumber(userName);
        user.setLoginPassword(userPassword);
        user=this.userServices.userLogin(user);
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=UTF-8");
        try {
            if(user!=null){
                session.setAttribute("user", user);
                response.getWriter().print("true");
            }else {
                response.getWriter().print("false");
            }
        } catch (Exception e) {
        }
    }
}

 

第七步:service层 

@Transactional
@Service("userService")
public class UserServicesImpl implements UserServices{

    @Autowired
    private UserDao userDao;

    @Override
    public User userLogin(User user) {
        System.out.println("call service");
        User user2=this.userDao.userLogin(user);
        return user2;
    }
}

 

 第八步:dao层

(1)使用hql

@Repository("userDao")
public class UserDaoImpl implements UserDao {

    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public User userLogin(User user) {
        System.out.println("call dao");
        User user2 = (User) this.sessionFactory
                .getCurrentSession()
                .createQuery(
                        "FROM User u where u.loginNumber=:loginName and u.loginPassword=:password")
                .setString("loginName", user.getLoginNumber())
                .setString("password", user.getLoginPassword()).uniqueResult();
        return user2;
    }
}

(2)使用原生sql

@Repository("deviceDao")
@SuppressWarnings("unchecked")
public class DeviceDaoImpl implements DeviceDao {

    @Autowired
    private SessionFactory sessionFactory;

    /**
     * 查询所有仓库设备
     * 
     */
    @Override
    public List<Device> getDevice() {
        // isdelete = 2199-12-31 23:59:59,表示有效
        String sql = "SELECT id AS deviceId,name,info,avaiNum,damageNum FROM lms_device WHERE isDelete = '2199-12-31 23:59:59'";
        SQLQuery query = sessionFactory.getCurrentSession().createSQLQuery(sql);
        query.addScalar("deviceId", StandardBasicTypes.INTEGER);
        query.addScalar("name", StandardBasicTypes.STRING);
        query.addScalar("info", StandardBasicTypes.STRING);
        query.addScalar("avaiNum", StandardBasicTypes.INTEGER);
        query.addScalar("damageNum", StandardBasicTypes.INTEGER);
        query.setResultTransformer(Transformers.aliasToBean(Device.class));
        return query.list();
    }
}

 

最后补充:为了方便在控制台看见后台操作的结果,能够输出后台执行情况,再加一个文件log4j.properties

 1 ##OFF->FATAL->ERROR->WARN->INFO->DEBUG->ALL
 2 ##ERROR->WARN->INFO->DEBUG
 3 # define a logger named CONSOLE
 4 log4j.rootLogger=INFO, CONSOLE  
 5 # CONSOLE logger - console
 6 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
 7 # COSOLE Layout 
 8 log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
 9 # CONSOLE format Layout
10 log4j.appender.CONSOLE.layout.ConversionPattern=%5p %d{yyyy-MM-dd HH:mm:ss,SSS} %c:(%F:%L) - %m%n 

 

所有的配置文件就是下面这几个。

到这里,再写好jsp页面就可以运行一个springmvc的网站了。

 

第一次写博客,谨记。

转载于:https://www.cnblogs.com/liuqinc/p/5764448.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值