为了账号安全,请及时绑定邮箱和手机立即绑定

JAVA web项目教程:新手入门全攻略

标签:
Java WebApp Spring

本文详细介绍了如何从零开始构建JAVA web项目教程,涵盖了开发环境搭建、项目结构、数据库连接与操作等关键环节。通过示例代码和实战项目案例,帮助读者掌握Java Web开发的核心技术。此外,文章还提供了调试技巧和常见问题的解决方法,确保项目开发顺利进行。

Java Web开发简介

Java Web技术概述

Java Web技术是一种用于构建动态Web应用的技术集合,它允许开发人员创建可扩展的、高并发的Web应用。Java Web技术主要基于Java平台,利用Servlet、JSP、JavaServer Pages(JSP)、JavaServer Faces(JSF)等技术来实现。这些技术允许开发人员创建动态页面,处理用户请求,以及与数据库进行交互。Java Web技术的优点包括跨平台性、强大的开发工具支持以及广泛的应用场景。

Web项目的常见应用场景

Java Web技术广泛应用于各种业务场景,包括但不限于电子商务、在线教育、企业资源计划(ERP)、内容管理系统(CMS)、社交平台等。例如,电子商务网站可以使用Java Web技术实现用户购物车功能、订单处理、支付接口集成等。在线教育平台可以利用Java Web技术实现课程管理、用户认证、在线考试等功能。

学习Java Web开发的必备技能

学习Java Web开发,你需要掌握Java语言基础,如变量、类型、条件语句和循环语句等。此外,熟悉HTML和CSS来构建前端页面是必要的。以下是一个简单的Java变量和类型示例:

public class Example {
    public static void main(String[] args) {
        int number = 42; // 整型变量
        double decimal = 3.14; // 双精度浮点型变量
        String message = "Hello, World!"; // 字符串变量
        boolean flag = true; // 布尔型变量
        System.out.println("Number: " + number);
        System.out.println("Decimal: " + decimal);
        System.out.println("Message: " + message);
        System.out.println("Flag: " + flag);
    }
}

同时,你还需要了解Servlet和JSP的基本用法,以及如何与数据库进行交互。这些技能将帮助你构建基本的Web应用并处理用户请求。

Java Web开发环境搭建

Java开发环境配置

在开始开发Java Web应用之前,你需要配置Java开发环境。首先,你需要下载并安装Java Development Kit (JDK)。下载页面为:https://www.oracle.com/java/technologies/javase-jdk11-downloads.html。安装过程中,请确保安装了最新版本的JDK,并将其添加到系统的环境变量中。

Web服务器的选择与配置(如Tomcat)

选择一个Web服务器是开发Java Web应用的重要步骤。Apache Tomcat是一个流行的选择,因为它易于配置且适合开发和测试。下载Tomcat的最新版本:https://tomcat.apache.org/download-90.cgi。安装完成后,将Tomcat的bin目录添加到系统的PATH环境变量中,以便可以在命令行中运行Tomcat的启动和停止命令。

配置Tomcat以支持Java Web应用通常涉及编辑conf目录下的server.xml文件,以配置服务器端口和其他设置。例如,配置端口8080:

<Server port="8005" shutdown="SHUTDOWN">
  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Host name="localhost" appBase="webapps"
            unpackWARs="true" autoDeploy="true" />
    </Engine>
  </Service>
</Server>

常用开发工具介绍(如Eclipse、IntelliJ IDEA)

开发Java Web应用时,使用集成开发环境(IDE)可以显著提高开发效率。Eclipse和IntelliJ IDEA是两个常用的选择。

  1. Eclipse:Eclipse是开源的,适合初学者使用。它提供了丰富的插件支持,可以轻松集成到项目中。下载地址为:https://www.eclipse.org/downloads/

  2. IntelliJ IDEA:IntelliJ IDEA是JetBrains开发的商业IDE,但它提供了免费的社区版本,适合个人和小团队使用。下载地址为:https://www.jetbrains.com/idea/download/#section=windows

配置IDE以支持Java Web开发通常包括安装插件和配置服务器环境。例如,在Eclipse中安装J2EE插件,可以使用以下步骤:

  1. 打开Eclipse,进入Help > Eclipse Marketplace
  2. 搜索“J2EE”插件并安装。
  3. 重启Eclipse。
  4. 通过File > New > Dynamic Web Project创建新的Web项目。
Java Web项目的基本结构

项目目录结构详解

Java Web项目的典型目录结构如下:

