当前位置: 首页 > news >正文

java web 实验五 Servlet控制层设计(设计性)

实验  Servlet控制层设计(设计性)

//代码放在资源包里了

  1. 实验目的
    1. 熟悉Servlet的基本语法。
    2. 掌握采用HTML、JS、JDBC、JSP、Servlet和四层结构的综合应用。
  2. 实验要求
    1. 本实验要求每个同学单独完成;
    2. 调试程序要记录调试过程中出现的问题及解决办法,并写入到实验总结和心得;
    3. 完成实验后直接在题目后面按要求给出本实验的实验报告。
  3. 实验设备、环境

奔腾以上计算机,装有Myeclipse 6.0以上。

  1. 实验内容
    1. 使用前面所介绍的Servlet知识构建一个登陆应用,具体要求如下:
    1. 创建一个登陆应用,如下图所示。
    2. 用户输入登陆信息,如用户名和密码,
    3. LoginServlet调用UserBean完成身份验证(编写UserService,UserDao类,完成数据的访问),如果身份验证成功,跳转到成功页面,否则,跳转到失败页面。

`

把程序运行界面截图贴在这里,源码贴到附录部分

    1. 使用Servlet和四层结构知识,改进实验四中题4.2的用户信息管理系统,使其具有更好的软件结构,以及提升可读性和可扩展性。

把程序运行界面截图贴在这里,源码贴到附录部分

  1. 实验总结与心得请详细叙述你通过该实验掌握的知识点和心得,比如对错误的解决办法等)

问题:

1.java.lang.IllegalArgumentException: 名为 [LoginServlet]和 [com.example.controller.LoginServlet] 的servlet不能映射为一个url模式(url-pattern) [/login]

有两个Servlet试图映射到相同的URL模式(/login),这是不允许的。以下是解决此问题的步骤:

后面重新检查了web.xml配置解决了问题

<servlet>

    <servlet-name>LoginServlet</servlet-name>

    <servlet-class>com.example.controller.LoginServlet</servlet-class>

</servlet>

<servlet-mapping>

    <servlet-name>LoginServlet</servlet-name>

    <url-pattern>/login</url-pattern>

</servlet-mapping>

   

      2. SQL异常处理:在与数据库交互时,我经常遇到SQLException。我学会了如何使用try-catch块来捕获异常,并在控制台输出错误信息。这不仅帮助我快速定位问题,还让我意识到在生产环境中需要更优雅的错误处理机制,比如记录日志或向用户显示友好的错误信息。

3.表单验证:在用户注册和登录过程中,我发现表单输入的有效性非常重要。我通过在JSP中使用required属性来确保用户输入的完整性。此外,我还学习了如何在服务层中进行更复杂的验证,比如检查用户名是否已存在。

4.调试技巧:在调试过程中,我使用了System.out.println和调试器来跟踪程序的执行流程。这让我能够清晰地看到每一步的输出,帮助我理解程序的运行状态。

  

心得:

表现层:学习了如何使用JSP页面来构建用户界面。通过JSP,我能够动态生成HTML内容,并与用户进行交互。理解了如何使用JSP表达式和脚本来处理用户输入和显示信息。

  

控制层:在UserServlet中,我实现了请求的处理逻辑。通过doPost和doGet方法,我能够根据不同的请求参数(如action)调用相应的服务层方法。这让我认识到控制层在MVC架构中的重要性,它负责协调表现层和服务层之间的交互。

服务层:在UserService中,我实现了用户注册、删除和验证等业务逻辑。通过将业务逻辑与控制层分离,我提高了代码的可维护性和可读性。这一层的设计让我意识到,良好的业务逻辑封装可以使得后续的功能扩展更加容易。

数据访问层:在UserDAO中,我学习了如何使用JDBC与数据库进行交互。通过封装数据库操作,我能够更好地管理数据访问逻辑,避免在控制层中直接处理SQL语句。这种分层设计使得代码更加模块化。

  1. 源码附录

4.1实验

DatabaseConnection.java

package com.example;

import java.sql.Connection;

import java.sql.DriverManager;

// 数据库连接类

public class DatabaseConnection {

    // 获取数据库连接的方法

    public static Connection getConnection() {

        Connection con = null; // 初始化连接对象

        try {

            // 加载MySQL JDBC驱动

            Class.forName("com.mysql.cj.jdbc.Driver");

            // 连接到数据库

            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/user_system", "root", "123456");

        } catch (Exception e) {

            e.printStackTrace(); // 打印异常信息

        }

        return con; // 返回连接对象

    }

}

package com.example;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

@WebServlet("/LoginServlet") // 映射URL到此Servlet

public class LoginServlet extends HttpServlet {

 private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // 获取用户输入的用户名和密码

        String username = request.getParameter("username");

        String password = request.getParameter("password");

        // 创建UserService实例以验证用户

        UserService userService = new UserService();

        boolean isValidUser = userService.validateUser(username, password);

        // 根据验证结果重定向到相应的页面

        if (isValidUser) {

            response.sendRedirect("success.jsp"); // 验证成功,跳转到成功页面

        } else {

            response.sendRedirect("failure.jsp"); // 验证失败,跳转到失败页面

        }

    }

}

package com.example;

// 用户数据模型类

public class UserBean {

    private String username; // 用户名

    private String password; // 密码

    // 获取用户名

    public String getUsername() {

        return username;

    }

    // 设置用户名

    public void setUsername(String username) {

        this.username = username;

    }

    // 获取密码

    public String getPassword() {

        return password;

    }

    // 设置密码

    public void setPassword(String password) {

        this.password = password;

    }

}

package com.example;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

// 数据访问类,用于与数据库交互

public class UserDao {

    // 验证用户凭据的方法

    public boolean validate(String username, String password) {

        boolean status = false; // 默认状态为无效用户

        try {

            // 获取数据库连接

            Connection con = DatabaseConnection.getConnection(); // 假设您有一个DatabaseConnection类

            // 准备SQL查询

            PreparedStatement ps = con.prepareStatement("SELECT * FROM users WHERE username=? AND password=?");

            ps.setString(1, username); // 设置用户名参数

            ps.setString(2, password); // 设置密码参数

            ResultSet rs = ps.executeQuery(); // 执行查询

            status = rs.next(); // 如果找到记录,则用户有效

        } catch (Exception e) {

            e.printStackTrace(); // 打印异常信息

        }

        return status; // 返回用户验证状态

    }

}

package com.example;

// 用户服务类,处理用户相关的业务逻辑

public class UserService {

    private UserDao userDao = new UserDao(); // 创建UserDao实例

    // 验证用户的方法

    public boolean validateUser(String username, String password) {

        return userDao.validate(username, password); // 调用UserDao的验证方法

    }

}

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

    <title>Failure</title>

</head>

<body>

    <h2>登录失败</h2>

    <!-- 登录失败后的提示 -->

</body>

</html>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

    <title>Login</title>

</head>

<body>

    <h2>登录</h2>

    <!-- 表单提交到LoginServlet -->

    <form action="LoginServlet" method="post">

        用户名: <input type="text" name="username" required /><br />

        密码: <input type="password" name="password" required /><br />

        <input type="submit" value="登录" />

    </form>

</body>

</html>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

    <title>Success</title>

</head>

<body>

    <h2>登录成功</h2>

    <!-- 登录成功后的提示 -->

</body>

</html>

4.2实验

editUser

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee

         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"

         version="3.1">

    <servlet>

        <servlet-name>UserServlet</servlet-name>

        <servlet-class>com.example.controller.UserServlet</servlet-class> <!-- 确保包名正确 -->

    </servlet>

    <servlet-mapping>

        <servlet-name>UserServlet</servlet-name>

        <url-pattern>/user</url-pattern>

    </servlet-mapping>

    <servlet>

        <servlet-name>LoginServlet</servlet-name>

        <servlet-class>com.example.controller.LoginServlet</servlet-class>

    </servlet>

    <servlet-mapping>

        <servlet-name>LoginServlet</servlet-name>

        <url-pattern>/login</url-pattern>

    </servlet-mapping>

    

    

</web-app>

Index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

    <title>用户信息管理系统</title>

</head>

<body>

    <h1>欢迎来到用户信息管理系统</h1>

    <a href="login.jsp">登录</a> | <a href="register.jsp">注册</a>

</body>

</html>

Login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

    <title>用户登录</title>

</head>

<body>

    <h1>用户登录</h1>

    <form action="login" method="post">

        用户名: <input type="text" name="username" required><br>

        密码: <input type="password" name="password" required><br>

        <input type="submit" value="登录">

    </form>

    <%

        String errorMessage = (String) request.getAttribute("errorMessage");

        if (errorMessage != null) {

            out.println("<p>" + errorMessage + "</p>");

        }

    %>

</body>

</html>

Register.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

    <title>注册</title>

</head>

<body>

    <h1>用户注册</h1>

    <form action="user" method="post">

        <input type="hidden" name="action" value="register">

        用户名: <input type="text" name="username" required><br>

        密码: <input type="password" name="password" required><br>

        年龄: <input type="number" name="age" required><br>

        <input type="submit" value="注册">

    </form>

</body>

</html>

userList.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%@ page import="com.example.entity.User" %>

<%@ page import="com.example.service.UserService" %>

<%@ page import="java.util.List" %>

<%@ page import="java.sql.SQLException" %>

<html>

<head>

    <title>用户列表</title>

    <script>

        function confirmDelete() {

            return confirm("您确定要删除该用户吗?");

        }

    </script>

</head>

<body>

    <h1>用户列表</h1>

    <%

        String deleteMessage = request.getParameter("message");

        if (deleteMessage != null) {

    %>

        <p style="color: green;"><%= deleteMessage %></p>

    <%

        }

    %>

    <h2>通过 JavaBean 删除用户</h2>

    <form action="user" method="post" οnsubmit="return confirmDelete();">

        <input type="hidden" name="action" value="delete">

        <label for="usernameToDelete">用户名:</label>

        <input type="text" id="usernameToDelete" name="username" required>

        <input type="submit" value="删除用户">

    </form>

    <table border="1">

        <tr>

            <th>用户名</th>

            <th>年龄</th>

            <th>操作</th>

        </tr>

        <%

            UserService userService = new UserService();

            try {

                List<User> users = userService.getAllUsers();

                for (User user : users) {

        %>

        <tr>

            <td><%= user.getUsername() %></td>

            <td><%= user.getAge() %></td>

            <td>

                <form action="user" method="post" style="display:inline;">

                    <input type="hidden" name="action" value="edit">

                    <input type="hidden" name="username" value="<%= user.getUsername() %>">

                    <input type="submit" value="编辑">

                </form>

            </td>

        </tr>

        <%

                }

            } catch (SQLException e) {

                e.printStackTrace();

                out.println("<tr><td colspan='3'>无法获取用户列表: " + e.getMessage() + "</td></tr>");

            }

        %>

    </table>

    <a href="login.jsp">注销</a>

</body>

</html>

package com.example.controller;

import javax.servlet.ServletException;

import javax.servlet.http.*;

import com.example.service.UserService;

import java.io.IOException;

import java.sql.SQLException;

public class LoginServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    private UserService userService = new UserService();

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String username = request.getParameter("username");

        String password = request.getParameter("password");

        try {

            if (userService.validateUser(username, password)) {

                request.getSession().setAttribute("user", username);

                response.sendRedirect("userList.jsp");

            } else {

                request.setAttribute("errorMessage", "用户名或密码错误");

                request.getRequestDispatcher("login.jsp").forward(request, response);

            }

        } catch (SQLException e) {

            e.printStackTrace();

            response.sendRedirect("login.jsp?message=登录失败: " + e.getMessage());

        }

    }

}

//控制层(Controller Layer):负责接收用户请求并调用相应的服务层逻辑。在你的项目中,UserServlet类就是控制层的实现,它处理用户的请求,如注册、删除和更新用户信息。

package com.example.controller;

import java.io.IOException;

import java.sql.SQLException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.net.URLEncoder;

import com.example.entity.User;

import com.example.service.UserService;

public class UserServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    private UserService userService = new UserService();

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String action = request.getParameter("action");

        String username = request.getParameter("username");

        try {

            if ("register".equals(action)) {

                String password = request.getParameter("password");

                int age = Integer.parseInt(request.getParameter("age"));

                User user = new User(username, password, age);

                userService.registerUser(user);//调用userService中的registerUser方法

                response.sendRedirect("login.jsp");

            } else if ("delete".equals(action)) {

                userService.deleteUser(username);

                response.sendRedirect("userList.jsp?message=" + URLEncoder.encode("用户 " + username + " 已成功删除。", "UTF-8"));

            } else if ("edit".equals(action)) {

                User user = userService.getUser(username);

                request.setAttribute("user", user);

                request.getRequestDispatcher("editUser.jsp").forward(request, response);

            } else if ("save".equals(action)) {

                String password = request.getParameter("password");

                int age = Integer.parseInt(request.getParameter("age"));

                User user = new User(username, password, age);

                userService.updateUser(user);

                response.sendRedirect("userList.jsp?message=用户 " + username + " 信息已成功保存。");

            }

        } catch (SQLException e) {

            e.printStackTrace();

            response.sendRedirect("userList.jsp?message=操作失败: " + e.getMessage());

        }

    }

}

package com.example.dao;

// UserDAO.java

import java.sql.*;

import java.util.ArrayList;

import java.util.List;

import com.example.entity.User;

public class UserDAO {

    private String jdbcURL = "jdbc:mysql://localhost:3306/user_management";

    private String jdbcUsername = "root";

    private String jdbcPassword = "123456";

    

    public void registerUser(User user) throws SQLException {

        String sql = "INSERT INTO users (username, password, age) VALUES (?, ?, ?)";

        try (Connection connection = DriverManager.getConnection(jdbcURL, jdbcUsername, jdbcPassword);

             PreparedStatement ps = connection.prepareStatement(sql)) {

            ps.setString(1, user.getUsername());

            ps.setString(2, user.getPassword());

            ps.setInt(3, user.getAge());

            ps.executeUpdate();

        } catch (SQLException e) {

            e.printStackTrace();

            throw e; // 重新抛出异常以便上层处理

        }

    }

    

    public List<User> getAllUsers() throws SQLException {

        List<User> users = new ArrayList<>();

        try (Connection connection = DriverManager.getConnection(jdbcURL, jdbcUsername, jdbcPassword);

             Statement stmt = connection.createStatement();

             ResultSet rs = stmt.executeQuery("SELECT * FROM users")) {

            while (rs.next()) {

                String username = rs.getString("username");

                String password = rs.getString("password");

                int age = rs.getInt("age");

                users.add(new User(username, password, age));

            }

        } catch (SQLException e) {

            e.printStackTrace();

            throw e; // 重新抛出异常以便上层处理

        }

        return users;

    }

    public void deleteUser(String username) throws SQLException {

        // 使用 try-with-resources 确保连接和语句被正确关闭

        try (Connection connection = DriverManager.getConnection(jdbcURL, jdbcUsername, jdbcPassword);

             PreparedStatement statement = connection.prepareStatement("DELETE FROM users WHERE username=?")) {

            statement.setString(1, username);

            statement.executeUpdate();

        } catch (SQLException e) {

            // 记录异常信息

            e.printStackTrace();

            throw e; // 重新抛出异常以便上层处理

        }

    }

    public User getUser(String username) throws SQLException {

        User user = null;

        try (Connection connection = DriverManager.getConnection(jdbcURL, jdbcUsername, jdbcPassword);

             PreparedStatement ps = connection.prepareStatement("SELECT * FROM users WHERE username=?")) {

            ps.setString(1, username);

            ResultSet rs = ps.executeQuery();

            if (rs.next()) {

                String password = rs.getString("password");

                int age = rs.getInt("age");

                user = new User(username, password, age);

            }

        } catch (SQLException e) {

            e.printStackTrace();

            throw e; // 重新抛出异常以便上层处理

        }

        return user;

    }

    public void updateUser(User user) throws SQLException {

        try (Connection connection = DriverManager.getConnection(jdbcURL, jdbcUsername, jdbcPassword);

             PreparedStatement ps = connection.prepareStatement("UPDATE users SET password=?, age=? WHERE username=?")) {

            ps.setString(1, user.getPassword());

            ps.setInt(2, user.getAge());

            ps.setString(3, user.getUsername());

            ps.executeUpdate();

        } catch (SQLException e) {

            e.printStackTrace();

            throw e; // 重新抛出异常以便上层处理

        }

    }

    public boolean validateUser(String username, String password) throws SQLException {

        try (Connection connection = DriverManager.getConnection(jdbcURL, jdbcUsername, jdbcPassword);

             PreparedStatement ps = connection.prepareStatement("SELECT * FROM users WHERE username=? AND password=?")) {

            ps.setString(1, username);

            ps.setString(2, password);

            ResultSet rs = ps.executeQuery();

            return rs.next();

        } catch (SQLException e) {

            e.printStackTrace();

            throw e; // 重新抛出异常以便上层处理

        }

    }

}

//数据访问层: 负责与数据库进行交互,执行SQL查询和更新操作。UserDAO类则实现了这一层的功能,通过JDBC与数据库进行交互。

package com.example.entity;

public class User {

    private String username;

    private String password;

    private int age;

    public User(String username, String password, int age) {

        this.username = username;

        this.password = password;

        this.age = age;

    }

    // Getters and Setters

    public String getUsername() {

        return username;

    }

    public void setUsername(String username) {

        this.username = username;

    }

    public String getPassword() {

        return password;

    }

    public void setPassword(String password) {

        this.password = password;

    }

    public int getAge() {

        return age;

    }

    public void setAge(int age) {

        this.age = age;

    }

}

package com.example.service;

import com.example.dao.UserDAO;

import com.example.entity.User;

import java.sql.SQLException;

import java.util.List;

public class UserService {

    private UserDAO userDAO = new UserDAO();

    

    public void registerUser(User user) throws SQLException {

        userDAO.registerUser(user); // 调用 UserDAO 的 registerUser 方法

    }

    

    public List<User> getAllUsers() throws SQLException {

        return userDAO.getAllUsers();

    }

    public void deleteUser(String username) throws SQLException {

        try {

userDAO.deleteUser(username);

} catch (Exception e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

    }

    public User getUser(String username) throws SQLException {

        try {

return userDAO.getUser(username);

} catch (Exception e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

return null;

    }

    public void updateUser(User user) throws SQLException {

        try {

userDAO.updateUser(user);

} catch (Exception e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

    }

    public boolean validateUser(String username, String password) throws SQLException {

        return userDAO.validateUser(username, password);

    }

}

//服务层:负责业务逻辑的处理。你的UserService类实现了用户相关的业务逻辑,例如注册、删除和验证用户。

相关文章:

java web 实验五 Servlet控制层设计(设计性)

实验五 Servlet控制层设计&#xff08;设计性&#xff09; //代码放在资源包里了 实验目的 熟悉Servlet的基本语法。掌握采用HTML、JS、JDBC、JSP、Servlet和四层结构的综合应用。实验要求 本实验要求每个同学单独完成&#xff1b;调试程序要记录调试过程中出现的问题及解决…...

Timestamp Unix时间戳在线转换 - 加菲工具

Timestamp Unix时间戳在线转换 打开网站 加菲工具 选择“时间戳转换” 或者直接打开&#xff1a; https://www.orcc.online/tools/timestamp 在前半部分输入框输入时间/时间戳&#xff0c;点击“转换>>”按钮&#xff0c;即可转换完成 得到转换结果...

ABAP 订单多次开票,显示多张开票凭证

一、业务背景 在实际业务上&#xff0c;同一笔销售订单可能分多次发货&#xff0c;多次开票&#xff0c;因此再销售订单状态报表上就要体现该过程&#xff1a;对于同一张销售订单&#xff0c;分多次开票时&#xff0c;按照发票和订单行项目&#xff0c;显示开票数量与为开票数…...

源码安装编译gcc-12

下载gcc12 https://link.zhihu.com/?targethttps%3A//github.com/gcc-mirror/gcc/archive/refs/tags/releases/gcc-12.2.0.tar.gz 解压并执行相关依赖下载 ./contrib/download_prerequisites make && make install 默认装在/usr/local下&#xff0c; 如果要自己指定…...

VGGNet:深度学习中的卷积神经网络经典之作

目录 ​编辑 引言 VGGNet的历史背景 VGGNet的特点 1. 深度网络结构 2. 小卷积核的使用 3. 多尺度训练 4. 参数量的优化 5. 去除局部响应归一化 6. 优秀的特征提取能力 VGGNet的应用案例 VGGNet的代码复现 代码解析 结论 引言 在深度学习的浪潮中&#xff0c;卷积…...

opencv所有常见函数

一、opencv图像操作 二、opencv图像的数值运算 三、opencv图像的放射变换 四、opencv空间域图像滤波 五、图像灰度化与直方图 六、形态学图像处理 七、阈值处理与边缘检测 八、轮廓和模式匹配...

Shell语言基础语法(3)

目录 简介 一、流程控制 1、if 语句 2、case 选择 3、while 循环 4、for 循环 5、扩展使用select 二、函数 1、函数的定义 2、函数的调用 3、函数的传参 4、函数的返回值 5、局部变量 6、全局变量 总结 简介 Shell 脚本是一种强大的工具&#xff0c;广泛用于 Lin…...

Linux CentOS 9搭建Hadoop3集群

1. 引言 本教程旨在介绍在Linux上安装Hadoop 2. 前提条件 2.1 安装JDK 安装Hadoop&#xff0c;必须首先安装JDK&#xff0c;并配置环境变量&#xff08;此处不做详细描述&#xff09; Jdk官网(https://www.oracle.com/java/technologies/javase/javase8u211-later-archive…...

加速科技精彩亮相ICCAD 2024

12月11日—12日 &#xff0c;中国集成电路设计业的年度盛会——ICCAD 2024在上海世博馆隆重举行。本次活动以“智慧上海&#xff0c;芯动世界”为主旨&#xff0c;汇聚了众多业界精英&#xff0c;共同探讨集成电路产业的未来。作为半导体测试行业领军企业&#xff0c;加速科技携…...

canvas(填充描边,绘制矩形、路径、文本、图像,变换,阴影,渐变等)

一、 基本的画布功能 创建 <canvas> 元素时至少要设置其 width 和 height 属性&#xff0c;这样才能告诉浏览器在多大面积上绘 图。出现在开始和结束标签之间的内容是后备数据&#xff0c;会在浏览器不支持 <canvas> 元素时显示。比如&#xff1a; <canv…...

STM8单片机学习笔记·GPIO的片上外设寄存器

目录 前言 IC基本定义 三极管基础知识 单片机引脚电路作用 STM8GPIO工作模式 GPIO外设寄存器 寄存器含义用法 CR1&#xff1a;Control Register 1 CR2&#xff1a;Control Register 2 ODR&#xff1a;Output Data Register IDR&#xff1a;Input Data Register 赋值…...

2-2-18-16 QNX系统架构之自适应分区

阅读前言 本文以QNX系统官方的文档英文原版资料为参考&#xff0c;翻译和逐句校对后&#xff0c;对QNX操作系统的相关概念进行了深度整理&#xff0c;旨在帮助想要了解QNX的读者及开发者可以快速阅读&#xff0c;而不必查看晦涩难懂的英文原文&#xff0c;这些文章将会作为一个…...

【Python网络爬虫笔记】11- Xpath精准定位元素

目录 一、Xpath 在 Python 网络爬虫中的作用&#xff08;一&#xff09;精准定位元素&#xff08;二&#xff09;应对动态网页&#xff08;三&#xff09;数据结构化提取 二、Xpath 的常用方法&#xff08;一&#xff09;节点选取&#xff08;二&#xff09;谓词筛选&#xff0…...

Rustdesk 安装客户端以及自己搭建服务器跑通参考资料

Rustdesk 安装客户端以及自己搭建服务器跑通参考资料 下载客户端&#xff1a; rustdesk客户端-github下载地址 windows正常安装就行了&#xff0c;ubuntu安装参考下面&#xff1a; ubuntu安装rustdesk客户端 在centos中利用docker安装rustdesk-server&#xff0c;先进行cento…...

源码编译jdk7 超详细教程 openjdk7

关于源代码 当前的openJDK的源代码已经被发布到了github上了&#xff0c;所以我们可以直接从github上下载到。 OpenJDK7u源码托管地址&#xff1a;https://github.com/openjdk/jdk7u 带后缀U的地址&#xff0c;或者发行的jdk包&#xff0c;表示当前版本下的持续跟新版。而他…...

如何实现日期选择窗口

文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了TimePicker Widget相关的内容,本章回中将介绍DatePickerDialog Widget.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在这里说的DatePickerDialog是一种弹出窗口,只不过窗口的内容固定显示为日期,它…...

Spring Security 6 系列之一 - 开篇入门

之所以想写这一系列&#xff0c;是因为之前工作过程中使用Spring Security&#xff0c;但当时基于spring-boot 2.3.x&#xff0c;其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0&#xff0c;结果一看Spring Security也升级为6.3.0&#xff0c;关键是其风…...

Spring Cloud概述

1. 认识微服务 1.1 单体架构 很多创业公司早期或者传统企业会把业务的所有功能实现都打包在⼀个项⽬, 这就是单体架构. 业务的所有功能实现都打包在⼀个war包或者Jar包中, 这种⽅式就称为单体架构. 举个例子: 电商系统包括: ⽤⼾管理, 商品管理, 订单管理, ⽀付管理, 库存…...

mvc如何给action传递参数

步骤(常规方法) 新建一个控制器--LarsController.cs using Microsoft.AspNetCore.Mvc; namespace Blog.Controller; public class LarsController:Controller -----继承 {public IActionResult Index(){return View();} }获取id // program.cs中默认值是idpublic IAction…...

【银河麒麟高级服务器操作系统】有关dd及cp测试差异的现象分析详解

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn dd现象 使用银河麒麟高级服务器操作系统执行两次…...

视频智能分析平台LiteAIServer未戴安全帽检测算法助力矿山安全:精准监督矿工佩戴安全帽情况

矿山作业环境复杂多变&#xff0c;安全隐患层出不穷。其中&#xff0c;矿工未佩戴安全帽这一行为&#xff0c;看似微不足道&#xff0c;实则潜藏着巨大的安全风险。一旦发生事故&#xff0c;未佩戴安全帽的矿工将极易受到重创&#xff0c;甚至危及生命。因此&#xff0c;确保每…...

整数的四舍五入----->记录每一点进步

我们知道整数类型的变量对小数部分都不感冒&#xff0c;只要是小数都会舍去&#xff0c;都让他舍去了我们还讲个P&#xff0c;所以接下来就是告诉你怎么不让他全都舍去。 先来试想一下如果这个数字是3.4&#xff0c;存到整数型变量里面是不是直接变成了3&#xff0c;那么我要是…...

Linux栈帧

相关寄存器&指令 寄存器 rax&#xff08;accumulator&#xff09;&#xff1a;return value rbx&#xff08;base&#xff09; rcx&#xff08;count&#xff09;&#xff1a;4st argument rdx&#xff08;data&#xff09;&#xff1a;3st argument rsi&#xff08;sour…...

【代码随想录day59】【C++复健】 47. 参加科学大会(dijkstra(堆优化版)精讲 );94. 城市间货物运输 I

前几天有些事情耽搁了&#xff0c;不过好在图论我完全不会&#xff0c;所以偷看代码思路也没有任何的心理负担&#xff0c;做起来反而相对独立思考更快一点点。 47. 参加科学大会&#xff08;dijkstra&#xff08;堆优化版&#xff09;精讲 &#xff09; 本来一开始以为这个堆…...

【网络安全】WIFI WPA/WPA2协议:深入解析与实践

WIFI WPA/WPA2协议&#xff1a;深入解析与实践 1. WPA/WPA2 协议 1.1 监听 Wi-Fi 流量 解析 WPA/WPA2 的第一步是监听 Wi-Fi 流量&#xff0c;捕获设备与接入点之间的 4 次握手数据。然而&#xff0c;设备通常不会频繁连接或重新连接&#xff0c;为了加速过程&#xff0c;攻…...

穷举vs暴搜vs深搜vs回溯vs剪枝专题一>子集

题目&#xff1a; 两个方法本质就是决策树的画法不同 方法一解析&#xff1a; 代码&#xff1a; class Solution {private List<List<Integer>> ret;//返回结果private List<Integer> path;//记录路径&#xff0c;注意返回现场public List<List<Int…...

试题转excel;word转excel;大风车excel

一、问题描述 一名教师朋友&#xff0c;偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运&#xff0c;几百道题几乎需要一个下午的时间 关键这些事&#xff0c;枯燥无聊费眼睛&#xff0c;实在是看起来就很蠢的工作 就想着做一个工具&#xff0c;可以自动处理…...

Unity NTPComponent应用, 实现一个无后端高效获取网络时间的组件

无后端高效获取网络时间的组件 废话不多说&#xff0c;直接上源码m_NowSerivceTime 一个基于你发行游戏地区的时间偏移&#xff0c; 比如北京时区就是 8, 巴西就是-3&#xff0c;美国就是-5using Newtonsoft.Json; 如果这里报错&#xff0c; 就说明项目没有 NewtonsoftJson插件…...

复合机器人为生产提供精准的建议和决策支持

在现代化生产的浪潮中&#xff0c;智能复合机器人以其卓越的性能和高度智能化特点&#xff0c;正成为保障生产安全与可靠性的重要力量。 智能复合机器人具备精确的感知、判断和决策能力&#xff0c;能够在复杂的生产环境中自主导航、精确操作&#xff0c;避免了人为因素可能导致…...

springboot/ssm二手儿童绘本交易系统Java代码编写web项目闲置书籍源码

springboot/ssm二手儿童绘本交易系统Java代码编写web项目闲置书籍源码 基于springboot(可改ssm)vue项目 开发语言&#xff1a;Java package com.controller;import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.Map;import javax.s…...

30. Three.js案例-绘制并渲染圆弧

30. Three.js案例-绘制并渲染圆弧 实现效果 知识点 WebGLRenderer WebGLRenderer 是 Three.js 中用于渲染 3D 场景的核心类。它利用 WebGL 技术在浏览器中渲染 3D 图形。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选参数对象&#xff…...

类和对象(2)

大家好&#xff0c;今天我们继续来学习类和对象的知识&#xff0c;那么今天我们来看看类的概念和类的定义相关的知识&#xff0c;那么话不多说&#xff0c;我们直接开始。 2.类定义和使用 面向对象程序设计关注的是对象,而对象是现实生活中的实体,比如:洗衣机&#xff0c;但是…...

240004基于ssm+maven+mysql+Java的房屋租赁系统的设计与实现

基于ssmmavenmysql的房屋租赁系统的设计与实现 1.项目描述2.运行环境3.项目截图4.源码获取 1.项目描述 该项目在原有的基础上进行了优化&#xff0c;包括新增了注册功能&#xff0c;房屋模糊查询功能&#xff0c;管理员和用户信息管理等功能&#xff0c;以及对网站界面进行了优…...

HTTP、WebSocket、gRPC 或 WebRTC:各种协议的区别

在为您的应用程序选择通信协议时&#xff0c;有很多不同的选择。 本文将了解四种流行的解决方案&#xff1a;HTTP、WebSocket、gRPC 和 WebRTC。 我们将通过深入学习其背后原理、最佳用途及其优缺点来探索每个协议。 通信方式在不断改进&#xff1a;变得更快、更方便、更可靠&…...

FlowNex 中的两相建模基础知识

通过 FlowNex 中的两相建模解开高效流体动力学的秘密&#xff0c;彻底改变制造业。 挑战 两相流是指两个不同相&#xff08;通常是液体和气体&#xff09;同时流动&#xff0c;它们具有不同的特性和行为。在制造业中&#xff0c;了解两相流对于优化热交换器、化学反应器和流体…...

Mysql笔记

windows安装记录Windows中Mysql安装-CSDN博客 用到的库 通过网盘分享的文件&#xff1a;atguigudb.sql 链接: https://pan.baidu.com/s/1YfC20c2vK9odn-XRJJwUJw 提取码: utk7 --来自百度网盘超级会员v5的分享 Mysql4中表关联关系 1.1对1,比较少用,因为完全可以一张表,当有…...

docker拉取rabbitmq镜像安装延迟队列插件

我这里使用的是rabbitmq:3.12.0-management版本作为示例 1.拉取rabbitmq镜像 docker pull rabbitmq:3.12.0-management 2.启动rabbitmq docker run -d --namerabbitmq --restartalways -p 5672:5672 -p 15672:15672 rabbitmq:3.12.0-management 在咱们拉取时如果出现连接超时可…...

创建一个谷歌插件项目dome上线流程+源码

创建一个简单的 Chrome 扩展程序&#xff0c;其主要功能是 JSON 格式化。用户可以通过点击扩展图标打开一个弹出窗口&#xff0c;在弹出窗口中输入或粘贴 JSON 数据&#xff0c;然后点击格式化按钮来格式化 JSON 数据 谷歌插件&#xff08;即 Chrome 扩展程序&#xff09;主要设…...

举例说明如何在linux下检测摄像头设备具备的功能

假设摄像头设备文件为/dev/video1 &#xff0c;下面是一个专门用于检测 /dev/video1 设备能力的简化程序。这个程序将打印出设备的所有能力、格式和其他相关信息&#xff0c;以帮助你了解设备支持的功能。 检测 /dev/video1 设备能力的程序 #include <fcntl.h> #includ…...

win10配置子系统Ubuntu子系统(无需通过Windows应用市场)实际操作记录

win10配置子系统Ubuntu子系统&#xff08;无需通过Windows应用市场&#xff09;实际操作记录 参考教程 : win10配置子系统Ubuntu子系统&#xff08;无需通过Windows应用市场&#xff09; - 一佳一 - 博客园 开启虚拟机服务的 以管理员方式运行PowerShell运行命令。 &#xf…...

东北大学《2024年839自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《东北大学839自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2024年真题 Part1&#xff1a;2024年完整版真题 2024年真题...

5G中的ATG Band

Air to Ground Networks for NR是R18 NR引入的。ATG很多部分和NTN类似中的内容类似。比较明显不同的是&#xff0c;NTN的RF内容有TS 38.101-5单独去讲&#xff0c;而ATG则会和地面网络共用某些band&#xff0c;这部分在38.101-1中有描述。 所以会存在ATG与地面网络之间的相邻信…...

nginx负载均衡配置

目录 一、简介 二、nginx下载 二、nginx配置 四、注意点 (1)/api与/api/的区别 (2)http://gatewayserver与http://gatewayserver/的区别 一、简介 Nginx&#xff08;发音为 "engine-x"&#xff09;是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMA…...

【教学类-83-02】20241214立体书三角嘴2.0——青蛙(扁菱形嘴)

背景需求&#xff1a; 制作小鸡立体贺卡三角嘴&#xff0c;它的嘴是正菱形&#xff08;四条边长度相等&#xff0c;类似正方形&#xff09; 【教学类-83-01】20241215立体书三角嘴1.0——小鸡&#xff08;正菱形嘴&#xff09;-CSDN博客文章浏览阅读744次&#xff0c;点赞22次…...

vscode设置终端代理

转载请标明出处&#xff1a;小帆的帆的博客 设置终端代理 修改项目的.vscode/settings.json {"terminal.integrated.env.windows": {"http_proxy": "http://127.0.0.1:7890","https_proxy": "http://127.0.0.1:7890"}, }…...

【C++】函数计算题解论

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;思路解析3.1 函数的递归定义3.2 边界条件控制3.3 记忆化搜索 &#x1f4af;C实现代码&#x1f4af;添加解释&#x1f4af;小结 &#x1f4af;前言 在…...

Redis篇-21--运维篇3-集群(分片,水平扩展,高可用,集群配置案例,扩展哨兵案例)

1、概述 Redis集群&#xff08;Cluster&#xff09;通过分片&#xff08;sharding&#xff09;实现了水平扩展&#xff0c;允许数据分布在多个节点上&#xff0c;从而提升性能和存储容量。 在Redis集群中&#xff0c;数据被分割成16384个哈希槽&#xff08;hash slots&#x…...

Unity3d场景童话梦幻卡通Q版城镇建筑植物山石3D模型游戏美术素材

注明&#xff1a;网络素材&#xff0c;仅供学习使用&#xff01; https://download.csdn.net/download/elineSea/90017291...

深入理解addEventListener中的第二个参数:listener

起因 首先&#xff0c;之前留给我们的一点东西&#xff0c;js的深入内容关键在addEventListener&#xff0c;这个函数中的参数&#xff0c;它们三个参数&#xff0c;分别为type、listener、options&#xff0c;当然在这里还有一些小的问题&#xff0c;比如mdn文档中它介绍到了另…...

数据库镜像(Database Mirroring):高可用性与灾难恢复技术

一、引言 在现代信息系统中&#xff0c;数据的可用性和完整性至关重要&#xff0c;尤其是对金融、电商、医疗等高并发和高可靠性要求的行业。数据库镜像&#xff08;Database Mirroring&#xff09; 作为一种高可用性与灾难恢复技术&#xff0c;通过将主数据库的数据实时复制到…...