javaweb--实验十 --期末复盘

实验十 JDBC连接MySQL

本次实验没有代码补全,以下都是完整过程,详细关注连接过程的问题

一、实验目的:

1、掌握JDBC连接数据库的一般操作。
2、理解JavaBean的基本作用。
3、理解分层设计的思想。

二、 实验内容:

实现学生信息的增删改查操作。
在这里插入图片描述
注:通过以下提供的实验步骤,最终得到的项目结构如下所示:

【实验步骤】

(1)将jar包“mysql-connector-java-5.0.8-bin.jar”拷贝到tomcat的lib文件夹中。

个人使用的是mysql8.0版本,若有相同,文末自提驱动

(2)在MySQL中,创建名为“my_db”的数据库,并在数据库中创建student表。

create database my_db;

use my_db;

create table student
(sno char(5) primary key,
sname varchar(50),
sage int);

insert into student 
values('99001','张三',20),('99002','李四',21);

(3)新建一个名为”web10”的项目(Web应用程序)。在项目中新建“Java包”,命名为“model”。
(4)在model包中新建“Java类”,命名为“Student”。Student.java为封装student表的JavaBean。

/**
 * 与学生表对应的实体类(封装数据的JavaBean),目的是方便数据传输以及代码维护。
 * JavaBean的要求: 
 * 1、是一个Java 类
 * 2、必须存在无参数构造方法 
 * 3、所有成员变量都是private 
 * 4、私有化的属性必须通过public类型的方法暴露给其它程序, 并且方法的命名也必须遵守一定的命名规范。
 * 即如果想private成员变量被外界访问,提供public的get和set方法。
 */
package model;

public class Student {

    private String sno;
    private String sname;
    private int sage;

    public Student(String sno, String sname, int sage) {
        this.sno = sno;
        this.sname = sname;
        this.sage = sage;
    }

    public Student() {
    }

    public String getSno() {
        return sno;
    }

    public void setSno(String 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;
    }

}

(5)在项目中新建“Java包”,命名为“dal”(Data Access Layer)。该包中存储的文件主要用于数据库访问。
(6)在dal包中创建“Java类”,命名为“Dbutils”。该文件中定义了访问数据库的通用读写方法。

package dal;
import java.sql.*;
public class Dbutils {

    protected Connection conn = null;
    protected PreparedStatement pstmt = null;
    protected ResultSet rs = null;