MyWebApp
│
├── WEB-INF
│   ├── classes
│   ├── lib
│   └── web.xml
├── index.jsp
└── images
  • WEB-INF/classes目录用于存储编译后的Java类文件。
  • WEB-INF/lib目录存放应用程序所需的JAR文件。
  • WEB-INF/web.xml是部署描述符文件,定义了Servlet、过滤器、监听器等组件的配置。
  • index.jsp是应用程序的主页面。
  • images目录可以存放图像资源。

常用开发框架介绍(如Spring、Spring Boot、MyBatis)

  1. Spring:Spring框架是一个广泛使用的框架,提供依赖注入(DI)、控制反转(IoC)、面向切面编程(AOP)等功能。Spring MVC是其构建Web应用的模块,支持MVC模式。

    示例代码:

    @Controller
    public class ExampleController {
       @RequestMapping("/")
       public String home() {
           return "index.jsp";
       }
    }

    映射器配置:

    <bean id="exampleController" class="com.example.controller.ExampleController" />
  2. Spring Boot:Spring Boot简化了Spring应用的配置和开发过程。它提供了自动配置功能和依赖管理,使得开发过程更加高效。

    示例代码:

    @SpringBootApplication
    public class ExampleApplication {
       public static void main(String[] args) {
           SpringApplication.run(ExampleApplication.class, args);
       }
    }
  3. MyBatis:MyBatis是一个持久层框架,提供了一种灵活的映射机制,将Java对象映射到数据库表。它简化了数据库操作,提供了强大的SQL映射功能。

    示例代码:

    public interface ExampleMapper {
       @Select("SELECT * FROM example_table WHERE id = #{id}")
       Example getExampleById(int id);
    }

    配置文件:

    <configuration>
       <environments default="development">
           <environment id="development">
               <transactionManager type="JDBC"/>
               <dataSource type="POOLED">
                   <property name="driver" value="com.mysql.jdbc.Driver"/>
                   <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
                   <property name="username" value="root"/>
                   <property name="password" value="password"/>
               </dataSource>
           </environment>
       </environments>
    </configuration>

Maven构建工具简介

Maven是一个流行的构建工具,用于管理Java项目的构建、依赖关系和文档生成。它通过pom.xml文件定义项目的配置,包括依赖、插件和构建配置。

构建项目:

mvn clean package

示例代码:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>example-app</artifactId>
  <version>1.0-SNAPSHOT</version>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <version>2.3.4.RELEASE</version>
    </dependency>
  </dependencies>
</project>
Java Web项目的开发流程

创建第一个简单的Web应用

创建一个简单的Web应用需要以下步骤:

  1. 创建项目目录

    mkdir MyWebApp
    cd MyWebApp
    mkdir WEB-INF
    mkdir WEB-INF/classes
    mkdir WEB-INF/lib
    mkdir images
  2. 编写JSP页面
    index.jsp

    <html>
    <head>
       <title>My Web Application</title>
    </head>
    <body>
       <h1>Welcome to My Web Application</h1>
    </body>
    </html>
  3. 配置web.xml
    WEB-INF/web.xml

    <web-app>
       <welcome-file-list>
           <welcome-file>index.jsp</welcome-file>
       </welcome-file-list>
    </web-app>
  4. 部署到Tomcat
    将项目目录放在Tomcat的webapps目录下,启动Tomcat服务器,访问http://localhost:8080/MyWebApp/即可看到主页。

Servlet和JSP的使用

Servlet是Java Web应用的基本组件,用于处理客户端请求和生成响应。JSP则是一种结合了Java代码和HTML的页面技术。

创建第一个Servlet

  1. 创建Servlet类

    package com.example.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class HelloServlet extends HttpServlet {
       @Override
       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           response.setContentType("text/html");
           response.getWriter().println("<h1>Hello, World!</h1>");
       }
    }
  2. 配置web.xml

    <web-app>
       <servlet>
           <servlet-name>HelloServlet</servlet-name>
           <servlet-class>com.example.servlet.HelloServlet</servlet-class>
       </servlet>
       <servlet-mapping>
           <servlet-name>HelloServlet</servlet-name>
           <url-pattern>/hello</url-pattern>
       </servlet-mapping>
       <welcome-file-list>
           <welcome-file>index.jsp</welcome-file>
       </welcome-file-list>
    </web-app>
  3. 部署并访问Servlet
    启动Tomcat服务器,访问http://localhost:8080/MyWebApp/hello,可以看到Servlet生成的页面。

