• MVC实例及用三层架构实现对学生信息的增删改查


    一、MVC设计模式实例

    M层

    Login.java

    package org.entity;
    
    public class Login {
           private int id;
           private String uname;
           private String upwd;
           public Login() {
               
           }
           public Login( String uname, String upwd) {
               
               this.uname = uname;
               this.upwd = upwd;
           }
        public Login(int id, String uname, String upwd) {
            this.id = id;
            this.uname = uname;
            this.upwd = upwd;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getUname() {
            return uname;
        }
        public void setUname(String uname) {
            this.uname = uname;
        }
        public String getUpwd() {
            return upwd;
        }
        public void setUpwd(String upwd) {
            this.upwd = upwd;
        }
           
           
    }

    LoginDao.jsp

    package org.dao;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    import org.entity.Login;
    
    //模型层,用于处理登录(查询数据)
    public class LoginDao {
          public static int login(Login login) {//登录
              int flag=-1;//登录成功与否的标识  -1:系统异常,0:用户名或密码有误,1:登录成功
              int result =-1;
              Connection connection =null;
              PreparedStatement pstmt =null;
              ResultSet rs =null;
              try {
                  Class.forName("com.mysql.cj.jdbc.Driver");
                  //Ctrl+1自动返回
                   connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/login?serverTimezone=UTC&characterEncoding=utf-8","root","vayne");
                  String sql="Select count(*) from login where uname=? and upwd =?";
                  pstmt = connection.prepareStatement(sql);
                  pstmt.setString(1, login.getUname());
                  pstmt.setString(2, login.getUpwd());
                   rs = pstmt.executeQuery();
                  if(rs.next()) {
                       result =rs.getInt(1);
                  }
                  if(result>0) {//登录成功
                      flag= 1;
                  }else {
                      flag=0;//用户名或密码错误
                  }
              }catch(ClassNotFoundException e) {
                  e.printStackTrace();
                  flag=-1;//系统异常
              }catch(SQLException e) {
                  e.printStackTrace();
                  flag=-1;//系统异常
              }catch(Exception e) {
                  e.printStackTrace();
                  flag=-1;//系统异常
              }finally {
                      try {
                          if(rs!=null) rs.close();
                          if(pstmt!=null) pstmt.close();
                          if(connection!=null) connection.close();
                      }catch(SQLException e) {
                          e.printStackTrace();
                      }catch(Exception e) {
                          e.printStackTrace();
                      }
                     
                  
              }
              return flag;
          }
    }

    View

    login.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>登录</title>
    </head>
    <body>
            <form action="LoginServlet" method="post">
            用户名:<input type="text" name="uname"><br/>
            密码:<input type="password" name="upwd"><br/>
            <input type="submit" value="登录"><br/>
            
            </form>
    </body>
    </html>

    welcome.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
          登陆成功!!!
    </body>
    </html>

    Controller

    LoginServlet.java

    package org.servlet;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.dao.LoginDao;
    import org.entity.Login;
    
    //控制器层:接受view层的请求,并分发给Model处理
    public class LoginServlet extends HttpServlet {
         
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //处理登录请求    
            request.setCharacterEncoding("utf-8");
            String name= request.getParameter("uname");
            String pwd= request.getParameter("upwd");
            Login login=new Login(name,pwd);
            //调用模型层的登录功能
            int result=LoginDao.login(login);
            if(result>0) {
                request.getRequestDispatcher("welcome.jsp").forward(request, response);
            }else {//返回登录页,重新登录
                request.getRequestDispatcher("login.jsp").forward(request, response);
            }
        }
    
        
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }

     

     

    登录失败,返回登录页面

     

     二、三层架构

     与MVC设计模式的目的一致:都是为了提高代码复用
        区别:两者对项目的理解角度不同
    三层结构的组成:
    表示层(USL User Show Layer; View层):
    1、表示层前台代码:jsp/html/css/js         等价于MVC中的V层:用于和用户的交互、界面的显示   web前端技术
       代码位置:Webcontent
    2、表示层后台代码:servlet用来调用业务逻辑层      等价于MVC中的C层:用于控制跳转、调用业务逻辑层  Servlet、SpringMVC、Struts2
       代码位置:xxx.servlet
    业务逻辑层(BLL Business Logic Layer; Service层):逻辑性,可拆   
    1、 接受表示层的请求、调用
    2、 组装数据访问层:根据逻辑关系,对增删改查方法进行调用
       代码位置:xxx.service
    数据访问层(DAL Data Access Layer; Dao层):不可再分、原子性    直接访问数据库
      增删改查的方法实现
      代码位置:xxx.dao


    三层间的关系:
    上层将请求传递给下层,下层处理后,返回给上层

    上层依赖于下层。 依赖:a持有b的成员变量,就是a依赖于b。先有b,后有a。

    Servlet:
    一个Servlet一般对于一个功能,如果有增删改查(查询单个、查询全部)五个功能,则创建五个Servlet

    表示层前台

    实例

    对学生信息的增删改查,

    index.jsp

    <%@page import="org.student.entity.Student"%>
    <%@page import="java.util.List"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>学生信息列表</title>
    </head>
    <body>
          <table border="1px">
             <tr>
             <th>学号</th>
             <th>姓名</th>
             <th>年龄</th>
             <th>爱好</th>
             </tr>
             <%
             List <Student> students =(List<Student>) request.getAttribute("students");
               for(Student student:students){
                   %>
                   
                   <tr>
                       <td><%=student.getSno() %></td>
                       <td><%=student.getSname() %></td>
                       <td><%=student.getSage() %></td>
                       <td><%=student.getShobby() %></td>
                       <td><a href ="DeleteStudentServlet?sno=<%=student.getSno() %>">删除</a></td>
                       <td><a href="QueryStudentServlet?sno=<%=student.getSno() %>">查询</a></td>
                   </tr>
                   <%
               }
             %>
          </table>
    </body>
    </html>

    add.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>添加学生信息</title>
    </head>
    <body>
          <form action="AddStudentServlet" method="post">
          学号:<input type="text" name="sno"><br/>
          姓名:<input type="text" name="sname"><br/>
          年龄:<input type="text" name="sage"><br/>
          爱好:<input type="text" name="shobby"><br/>
          <input type="submit" value="添加">
          </form>
    </body>
    </html>

    studentinfo.jsp

    <%@page import="org.student.entity.Student"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>学生个人信息</title>
    </head>
    <body>
        <%
           Student student= (Student)request.getAttribute("student");
        %>
        <form action="UpdateStudentServlet">
             学号:<input type="text" name="sno" value="<%=student.getSno()%>" readonly="readonly"><br/>
             姓名:<input type="text" name="sname" value="<%=student.getSname()%>"><br/>
             年龄:<input type="text" name="sage" value="<%=student.getSage()%>"><br/>
             爱好:<input type="text" name="shobby" value="<%=student.getShobby()%>"><br/>
             <input type="submit" value="修改">
        </form>
    </body>
    </html>

    package org.student.dao;

    package org.student.dao;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.student.entity.Student;
    
    
    public class StudentDao {
        //数据库URL和账号密码
            private static final String URL="jdbc:mysql://localhost:3306/login?serverTimezone=UTC&characterEncoding=utf-8";
            private static final String UNAME="root";
            private static final String UPWD="vayne";
            
            //数据库连接
            public static Connection getConn () {
                Connection conn = null;
                
                try {
                    Class.forName("com.mysql.cj.jdbc.Driver");
                    conn = DriverManager.getConnection(URL, UNAME, UPWD);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return conn;
            }
            
            
            public static void closeAll(Connection conn,PreparedStatement pstmt,ResultSet rs)
            {
                try {
                    if(conn!=null)
                        conn.close();
                } catch (SQLException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }catch (Exception e) {
                    e.printStackTrace();
                }
            
                try {
                    if(pstmt!=null)
                        pstmt.close();
                } catch (SQLException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }catch (Exception e) {
                    e.printStackTrace();
                }
            
                try {
                    if(rs!=null)
                        rs.close();
                } catch (SQLException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }catch (Exception e) {
                    e.printStackTrace();
                }
            }
                
            //关闭conn和pstmt
            public static void closePart(Connection conn,PreparedStatement pstmt)
            {
                try {
                    if(conn!=null)
                        conn.close();
                } catch (SQLException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }catch (Exception e) {
                    e.printStackTrace();
                }
            
                try {
                    if(pstmt!=null)
                        pstmt.close();
                } catch (SQLException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }catch (Exception e) {
                    e.printStackTrace();
                }
            }
            
            //添加学生信息
            public static boolean AddStudent(Student student) {
                boolean flag = false;
                 String sql="insert into student(sno,sname,sage,shobby) values(?,?,?,?)" ;
                 Connection conn = StudentDao.getConn();
                 PreparedStatement pstmt = null;
                 try {
                     pstmt = conn.prepareStatement(sql);
                     pstmt.setInt(1,student.getSno());
                     pstmt.setString(2, student.getSname());
                     pstmt.setInt(3, student.getSage());
                     pstmt.setString(4, student.getShobby());
                     int count = pstmt.executeUpdate();
                     if(count>0) {
                         flag=true;
                     }
                 }catch(SQLException e) {
                     e.printStackTrace();
                 }catch(Exception e) {
                     e.printStackTrace();
                 }finally {
                     StudentDao.closePart(conn, pstmt);
                 }
                
                return flag;
            }
            //根据学号删除学生信息
            public static boolean DeleteStudent(int sno) {
                boolean flag = false;
                 String sql="delete from student where sno =?" ;
                 Connection conn = StudentDao.getConn();
                 PreparedStatement pstmt = null;
                 try {
                     pstmt = conn.prepareStatement(sql);
                     pstmt.setInt(1,sno);
                     int count = pstmt.executeUpdate();
                     if(count>0) {
                         flag=true;
                     }
                 }catch(SQLException e) {
                     e.printStackTrace();
                 }catch(Exception e) {
                     e.printStackTrace();
                 }finally {
                     StudentDao.closePart(conn, pstmt);
                 }
                
                return flag;
            }
            //根据学号修改学生信息:根据sno找到学生,并将学生改为student
            public static boolean UpdateStudent(int sno,Student student) {
                boolean flag = false;
                 String sql="update student set sname =?,sage=?,shobby=? where sno =?" ;
                 Connection conn = StudentDao.getConn();
                 PreparedStatement pstmt = null;
                 try {
                     pstmt = conn.prepareStatement(sql);
                     pstmt.setString(1, student.getSname());
                     pstmt.setInt(2, student.getSage());
                     pstmt.setString(3, student.getShobby());
                     pstmt.setInt(4, sno);
                     int count = pstmt.executeUpdate();
                     if(count>0) {
                         flag=true;
                     }
                 }catch(SQLException e) {
                     e.printStackTrace();
                 }catch(Exception e) {
                     e.printStackTrace();
                 }finally {
                     StudentDao.closePart(conn, pstmt);
                 }
                
                return flag;
            }
            //查询学生是否存在
                    public static boolean isExist(int sno) {
                        return Query(sno)==null? false:true;
                    }
            //根据学号查询学生全部信息
            public static Student Query(int sno) {
                 Student student= null;
                 String sql="select * from student where sno =?" ;
                 Connection conn = StudentDao.getConn();
                 PreparedStatement pstmt = null;
                 ResultSet rs = null; 
                 try {
                     pstmt = conn.prepareStatement(sql);
                     pstmt.setInt(1,sno);
                     rs = pstmt.executeQuery();
                     if(rs.next()) {
                         int no=rs.getInt("sno");
                         String name=rs.getString("sname");
                         int age=rs.getInt("sage");
                         String hobby=rs.getString("shobby");
                         student= new Student(no,name,age,hobby);
                     }
                 }catch(SQLException e) {
                     e.printStackTrace();
                 }catch(Exception e) {
                     e.printStackTrace();
                 }finally {
                     StudentDao.closeAll(conn, pstmt, rs);
                 }
                 return student;
            }
            //查询全部学生信息
                    public static List<Student> QueryAll() {
                        List<Student> students = new ArrayList<>();
                         Student student= null;
                         String sql="select * from student " ;
                         Connection conn = StudentDao.getConn();
                         PreparedStatement pstmt = null;
                         ResultSet rs = null; 
                         try {
                             pstmt = conn.prepareStatement(sql);
                             rs = pstmt.executeQuery();
                             while(rs.next()) {
                                 int no=rs.getInt("sno");
                                 String name=rs.getString("sname");
                                 int age=rs.getInt("sage");
                                 String hobby=rs.getString("shobby");
                                 student= new Student(no,name,age,hobby);
                                 students.add(student);
                             }
                         }catch(SQLException e) {
                             e.printStackTrace();
                         }catch(Exception e) {
                             e.printStackTrace();
                         }finally {
                             StudentDao.closeAll(conn, pstmt, rs);
                         }
                         return students;
                    }
    }

    package org.student.entity;

    package org.student.entity;
    
    public class Student {
           private int sno;
           private String sname;
           private int sage;
           private String shobby;
           
           @Override
        public String toString() {
            return "Student [sno=" + sno + ", sname=" + sname + ", sage=" + sage + ", shobby=" + shobby + "]";
        }
        public Student() {
               
           }
           public Student( String sname, int sage, String shobby) {
               this.sname = sname;
               this.sage = sage;
               this.shobby = shobby;
           }
        public Student(int sno, String sname, int sage, String shobby) {
            this.sno = sno;
            this.sname = sname;
            this.sage = sage;
            this.shobby = shobby;
        }
        public int getSno() {
            return sno;
        }
        public void setSno(int sno) {
            this.sno = sno;
        }
        public String getSname() {
            return sname;
        }
        public void setSname(String sname) {
            this.sname = sname;
        }
        public int getSage() {
            return sage;
        }
        public void setSage(int sage) {
            this.sage = sage;
        }
        public String getShobby() {
            return shobby;
        }
        public void setShobby(String shobby) {
            this.shobby = shobby;
        }
           
    }

    org.student.service

    package org.student.service;
    
    import org.student.entity.Student;
    
    import java.util.List;
    
    import org.student.dao.*;
    public class StudentService {
          public boolean AddStudent(Student student) {
              boolean flag=false;
              if(!StudentDao.isExist(student.getSno())) {
                  StudentDao.AddStudent(student);
                  flag=true;
              }else {
                  System.out.println("此人已存在");
              }
             return flag; 
          }
          //根据学号进行删除
          public boolean DeleteStudent(int  sno) {
              boolean flag=false;
              if(StudentDao.isExist(sno)) {
                  StudentDao.DeleteStudent(sno);
                  flag=true;
              }else {
                  System.out.println("此人不存在");
              }
             return flag; 
          }
          //根据学号进行修改
          public boolean UpdateStudent(int sno,Student student) {
              boolean flag=false;
              if(StudentDao.isExist(sno)) {
                  StudentDao.UpdateStudent(sno,student);
                  flag=true;
              }else {
                  System.out.println("此人不存在");
              }
             return flag; 
          }
          //根据学号查询学生
          public Student Query(int sno) {
              return StudentDao.Query(sno);
          }
          //查询全部学生
          public List<Student> QueryAll(){
              return StudentDao.QueryAll();
          }
    }

    package org.student.servlet;

    AddStudentServlet
    package org.student.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.student.entity.Student;
    import org.student.service.StudentService;
    
    
    public class AddStudentServlet extends HttpServlet {
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            
            request.setCharacterEncoding("utf-8");
            response.setCharacterEncoding("utf-8");
            response.setContentType("text/html; charset=utf-8");
            int no= Integer.parseInt(request.getParameter("sno"));
            String name= request.getParameter("sname");
            int age= Integer.parseInt(request.getParameter("sage"));
            String hobby= request.getParameter("shobby");
            Student student = new Student(no,name,age,hobby);
            StudentService studentservice = new StudentService();
            boolean result=studentservice.AddStudent(student);
            //out对象的获取方法
            PrintWriter out = response.getWriter();
            if(result) {
                
                out.println("添加成功");
            }else {
                
                out.println("添加失败");
            }
        }
      
        
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }
    DeleteStudentServlet
    package org.student.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.student.service.StudentService;
    
    
    
    public class DeleteStudentServlet extends HttpServlet {
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setCharacterEncoding("utf-8");
            response.setContentType("text/html; charset=utf-8");
            int no= Integer.parseInt(request.getParameter("sno"));
            StudentService studentservice = new StudentService();
            boolean result=studentservice.DeleteStudent(no);
            //out对象的获取方法
            PrintWriter out = response.getWriter();
            if(result) {
                
                out.println("删除成功");
                response.sendRedirect("QueryAllStudentServlet");
            }else {
                
                out.println("删除失败");
            }
        }
    
        
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }
    QueryAllStudentServlet
    package org.student.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.student.entity.Student;
    import org.student.service.StudentService;
    
    public class QueryAllStudentServlet extends HttpServlet {
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setCharacterEncoding("utf-8");
            response.setContentType("text/html; charset=utf-8");
            
            StudentService studentservice = new StudentService();
            List<Student> students=studentservice.QueryAll();
            //out对象的获取方法
            PrintWriter out = response.getWriter();
            request.setAttribute("students", students);
            request.getRequestDispatcher("index.jsp").forward(request, response);
        }
    
        
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }
    QueryStudentServlet 
    package org.student.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.student.entity.Student;
    import org.student.service.StudentService;
    
    public class QueryStudentServlet extends HttpServlet {
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setCharacterEncoding("utf-8");
            response.setContentType("text/html; charset=utf-8");
            //获取待查询修改人的学号
            int no= Integer.parseInt(request.getParameter("sno"));
            
            StudentService studentservice = new StudentService();
            Student student=studentservice.Query(no);
            //out对象的获取方法
            PrintWriter out = response.getWriter();
            out.println(student);
            request.setAttribute("student", student);
            request.getRequestDispatcher("studentinfo.jsp").forward(request, response);
        }
    
        
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }

    UpdateStudentServlet
    package org.student.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.student.entity.Student;
    import org.student.service.StudentService;
    
    public class UpdateStudentServlet extends HttpServlet {
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setCharacterEncoding("utf-8");
            response.setContentType("text/html; charset=utf-8");
            //获取待修改人的学号
            int no= Integer.parseInt(request.getParameter("sno"));
            //获取修改后的内容
            String name= request.getParameter("sname");
            int age= Integer.parseInt(request.getParameter("sage"));
            String hobby= request.getParameter("shobby");
            //将修改后的内容封装到一个实体类中
            Student student = new Student(name,age,hobby);
            StudentService studentservice = new StudentService();
            boolean result=studentservice.UpdateStudent(no,student);
            //out对象的获取方法
            PrintWriter out = response.getWriter();
            if(result) {
                
                out.println("修改成功");
                response.sendRedirect("QueryAllStudentServlet");
            }else {
                
                out.println("修改失败");
            }
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }

     

     

     

     

    点击删除

     

    进行查询

     

    进行修改

     

    今天在测试过程中遇到了Servlet找不到的问题,就是因为我多加了个空格

  • 相关阅读:
    execution(* *..BookManager.save(..))的解读
    metalink下载补丁包
    loop_login.sh
    EXPDP IMPDP 知识总结
    图书管理系统简单 过程
    Data Types
    Oracle 创建分页存储过程(转帖)
    绑定变量赋值
    Oracle10g、 Oracle11g完美共存
    Oracle11G 数据库 expdp、impdp使用示例
  • 原文地址:https://www.cnblogs.com/yeyueweiliang/p/12215978.html
Copyright © 2020-2023  润新知