    /**
     * 获取连接对象
     * @return 连接对象
     */
    public Connection getConnection() {
        try {
            //1、加载驱动类
            Class.forName("com.mysql.jdbc.Driver");
            //2、创建连接对象
            String url = "jdbc:mysql://localhost:3306/my_db?useUnicode=true&characterEncoding=utf-8";
            String user = "root";
            String password = "";
            conn = DriverManager.getConnection(url,user,password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 关闭资源
     *
     * @param conn
     * @param pstmt
     * @param rs
     */
    public void closeAll(Connection conn, PreparedStatement pstmt, ResultSet rs) {
        try {
            if (rs != null) {
                rs.close();
            }
            if (pstmt != null) {
                pstmt.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 增删改操作
     *
     * @param sql
     * @param params
     * @return 
     */
    public int executeUpdate(String sql, Object[] params) {
        this.getConnection();
        int result = 0;
        try {
            //3、创建prepareStatement对象
            pstmt = conn.prepareStatement(sql);
            //4、为占位符赋值
            if (null != params) {
                for (int i = 0; i < params.length; i++) {
                    pstmt.setObject(i + 1, params[i]);
                }
            }
            //5、调用方法:执行sql语句
            result = pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            this.closeAll(conn, pstmt, null);
        }
        return result;
    }

    /**
     * 查询方法
     *
     * @param sql
     * @param params
     * @return
     */
    public ResultSet executeQuery (String sql, Object[] params) {
        this.getConnection();
        try {
            //3、创建prepareStatement对象
            pstmt = conn.prepareStatement(sql);
            //4、为占位符赋值
            if (null != params) {
                for (int i = 0; i < params.length; i++) {
                    pstmt.setObject(i + 1, params[i]);
                }
            }
            //5、调用方法:执行sql语句
            rs = pstmt.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //后面具体的查询方法还需要用到rs ,所以此处最后不能关闭数据流
        return rs;
    }
}

(7)在dal包中创建“Java类”,命名为“StudentDAO”。该文件中定义了对Student表进行增删改查操作的方法。该类中,需使用model包中的Student类。

package dal;

import model.Student;
import java.util.List;
import java.util.ArrayList;
import java.sql.*;

/**
 * 对Student表进行增删改查的方法
 */
public class StudentDAO {

    Dbutils dbutils = new Dbutils();

    //返回所有的学生信息
    public List<Student> findAllStudents() {
        String sql = "select sno,sname,sage from student";
        Object[] params = null;
        List<Student> list = new ArrayList<>();
        ResultSet rs = dbutils.executeQuery (sql, params);
        try {
            if (null != rs) {
                while (rs.next()) {
                    Student student = new Student();
                    student.setSno(rs.getString("sno"));
                    student.setSname(rs.getString("sname"));
                    student.setSage(rs.getInt("sage"));
                    list.add(student);
                }
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            dbutils.closeAll(dbutils.conn, dbutils.pstmt, dbutils.rs);
        }
        return list;
    }

    //根据学号查找学生信息
    public Student findBySno(String sno) {
        Student student = new Student();
        String sql = "select sno,sname,sage from student where sno=?";
        Object[] params = {sno};
        ResultSet rs = dbutils.executeQuery (sql, params);
        try {
            if (null != rs) {
                if (rs.next()) {
                    student.setSno(rs.getString("sno"));
                    student.setSname(rs.getString("sname"));
                    student.setSage(rs.getInt("sage"));
                }
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            dbutils.closeAll(dbutils.conn, dbutils.pstmt, dbutils.rs);
        }
        return student;
    }

    //判断学号在student表中是否存在
    public boolean isSnoExist(String sno) {
        boolean flag = false;
        String sql = "select sno,sname,sage from student where sno=?";
        Object[] params = {sno};
        ResultSet rs = dbutils.executeQuery (sql, params);
        try {
            if (rs != null && rs.next()) {
                flag = true;
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return flag;
    }

    //插入一条学生记录
    public boolean insert(Student student) {
        boolean flag = false;
        String sql = "insert into student(sno,sname,sage) values(?,?,?)";
        Object[] params = {student.getSno(), student.getSname(), student.getSage()};
        return (dbutils.executeUpdate(sql, params) == 1);
    }

    //根据学号,更新该生的其他属性
    public boolean update(Student student) {
        String sql = "update student set sname=?,sage=? WHERE sno=?";
        Object[] params = {student.getSname(), student.getSage(), student.getSno()};
        return dbutils.executeUpdate(sql, params) == 1;
    }

    //根据学号删除学生信息
    public boolean deleteBySno(String sno) {
        String sql = "delete from student where sno=?";
        Object[] params = {sno};
        return dbutils.executeUpdate(sql, params) == 1;
    }
}

(8)在项目中新建“JSP文件”,命名为“student”。该文件为“学生信息管理”的首页。
在该文件中,使用了model包中的Student类,以及dal包中的StudentDAO类。其中,通过dal.StudentDAO类的findAllStudents()方法,返回了student表中的全部记录。

<%@page import="dal.StudentDAO"%>
<%@page import="java.util.List"%>
<%@page import="model.Student"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>学生信息管理</title>
    </head>
    <body>
        <div align="center">
            <h1>学生信息管理</h1>
            <%
                StudentDAO studentDAO = new StudentDAO();
                //获取所有学生信息
                List<Student> students = studentDAO.findAllStudents();
            %>
            <table border='1' width="80%" >
                <tr><th width="20%">编号</th>
                    <th width="20%">学生学号</th>
                    <th width="20%">姓名</th>
                    <th width="20%">年龄</th>
                    <th width="20%">操作</th>
                </tr>
                <%
                    int rowNum = 0;//行编号
                    for (int i = 0; i < students.size(); i++) {
                        rowNum++;
                        String sno = students.get(i).getSno();
                        String sname = students.get(i).getSname();
                        int sage = students.get(i).getSage();
                        String deleteLink = "delete?sno=" + sno;
                        String editLink = "editPage.jsp?sno=" + sno;
                %>
                <tr>
                    <td><%= rowNum%></td>
                    <td><%= sno%></td>
                    <td><%= sname%></td>
                    <td><%= sage%></td>
                    <!--点击“删除”链接,使用javascript脚本弹出确认对话框,单击“确定”后,才执行删除操作-->
                    <td><a href="<%=deleteLink%>" onClick="return confirm('您确定要删除吗?');">删除</a>
                        <a href='<%=editLink%>'>修改</a></td>               
                </tr>
                <%
                    }
                %>

            </table>
            <br/>
            <form action="add" method = "get">
                学号 <input name="sno">
                姓名 <input name="sname">
                年龄 <input name="sage">
                <input type="submit" value="增加"></br>
            </form>
        </div>
    </body>
</html>

(9)在项目中新建“JSP文件”,命名为“editPage”。该文件为编辑文件的页面。
该文件中,同样使用了model包的Student类以及dal包的StudentDAO类。其中,通过调用dal.studentDAO类的findBySno(Sring sno)方法,返回被选中的学生的基本信息。

<%@page import="model.Student"%>
<%@page import="dal.StudentDAO"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>编辑学生信息</h1>
        <%            
            StudentDAO studentDAO = new StudentDAO();
            String sno = request.getParameter("sno");
            Student student = studentDAO.findBySno(sno);
            String sname = student.getSname();
            int sage = student.getSage();          
        %>
        <form action="edit" method = "get">
            <!--通过readonly="true",设置学号文本框不能修改-->
            学号 <input name="sno" readonly="true" value=<%=sno%>><br/>
            姓名 <input name="sname" value=<%=sname%>><br/>
            年龄 <input name="sage" value=<%=sage%>><br/><br/>
            <input type="submit" value="提交"></br>
        </form>
    </body>
</html>

(10)在项目中新建“Java包”,命名为“servlet”。该包中存储项目的servlet文件。
(11)在“servlet”包中新建“Java类”,命名为“AddServlet”,实现学生记录的添加。
如果用户输入的学号在学生表存在,则提示“学号重复,添加失败”;否则将学生记录插入到学生表中,并提示“添加成功”。最后,跳转到首页“student.jsp”中。
该文件中调用了dal.StudentDAO类的insert(Student student)方法,实现学生记录的添加。

package servlet;

import dal.StudentDAO;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import model.Student;

@WebServlet("/add")
public class AddServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求对象的编码方案为utf-8
        req.setCharacterEncoding("utf-8");
        //设置响应对象以及浏览器的字符方案为utf-8
        resp.setContentType("text/html;charset=utf-8");
        StudentDAO studentDAO = new StudentDAO();
        //获取用户输入的学号,判断学号在学生表中是否存在
        String sno = req.getParameter("sno");
        if (studentDAO.isSnoExist(sno)) {
              resp.getWriter().println("<script>alert('学号重复,添加失败');window.location.href='student.jsp'</script>");
        } else {
            //获取用户输入的姓名、年龄
            String sname = req.getParameter("sname");
            String sageStr = req.getParameter("sage");
            Integer sage = Integer.parseInt(sageStr);
            Student student = new Student(sno, sname, sage);
            studentDAO.insert(student);
            //使用javascript脚本输出提示对话框,并跳转到student.jsp页面中
            resp.getWriter().println("<script>alert('添加成功');window.location.href='student.jsp'</script>");
        }
        //不能使用resp.sendRedirect("student.jsp");否则,javascript对话框无法显示。
    }
}

(12)在“serlvet”包中新建“Java类”,命名为“DeleteServlet”。
该文件通过调用dal.StudentDAO类的deleteBySno(String sno),实现根据学号删除学生记录的操作。

package servlet;

import dal.StudentDAO;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/delete")
public class DeleteServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        StudentDAO studentDAO = new StudentDAO();
        String sno = req.getParameter("sno");
        //根据用户输入的学号,删除学生记录
        studentDAO.deleteBySno(sno);
        //重定向到首页student.jsp
        resp.sendRedirect("student.jsp");
    }
}

(13)在“serlvet”包中新建“Java类”,命名为“EditServlet”。
该文件通过调用dal.StudentDAO类的update(Student student),实现了根据学号修改学生记录的操作。

package servlet;

import dal.StudentDAO;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import model.Student;

@WebServlet("/edit")
public class EditServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        StudentDAO studentDAO = new StudentDAO();
        String sno = req.getParameter("sno");
        String sname = req.getParameter("sname");
        String sageStr = req.getParameter("sage");
        int sage = Integer.parseInt(sageStr);
        Student student = new Student(sno, sname, sage);
        if (studentDAO.update(student)) {
            resp.getWriter().println("<script>alert('修改成功');window.location.href='student.jsp'</script>");
        } else {
            resp.getWriter().println("<script>alert('程序发生了未知的错误,修改失败');window.location.href='student.jsp'</script>");
        }
    }
}

三、先看实验效果

请添加图片描述

四、具体连接时的错误(只提供mysql8.0的问题–>个人使用的是MySQL8.0)

1、先提供mysql-connector-java-8.0.11 jar包

链接:https://pan.baidu.com/s/1I_iES9J2EmjRfYjr3ujlOA?pwd=2vyg
提取码:2vyg

2、将下载好的jar包放在tomcat的lib文件夹中

3、遇到的问题:

1、数据库连接问题

主要原因是 :在Dbutils类中的mysql密码配置中没有正确填写你自己的所对应的数据库连接密码。

解决方法:正确填写密码

在这里插入图片描述
在这里插入图片描述

修改后的代码
package dal;

import java.sql.*;

/**
 * @Auther zg
 * @Date 2023/12/26
 * @Version 1.0
 */
public class Dbutils {

    protected Connection conn = null;
    protected PreparedStatement pstmt = null;
    protected ResultSet rs = null;

    /**
     * 获取连接对象
     * @return 连接对象
     */
    public Connection getConnection() {
        try {
            //1、加载驱动类
            Class.forName("com.mysql.jdbc.Driver");
            //2、创建连接对象
            String url = "jdbc:mysql://localhost:3306/my_db_web10?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";
            String user = "root";
            String password = "root";  // 修改处
            conn = DriverManager.getConnection(url,user,password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 关闭资源
     *
     * @param conn
     * @param pstmt
     * @param rs
     */
    public void closeAll(Connection conn, PreparedStatement pstmt, ResultSet rs) {
        try {
            if (rs != null) {
                rs.close();
            }
            if (pstmt != null) {
                pstmt.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 增删改操作
     *
     * @param sql
     * @param params
     * @return
     */
    public int executeUpdate(String sql, Object[] params) {
        this.getConnection();
        int result = 0;
        try {
            //3、创建prepareStatement对象
            pstmt = conn.prepareStatement(sql);
            //4、为占位符赋值
            if (null != params) {
                for (int i = 0; i < params.length; i++) {
                    pstmt.setObject(i + 1, params[i]);
                }
            }
            //5、调用方法:执行sql语句
            result = pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            this.closeAll(conn, pstmt, null);
        }
        return result;
    }

    /**
     * 查询方法
     *
     * @param sql
     * @param params
     * @return
     */
    public ResultSet executeQuery (String sql, Object[] params) {
        this.getConnection();
        try {
            //3、创建prepareStatement对象
            pstmt = conn.prepareStatement(sql);
            //4、为占位符赋值
            if (null != params) {
                for (int i = 0; i < params.length; i++) {
                    pstmt.setObject(i + 1, params[i]);
                }
            }
            //5、调用方法:执行sql语句
            rs = pstmt.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //后面具体的查询方法还需要用到rs ,所以此处最后不能关闭数据流
        return rs;
    }
}
2、mysql8.0在创建连接对象的时候,需要配置时区

错误原因: 主要是没有在url中配置时区

解决方法:添加时区配置

在这里插入图片描述
在这里插入图片描述

修改好的代码
package dal;

import java.sql.*;

/**
 * @Auther zg
 * @Date 2023/12/26
 * @Version 1.0
 */
public class Dbutils {

    protected Connection conn = null;
    protected PreparedStatement pstmt = null;
    protected ResultSet rs = null;

    /**
     * 获取连接对象
     * @return 连接对象
     */
    public Connection getConnection() {
        try {
            //1、加载驱动类
            Class.forName("com.mysql.jdbc.Driver");
            //2、创建连接对象
            String url = "jdbc:mysql://localhost:3306/my_db_web10?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai"; // 修改处
            String user = "root";
            String password = "root";
            conn = DriverManager.getConnection(url,user,password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 关闭资源
     *
     * @param conn
     * @param pstmt
     * @param rs
     */
    public void closeAll(Connection conn, PreparedStatement pstmt, ResultSet rs) {
        try {
            if (rs != null) {
                rs.close();
            }
            if (pstmt != null) {
                pstmt.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 增删改操作
     *
     * @param sql
     * @param params
     * @return
     */
    public int executeUpdate(String sql, Object[] params) {
        this.getConnection();
        int result = 0;
        try {
            //3、创建prepareStatement对象
            pstmt = conn.prepareStatement(sql);
            //4、为占位符赋值
            if (null != params) {
                for (int i = 0; i < params.length; i++) {
                    pstmt.setObject(i + 1, params[i]);
                }
            }
            //5、调用方法:执行sql语句
            result = pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            this.closeAll(conn, pstmt, null);
        }
        return result;
    }

    /**
     * 查询方法
     *
     * @param sql
     * @param params
     * @return
     */
    public ResultSet executeQuery (String sql, Object[] params) {
        this.getConnection();
        try {
            //3、创建prepareStatement对象
            pstmt = conn.prepareStatement(sql);
            //4、为占位符赋值
            if (null != params) {
                for (int i = 0; i < params.length; i++) {
                    pstmt.setObject(i + 1, params[i]);
                }
            }
            //5、调用方法:执行sql语句
            rs = pstmt.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //后面具体的查询方法还需要用到rs ,所以此处最后不能关闭数据流
        return rs;
    }
}

4、总结

以上就是这个实验的我所遇到的连接错误,两个错误都出现在Dbutils,最终的修改的代码就是👆的,若还有其他问题请留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/272428.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

广州华锐互动VRAR:VR煤矿安全警示教育系统提供真实生动的场景体验

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经逐渐渗透到各个领域&#xff0c;为人们的生活带来了诸多便利。在煤矿行业&#xff0c;VR技术的应用也日益受到关注。广州华锐互动开发的VR煤矿安全警示教育系统&#xff0c;旨在通过虚拟现实技术&…

WordPress主题大前端DUX v8.3源码下载

DUX主题8.3版本更新内容&#xff1a; 新增&#xff1a;Cloudflare Turnstile 免费验证功能 新增&#xff1a;子菜单页面模版&#xff0c;支持多级页面 新增&#xff1a;手机端文章内表格自动出现横向滚动条&#xff0c;可集体或单独设置滚动宽度 新增&#xff1a;标签云页面模版…

drf知识-06

视图集 #1 ModelViewSet&#xff1a; 视图类&#xff1a;GenericAPIView 映射&#xff1a;list create retrieve update destroy #2 ViewSetMixin类&#xff1a; 只要继承它&#xff0c;路由写法变了 分析&#xff1a;ViewSetMixin 不是视图类&#xff0c;支…

FTP不同方式使用与搭建与端口号常识了解

目录 一、FTP介绍 二、winServer2012搭建ftp服务器 在虚拟机搭建具体步骤 2.1、新建组&#xff1a; 2.2、新建用户名 2.3、把用户名与组绑定 2.4、安装ftp 2.5、配置ftp服务器 2.6、给文件夹调整权限 2.7、测试 a、服务器本机测试 b、外部机器测试 C、借助工具Mobal…

低代码开发:数字化转型的引擎

引言 在当今数字化时代&#xff0c;组织面临着不断变化的市场需求和技术挑战。数字化转型已成为维持竞争力的关键&#xff0c;而低代码开发正在崭露头角&#xff0c;成为加速创新和数字化转型的有力工具。本文将深入探讨低代码开发的核心概念、优势和应用&#xff0c;以揭示它…

数据库基础面试第四弹

1. Redis的数据结构有哪些 1. 字符串&#xff08;String&#xff09;&#xff1a; 字符串是Redis最基本的数据结构。它可以存储任意类型的数据&#xff0c;包括文本、整数或二进制数据。字符串类型的值最大可以达到512MB。 1 2 3 4 SET name "John" GET name 将字…

云原生Kubernetes:K8S集群版本升级(v1.22.14 - v1.23.14)

目录 一、理论 1.K8S集群升级 2.环境 3.升级集群&#xff08;v1.23.14&#xff09; 4.验证集群&#xff08;v1.23.14&#xff09; 二、实验 1. 环境 2.升级集群&#xff08;v1.23.14&#xff09; 2.验证集群&#xff08;v1.23.14&#xff09; 一、理论 1.K8S集群升级 …

【Python_09】Python基础语法(数据容器之列表详解)

文章目录 概述Python中的数据容器列表1.1 定义列表1.2列表取值与修改1.3 列表遍历1.3.1 使用for循环遍历列表1.3.2 使用while循环遍历1.3.3 使用enumerate()函数获取索引和元素 1.4 列表常用方法 概述 数据容器是用来存储和组织数据的数据结构和对象。可以以不同的方式存储和操…

摇杆控制人物移动

摇杆控制人物移动 一、UI搭建二、3d模型搭建三、脚本JoyStickBar.csPlayerController.cs 工程在我资源里名字叫Joystickbar.unitypackage [连接](https://download.csdn.net/download/qq_42194657/12043019?spm1001.2014.3001.5503) 一、UI搭建 JoyStickBar是图片背景 JoySt…

功能问题:如何在H5中实现拍照功能?3步搞定!

大家好&#xff0c;我是大澈&#xff01; 本文约2100字&#xff0c;整篇阅读大约需要4分钟。 感谢关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费领取"面试礼包"一份&#xff0c;然后免费加入问答群&#xff0c;从此让解决问题的你不再孤单&#xff01…

python 面试题第一弹

1. 如何理解Python中的深浅拷贝 浅拷贝&#xff08;Shallow Copy&#xff09;创建一个新的对象&#xff0c;该对象的内容是原始对象的引用。这意味着新对象与原始对象共享相同的内存地址&#xff0c;因此对于可变对象来说&#xff0c;如果修改了其中一个对象&#xff0c;另一个…

odoo17核心概念view7——listview总体框架分析

这是view系列的第七篇文章&#xff0c;今天主要介绍我们最常用的list视图。 1、先看list_view,这是主文件 /** odoo-module */import { registry } from "web/core/registry"; import { RelationalModel } from "web/model/relational_model/relational_mode…

Spring中常见的Bean后处理器

Bean后处理器的作用&#xff1a;为Bean生命周期各个阶段提供扩展。接下来我们查看一个案例 public class TestBeanPostProcessor {public static void main(String[] args) {//该容器不存在任何Spring中的bean对象&#xff0c;是一个干净的容器&#xff0c;且提供了正常容器中…

运动轨迹仿真

重型运载火箭轨迹/总体参数一体化优化方法 硬核推导火箭运动方程&#xff0c;并用python仿真实现 rocket-simulation:MATLAB-火箭仿真软件 MatRockSim:Matlab 火箭飞行模拟器 【开源】飞鹰一号探空火箭——箭体设计、制造回顾与仿真对比 偏航角&#xff0c;滚动角&#xf…

基于双闭环PI的SMO无速度控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于双闭环PI的SMO无速度控制系统simulink建模与仿真&#xff0c;基于双闭环PI的SMO无速度控制系统主要由两个闭环组成&#xff1a;一个是电流环&#xff0c;另一个是速度环。…

2024深入评测CleanMyMac X4.14.6破解版新的功能

随着时间的推移&#xff0c;我们的Mac电脑往往会变得越来越慢&#xff0c;存储空间变得越来越紧张&#xff0c;这时候一个优秀的清理工具就显得尤为重要。作为一款备受好评的Mac清理工具&#xff0c;它能够为你的Mac带来全方位的清理和优化。在本文中&#xff0c;我们将深入评测…

中科驭数与宽睿科技达成战略合作,共筑超低时延软硬一体技术底座

近日&#xff0c;中科驭数&#xff08;北京&#xff09;科技有限公司&#xff08;简称“中科驭数”&#xff09;和上海宽睿信息科技有限责任公司&#xff08;简称“宽睿科技”&#xff09;完成战略合作协议签署。双方将结合各自在超低时延软硬件领域的深厚业务积累和技术产品优…

晶振的起振温度对电子设备的影响

晶振&#xff0c;作为电子设备中的关键元件&#xff0c;其性能参数对设备的稳定性和可靠性具有重要影响。其中&#xff0c;晶振的起振温度是决定其工作性能的重要因素之一。晶发电子将探讨晶振起振温度对电子设备的影响以及如何应对这些影响。 首先&#xff0c;我们要了解什么…

2023/12/26中断作业

成果图&#xff1a; 代码&#xff1a; 函数层 key_it.c #include "key_init.h" void key1_it_config() { //RCC时钟RCC->MP_AHB4ENSETR |(0X1<<5);//设置PF9管脚为输入GPIOF->MODER &(~(0x3<<18));//设置PF9管脚为exti9输入EXTI->EXTI…

减小PAPR——DFT扩频

文章目录 前言一、DFT 扩频原理二、MATLAB 仿真1、核心代码2、仿真结果①、4QAM 调制时 IFDMA、LFDMA 和 OFDMA 的 DFT 扩频技术的 PAPR 性能②、16QAM 调制时 IFDMA、LFDMA 和 OFDMA 的 DFT 扩频技术的 PAPR 性能③、64QAM 调制时 IFDMA、LFDMA 和 OFDMA 的 DFT 扩频技术的 PA…