创建第一个JSP页面

  1. 创建JSP页面
    hello.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
       <title>Hello JSP</title>
    </head>
    <body>
       <h1>Hello, <%= new java.util.Date() %></h1>
    </body>
    </html>
  2. 部署并访问JSP页面
    hello.jsp文件放在Web应用的根目录下,启动Tomcat服务器,访问http://localhost:8080/MyWebApp/hello.jsp,可以看到JSP生成的页面。

数据库连接与操作

数据库连接是Java Web应用的核心部分,通常使用JDBC或ORM框架(如Hibernate、MyBatis)进行数据库操作。

使用JDBC连接数据库

  1. 配置数据库
    安装并配置MySQL服务器,创建数据库和表。

  2. 编写JDBC代码

    package com.example.jdbc;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    
    public class JdbcExample {
       public static void main(String[] args) {
           String url = "jdbc:mysql://localhost:3306/mydb";
           String user = "root";
           String password = "password";
    
           try (Connection conn = DriverManager.getConnection(url, user, password);
                Statement stmt = conn.createStatement();
                ResultSet rs = stmt.executeQuery("SELECT * FROM example_table")) {
    
               while (rs.next()) {
                   System.out.println(rs.getInt("id") + ", " + rs.getString("name"));
               }
           } catch (Exception e) {
               e.printStackTrace();
           }
       }
    }
  3. 配置数据库驱动
    WEB-INF/lib目录下添加MySQL JDBC驱动jar文件(mysql-connector-java-5.1.47.jar)。

  4. 部署并测试连接
    将Servlet代码部署到Tomcat服务器,并在Servlet中调用JDBC代码,访问Servlet以验证数据库连接是否成功。

使用MyBatis操作数据库

  1. 配置MyBatis
    mybatis-config.xml

    <configuration>
       <environments default="development">
           <environment id="development">
               <transactionManager type="JDBC"/>
               <dataSource type="POOLED">
                   <property name="driver" value="com.mysql.jdbc.Driver"/>
                   <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
                   <property name="username" value="root"/>
                   <property name="password" value="password"/>
               </dataSource>
           </environment>
       </environments>
    </configuration>
  2. 编写Mapper接口

    package com.example.mapper;
    
    import org.apache.ibatis.annotations.*;
    import java.util.List;
    
    public interface ExampleMapper {
       @Select("SELECT * FROM example_table")
       List<Example> getAll();
    
       @Insert("INSERT INTO example_table (id, name) VALUES (#{id}, #{name})")
       void insertExample(Example example);
    
       @Update("UPDATE example_table SET name = #{name} WHERE id = #{id}")
       void updateExample(Example example);
    }
  3. 编写Mapper XML文件
    ExampleMapper.xml

    <mapper namespace="com.example.mapper.ExampleMapper">
       <select id="getAll" resultType="com.example.model.Example">
           SELECT * FROM example_table
       </select>
       <insert id="insertExample">
           INSERT INTO example_table (id, name) VALUES (#{id}, #{name})
       </insert>
       <update id="updateExample">
           UPDATE example_table SET name = #{name} WHERE id = #{id}
       </update>
    </mapper>
  4. 编写Java代码

    package com.example.service;
    
    import com.example.mapper.ExampleMapper;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    
    public class ExampleService {
       private SqlSessionFactory sqlSessionFactory;
    
       public ExampleService() throws IOException {
           String resource = "mybatis-config.xml";
           InputStream inputStream = Resources.getResourceAsStream(resource);
           sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
       }
    
       public List<Example> getAll() {
           try (SqlSession session = sqlSessionFactory.openSession()) {
               ExampleMapper mapper = session.getMapper(ExampleMapper.class);
               return mapper.getAll();
           }
       }
    
       public void insertExample(Example example) {
           try (SqlSession session = sqlSessionFactory.openSession()) {
               ExampleMapper mapper = session.getMapper(ExampleMapper.class);
               mapper.insertExample(example);
               session.commit();
           }
       }
    
       public void updateExample(Example example) {
           try (SqlSession session = sqlSessionFactory.openSession()) {
               ExampleMapper mapper = session.getMapper(ExampleMapper.class);
               mapper.updateExample(example);
               session.commit();
           }
       }
    }
  5. 部署并测试MyBatis
    将上述代码部署到Tomcat服务器,并在Servlet或控制器中调用ExampleService以验证数据库操作是否成功。
常见问题与调试技巧

常见错误及解决方法

在开发Java Web应用时,常见的错误包括:

  • Servlet配置错误:确保web.xml中的Servlet配置正确,包括<servlet-name><servlet-class><url-pattern>
  • 数据库连接失败:检查数据库配置,确保数据库驱动正确,URL、用户名和密码正确。
  • 编译错误:确保所有依赖库正确配置,没有缺少必要的JAR文件。

开发调试工具使用

常用的调试工具包括:

  • IDE调试工具:大多数IDE(如Eclipse、IntelliJ IDEA)都内置了调试工具。通过设置断点、单步执行等方法,可以逐步跟踪代码执行过程。
  • 日志工具:使用日志框架(如Log4j、SLF4J)记录关键信息,便于追踪问题来源。
  • 调试器:Tomcat自带的调试器可以用来调试Servlet和JSP页面。

代码规范与优化建议

编写高质量的代码需要遵循一定的规范:

  • 命名规则:遵循Java命名规范,如类名使用大驼峰命名法,变量名使用小驼峰命名法。
  • 代码格式:使用统一的代码格式,如制表符、缩进等。
  • 注释:为关键代码添加注释,以提高代码可读性。
  • 性能优化:避免重复计算,合理使用缓存,减少数据库查询次数。

示例代码:

public class ExampleService {
    private SqlSessionFactory sqlSessionFactory;

    public ExampleService() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    /**
     * 获取所有记录
     * @return 所有记录的列表
     */
    public List<Example> getAll() {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            ExampleMapper mapper = session.getMapper(ExampleMapper.class);
            return mapper.getAll();
        }
    }
}
实战项目案例解析

实战项目选题

选择一个实际的项目作为实战案例,可以是简单的在线投票系统,也可以是更复杂的电子商务平台。本例以在线投票系统为例,介绍项目开发流程。

项目开发流程与步骤

项目规划

  1. 需求分析:分析项目需要实现的功能,如用户注册、登录、投票、查看投票结果等。
  2. 功能模块划分:将功能划分为用户模块、投票模块、结果模块等。
  3. 技术选型:选择合适的技术栈,如Spring Boot、MyBatis、MySQL等。

技术准备

  1. 搭建开发环境:安装Java JDK、Tomcat、MySQL等。
  2. 开发工具配置:配置Eclipse或IntelliJ IDEA以支持Java Web开发。
  3. 项目初始化:使用Maven创建新项目。

项目开发

  1. 数据库设计

    • 用户表:users(id, username, password, email)
    • 投票表:votes(id, title, description)
    • 投票选项表:options(id, vote_id, name, count)
  2. 编写数据访问层

    package com.example.mapper;
    
    import com.example.model.Vote;
    import org.apache.ibatis.annotations.*;
    
    import java.util.List;
    
    @Mapper
    public interface VoteMapper {
       @Select("SELECT * FROM votes")
       List<Vote> getAllVotes();
    
       @Insert("INSERT INTO votes (title, description) VALUES (#{title}, #{description})")
       void insertVote(Vote vote);
    
       @Update("UPDATE options SET count = count + 1 WHERE id = #{id}")
       void updateOptionCount(@Param("id") int id);
    }
  3. 编写业务逻辑层

    package com.example.service;
    
    import com.example.mapper.VoteMapper;
    import com.example.model.Vote;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.apache.ibatis.session.SqlSession;
    
    import java.io.InputStream;
    import java.util.List;
    
    public class VoteService {
       private SqlSessionFactory sqlSessionFactory;
    
       public VoteService() throws Exception {
           String resource = "mybatis-config.xml";
           InputStream inputStream = Resources.getResourceAsStream(resource);
           sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
       }
    
       public List<Vote> getAllVotes() {
           try (SqlSession session = sqlSessionFactory.openSession()) {
               VoteMapper mapper = session.getMapper(VoteMapper.class);
               return mapper.getAllVotes();
           }
       }
    
       public void insertVote(Vote vote) {
           try (SqlSession session = sqlSessionFactory.openSession()) {
               VoteMapper mapper = session.getMapper(VoteMapper.class);
               mapper.insertVote(vote);
               session.commit();
           }
       }
    
       public void updateOptionCount(int id) {
           try (SqlSession session = sqlSessionFactory.openSession()) {
               VoteMapper mapper = session.getMapper(VoteMapper.class);
               mapper.updateOptionCount(id);
               session.commit();
           }
       }
    }
  4. 编写控制器层

    package com.example.controller;
    
    import com.example.model.Vote;
    import com.example.service.VoteService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.List;
    
    @Controller
    public class VoteController {
       @Autowired
       private VoteService voteService;
    
       @GetMapping("/")
       public String index(Model model) {
           List<Vote> votes = voteService.getAllVotes();
           model.addAttribute("votes", votes);
           return "index";
       }
    
       @PostMapping("/vote")
       public String vote(@RequestParam("id") int id) {
           voteService.updateOptionCount(id);
           return "redirect:/";
       }
    
       @GetMapping("/add")
       public String addVote() {
           return "add";
       }
    
       @PostMapping("/add")
       public String addVote(@ModelAttribute Vote vote) {
           voteService.insertVote(vote);
           return "redirect:/";
       }
    }
  5. 编写前端页面
    index.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
       <title>Vote System</title>
    </head>
    <body>
       <h1>Votes</h1>
       <ul>
           <c:forEach var="vote" items="${votes}">
               <li>
                   <h2>${vote.title}</h2>
                   <p>${vote.description}</p>
                   <form action="vote" method="post">
                       <input type="hidden" name="id" value="${vote.id}">
                       <button type="submit">Vote</button>
                   </form>
               </li>
           </c:forEach>
       </ul>
       <a href="add">Add Vote</a>
    </body>
    </html>

    add.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
       <title>Add Vote</title>
    </head>
    <body>
       <h1>Add Vote</h1>
       <form action="add" method="post">
           <label>Title:</label>
           <input type="text" name="title" required>
           <br>
           <label>Description:</label>
           <input type="text" name="description" required>
           <br>
           <input type="submit" value="Add">
       </form>
       <a href="/">Back</a>
    </body>
    </html>

项目测试

  1. 单元测试
    编写单元测试验证各层的代码是否正确。

    package com.example.test;
    
    import com.example.mapper.VoteMapper;
    import com.example.model.Vote;
    import com.example.service.VoteService;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.apache.ibatis.session.SqlSession;
    import org.junit.jupiter.api.AfterEach;
    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.Test;
    
    import java.io.InputStream;
    import java.util.List;
    
    class VoteServiceTest {
       private SqlSessionFactory sqlSessionFactory;
       private VoteService voteService;
    
       @BeforeEach
       void setUp() throws Exception {
           String resource = "mybatis-config.xml";
           InputStream inputStream = Resources.getResourceAsStream(resource);
           sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
           voteService = new VoteService();
       }
    
       @AfterEach
       void tearDown() {
           try (SqlSession session = sqlSessionFactory.openSession()) {
               VoteMapper mapper = session.getMapper(VoteMapper.class);
               mapper.deleteAll();
               session.commit();
           }
       }
    
       @Test
       void testGetAllVotes() throws Exception {
           List<Vote> votes = voteService.getAllVotes();
           assert votes.size() == 0;
       }
    
       @Test
       void testInsertVote() throws Exception {
           Vote vote = new Vote();
           vote.setTitle("Test Vote");
           vote.setDescription("Test Description");
           voteService.insertVote(vote);
           List<Vote> votes = voteService.getAllVotes();
           assert votes.size() == 1;
       }
    
       @Test
       void testUpdateOptionCount() throws Exception {
           Vote vote = new Vote();
           vote.setTitle("Test Vote");
           vote.setDescription("Test Description");
           voteService.insertVote(vote);
           voteService.updateOptionCount(1);
           List<Vote> votes = voteService.getAllVotes();
           assert votes.get(0).getCount() == 1;
       }
    }
  2. 集成测试
    部署项目到Tomcat服务器,并通过浏览器访问各页面,测试功能是否正常。

项目部署与测试

  1. 打包项目
    使用Maven打包项目:

    mvn clean package
  2. 部署到Tomcat
    将打包好的WAR文件放在Tomcat的webapps目录下,启动Tomcat服务器。

  3. 访问应用
    访问http://localhost:8080/vote-system,测试应用是否正常运行。

通过以上步骤,你将能够创建并部署一个简单的在线投票系统。这个案例涵盖了数据库设计、数据访问层、业务逻辑层、控制器层和前端页面的开发,帮助你更好地理解Java Web项目的开发流程。

总结

通过本文介绍的步骤和示例代码,你可以从零开始构建一个Java Web项目。从开发环境的搭建到项目的基本结构,再到数据库连接与操作,每个环节都有详细的介绍和示例。希望这些内容能帮助你更好地理解和掌握Java Web开发。如果你希望进一步学习Java Web开发,建议参考慕课网上的相关课程。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消