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

JavaWeb——MVC架构模式

一、概述:

MVC(Model View Controller)是软件工程中的一种 软件架构模式 ,它把软件系统分为模型、视图和控制器三个基本部分。用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时不需要重新编写业务逻辑。

M代表Model模型层,具体功能如下:

1.存放和数据库对应的实体类以及一些用于存储非数据库表完整相关的VO对象;

2.存放一些对数据进行逻辑运算操作的一些业务处理代码;

V代表view视图层,具体功能如下:

1.存放一些视图文件相关的代码,例如html、css以及js等;

2.在前后端分离的项目中,后端已经没有视图文件,该层次已经衍化成独立的前端项目;

C代表Controller控制层,具体功能如下:

1.接收客户端请求,获得请求数据;

2.将准备好的数据响应给客户端;

二、MVC模式下项目中的常见包:

M:

1.实体类包(pojo /entity /bean):专门存放和数据库对应的实体类和一些VO对象;

2.数据库访问包(dao/mapper):专门存放对数据库不同表格CURD方法封装的一些类;

3.服务包(service):专门存放对数据进行业务逻辑运算的一些类;

C:

控制层包(controller);

V:

1.web目录下的视图资源html、css、js、img等

2.前端工程化后,在后端项目中已经不存在了;

 三、项目搭建:

项目结构:

1.数据库准备:创建schedule_system数据库并执行如下语句

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 8;
DROP TABLE IF EXISTS `sys_schedule`;
CREATE TABLE `sys_schedule`(
`sid` int NOT NULL AUTO_INCREMENT,
`uid` int NULL DEFAULT NULL,
`title` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0908_ai_Ci NULL DEFAULT NULL,
`completed` int(1) NULL DEFAULT NULL,
PRIMARY KEY(`sid`)USING BTREE
)ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = Utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user`(
`uid` int NOT NULL AUTO_INCREMENT
`username` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`user_pwd` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
PRIMARY KEY(`uid`)USING BTREE,
UNIQUE INDEX `username`(`username`)USING BTREE
)ENGINE = InnoDB CHARACTER SET =utf8mb4 COLLATE=utf8mb4 0900_ai_ci ROW_FORMAT =Dynamic;
INSERT INTO `sys_user` VALUES(1,'zhangsan','e10adc3949ba59abbe56e057f20f883e');
INSERT INTO `sys_user` VALUES(2,'lisi','e10adc3949ba59abbe56e057f20f883e');
SET FOREIGN_KEY_CHECKS = 1;

2.pojo包处理:使用lombok处理getter、setter、equals、hashcode、构造器

lombok使用步骤:

(1)检查idea是否已经安装lombok插件

(2)检查是否勾选enable,annotation,processing

(3)导入lombok依赖,在实体类上添加注解

package com.atguigu.schedule.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@AllArgsConstructor//添加带有全部参数的构造器
@NoArgsConstructor//添加无参构造器
@Data//添加getter、setter、equals、hashcode
public class SysUser implements Serializable{private Integer uid;private String username;private String userPwd;
}
package com.atguigu.schedule.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class SysSchedule implements Serializable{private Integer sid;private Integer uid;private String title;private Integer completed;
}

3.dao包的处理:dao类用于定义针对表格的CURD的方法

每张数据表都应该对应一个dao类,该dao类专门用于封装对该数据表的操作内容

(1).创建BaseDao对象

package com.atguigu.schedule.dao;
import com.atguigu.schedule.util.JDBCUtil;
import java.lang.reflect.Field;
import java.sql.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
public class BaseDao{//公共的查询方法 返回的是单个对象public <T>T baseQueryObject(Class<T> clazz, String sql,Object ... args){T t = null;Connection connection = JDBCUtil.getConnection();PreparedStatement preparedStatement = null;ResultSet resultSet = null;int rows = 0;try{// 准备语句对象preparedStatement = connection.prepareStatement(sql);//设置语句上的参数for(int i=0;i<args.length;i++){preparedStatement.setObject(i +1,args[i]);}// 执行 查询resultSet = preparedStatement.executeQuery();if(resultSet.next()){t = (T) resultSet.getobject(1);}}catch(Exception e){e.printStackTrace();}finally {if(null != resultSet){try{resultSet.close();}catch(SQLException e){e.printStackTrace();}}if(null != preparedStatement){try{preparedStatement.close();}catch(SQLException e){e.printStackTrace();}}JDBCUtil.releaseConnection();}return t;}//公共的查询方法 返回的是对象的集合public <T> List<T> baseQuery(Class clazz,String sql,Object ... args){List<T> list =new ArrayList<>();Connection connection = JDBCUtil.getConnection();PreparedStatement preparedStatement = null;ResultSet resultSet = null:int rows = 0;try {// 准备语句对象preparedStatement = connection.prepareStatement(sql);//设置语句上的参数for(int i=0;i<args.length;i++){preparedStatement.setObject(i +1,args[i]);}// 执行 查询resultSet = preparedStatement.executeQuery();ResultSetMetaData metaData = resultSet.getMetaData();int columnCount = metaData.getColumnCount();//将结果集通过反射封装成实体类对象while(resultSet.next()){//使用反射实例化对象Object obj = clazz.getDeclaredConstructor().newInstance();for(int i=1;i<=columnCount;i++){String columnName = metaData.getColumnLabel(i);Object value = resultSet.getObject(columnName);//处理datetime类型字段和java.util.Data转换问题if(value.getClass().equals(LocalDateTime.class)){value = Timestamp.valueOf((LocalDateTime) value);}Field field=clazz.getDeclaredField(columnName);field.setAccessible(true);field.set(obj,value);}list.add((T)obj);}} catch (Exception e){e.printStackTrace();}finally {if(null != resultSet){try{resultSet.close();}catch(SQLException e){e.printStackTrace();}}if(null != preparedStatement){try{preparedStatement.close();}catch(SQLException e){e.printStackTrace();}}JDBCUtil.releaseConnection();}return list;}// 通用的增删改方法public int baseUpdate(String sql,Object ... args){//获取连接Connection connection = JDBCUtil.getConnection();PreparedStatement preparedStatement = null;int rows =0;try {// 准备语句对象preparedStatement=connection.prepareStatement(sql);//设置语句上的参数for(int i=0;i<args.length;i++){preparedStatement.setObject(i+1,args[i]);}//执行 增删改executeUpdaterows = preparedStatement.executeUpdate();// 释放资源(可选)}catch(SQLException e){e.printStackTrace();}finally{if(null != preparedstatement){try{preparedStatement.close();}catch(SQLException e){throw new RuntimeException(e);}}JDBCUtil.releaseConnection();}return rows;}
}

(2).dao层所有接口:

package com.atguigu.schedule.dao;
public interface SysUserDao {
}
package com.atguigu.schedule.dao;
public interface SysScheduleDao{
}

(3).dao层所有实现类:

package com.atguigu.schedule.dao.impl;
importcom.atguigu.schedule.dao.BaseDao;
import com.atguigu.schedule.dao.SysUserDao;
public class SysUserDaoImpl extends BaseDao implements SysUserDao {
}
package com.atguigu.schedule.dao.impl;
import com.atguigu.schedule.dao.BaseDao;
import com.atguigu.schedule.dao.SysScheduleDao;
public class SysScheduleDaoImpl extends BaseDao implements SysScheduleDao{
}

4.service包处理

(1)接口:

package com.atguigu.schedule.service;
public interface SysUserService{
}
package com.atguigu.schedule.service;
public interface SysScheduleService{
}

(2)实现类:

package com.atguigu.schedule.service.impl;
import com.atguigu.schedule.service.SysUserService;
public class SysUserServiceImpl implements SysUserService{
}
package com.atguigu.schedule.service.impl;
import com.atguigu.schedule.service.SysScheduleService;
public class SysScheduleServiceImpl implements SysScheduleService{
}

5.controller包处理:

(1)BaseController:

package com.atguigu.schedule.controller;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
public class BaseController extends HttpServlet {@Overrideprotected void service(HttpServletRequest reg, HttpServletResponse resp) throws ServletException,IOException{String requestURI =reg.getRequestURI();String [] split = requestURI.split("/");String methodName = split[split.length-1];Class clazz = this.getClass();try{Method method = clazz.getDeclaredMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);method.setAccessible(true);method.invoke(this,req,resp);}catch(Exception e){e.printStackTrace();}}
}

(2)多个处理器继承BaseController:

package com.atguigu.schedule.controller;
import jakarta.servlet.annotation.WebServlet;
@WebServlet("/user/*")
public class UserController extends BaseController{
}
package com.atguigu.schedule.controller;
import jakarta.servlet.annotation.WebServlet;
@WebServlet("/schedule/*")
public class SysScheduleControllerextends BaseController{

6.加密工具类的使用:

package com.atguigu.schedule.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public final class MD5Util {public static String encrypt(String strSrc){try{char hexChars[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};byte[]bytes = strSrc.getBytes();MessageDigest md = MessageDigest.getInstance("MD5");md.update(bytes);bytes = md.digest();int j= bytes.length;char[] chars = new char[j * 2];int k = 0;for(int i=0;i<bytes.length;i++){byte b= bytes[i];chars[k++]= hexChars[b >>> 4 & 0xf];chars[k++]= hexChars[b & 0xf];}return new String(chars);} catch (NoSuchAlgorithmException e){e.printStackTrace();throw new RuntimeException("MD5加密出错!!!");}}
}

7.注册业务的处理:

(1)controller:

package com.atguigu.schedule.controller;
import com.atguigu.schedule.pojo.SysUser;
import com.atguigu.schedule.service.SysUserService;
import com.atguigu.schedule.service.impl.SysUserServiceImpl;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import iava.io.IOException;
@WebServlet("/user/*")
public class SysUserController extends BaseContoller{private SysUserService userService = new SysUserServiceImpl();protected void regist(HttpServletRequest reg, HttpServletResponse resp) throws ServletException,IOException{//1 接收客户端提交的参数String username = reg.getParameter("username");String userPwd = reg.getParameter("userPwd");//2 调用服务层方法,完成注册功能//将参数放入一个SysUser对象中,在调用regist方法时传入SysUser sysUser = new SysUser(null,username,userPwd);int rows = userService.regist(sysUser);//3 根据注册结果(成功 失败)做页面跳转if(rows>0){resp.sendRedirect("/registSuccess.html");}else{resp.sendRedirect("/registFail.html");}}
}    }

(2)service: 

package com.atguigu.schedule.service;
import com.atguigu.schedule.pojo.SysUser;
public interface SysUserService {int regist(SysUserregistUser);
}
package com.atguigu.schedule.service.impl;
import com.atguigu.schedule.dao.SysUserDao ;
import com.atguigu.schedule.dao.impl.SysUserDaoImpl;
import com.atguigu.schedule.pojo.SysUser;
import com.atguigu.schedule.service.SysUserService;
import com.atguigu.schedule.util.MD5Util;
public class SysUserServiceImpl implements SysUserService{private SysUserDaouserDao = new SysUserDaoImpl();@Overridepublic int regist(SysUser sysUser){//将用户的明文密码转换为斋文码sysUser.setUserPwd(MD5Util.encrypt(sysUser.getUserPwd()));//调用DAO层的方法将sysUser信息存入数据库return userDao.addSysUser(sysUser);}
}

(3)DAO:

package com.atguigu.schedule.dao;
import com.atguigu.schedule.pojo.SysUser;
public interface SysUserDao {int addSysUser(SysUser sysUser);
}
package com.atguigu.schedule.dao.impl;
import com.atguigu.schedule.dao.BaseDao;
import com.atguigu.schedule.dao.SysUserDao;
import com.atguigu.schedule.pojo.SysUser;
public class SysUserDaoImpl extends BaseDao implements SysUserDao {@Overridepublic int addSysUser(SysUser sysUser){String sql ="insert into sys_user values(DEFAULT,?,?)";return baseUpdate(sql,sysUser.getUsername(),sysUser.getUserPwd());}
}

8.登录业务处理

(1)controller

package com.atguigu.schedule.controller;
import com.atquigu.schedule.pojo.SysUser;
import com.atguigu.schedule.service.SysUserService;
import com.atguigu.schedule.service.impl.SysUserServiceImpl;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import iakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/user/*")
public class SysUserController extends BaseContoller {private SysUserService userService =new SysUserServiceImpl();protected void login(HttpServletRequest reg, HttpServletResponse resp) throws ServletException,IOException{//1.接收用户名和密码String username = req.getParameter("username");String userPwd = reg.getParameter("userPwd");//2.调用服务层方法,根据用户名查询用户信息SysUser loginUser = userService.findByUsername(username);if(null == loginuser){//跳转到用户名有误提示页resp.sendRedirect("/loginusernameError.html");}else if(!M5Util.encrypt(userPwd).equals(loginuser.getUserPwd())){//3 判断密码是否匹配//跳转到密码有误提示页resp.sendRedirect("/loginUserPwdError.html");}else{//4 跳转到首页resp.sendRedirect("/showSchedule.html");}}
}

(2)service

package com.atguigu.schedule.service;
import com.atguigu.schedule.pojo.SysUser;
public interface SysUserservice {SysUser findByUsername(String username);
}
package com.atquigu.schedule.service.impl;
import com.atguigu.schedule.dao.SysUserDao;
import com.atguigu.schedule.dao.impl.SysUserDaoImpl;
import com.atguigu.schedule.pojo.SysUser;
import com.atguigu.schedule.service.SysUserService;
import com.atguigu.schedule.util.MD5Util;
public class SysUserServiceImpl implements SysUserService{private SysUserDao userDao = new SysUserDaoImpl();@Overridepublic SysUser findByUsername(String username){// 调用服务层方法,继续查询return userDao.findByUsername(username):}
}

(3)dao

package com.atguigu.schedule.dao;
import com.atguigu.schedule.pojo.SysUser;
public interface SysUserDao {SysUser findByUsername(String username);
}
package com.atguigu.schedule.dao.impl;
import com.atguigu.schedule.dao.BaseDao;
import com.atguigu.schedule.dao.SysUserDao;
import com.atguigu.schedule.pojo.SysUser;
import java.util.List;
public class SysUserDaoImpl extends BaseDao implements SysUserDao{@Overridepublic SysUser findByUsername(String username){String sql ="select uid,username, user_pwd userPwd from sys_user where username = ?";List<SysUser> userList = baseQuery(SysUser.class, sql, username);return null != userList&& userlist.size()>8? userList.get(0):null;}
{

相关文章:

JavaWeb——MVC架构模式

一、概述: MVC(Model View Controller)是软件工程中的一种 软件架构模式 &#xff0c;它把软件系统分为模型、视图和控制器三个基本部分。用一种业务逻辑、数据、界面显示分离的方法组织代码&#xff0c;将业务逻辑聚集到一个部件里面&#xff0c;在改进和个性化定制界面及用户…...

Excel求和方法之

一 SUM&#xff08;&#xff09;&#xff0c;选择要相加的数,回车即可 二 上面的方法还不够快。用下面这个 就成功了 三 还有一种一样快的 选中之后&#xff0c;按下Alt键和键&#xff08;即Alt&#xff09;...

Windows Server 域控制服务器安装及相关使用

目录 1.将客户机加入域 2.安装域控制器 3.新建域用户 4.设置用户登录时间&#xff0c;账户过期时间 5.软件分发 ​编辑 6.换壁纸 7.OU与GPO的概念 域为集中控制&#xff0c;拿下域控是拿下目标的关键 以Windows Server 2022为例 1.将客户机加入域 前提&#xff1a;客…...

linux基础命令(超级详细)

Linux 系统提供了丰富的命令行工具&#xff0c;用于各种文件操作、系统管理和网络配置等任务。以下是一些常用的 Linux 基础命令&#xff1a; 一、 文件和目录操作 1. ls: 列出目录内容 ls 列出当前目录的文件和目录 ls -l 以长格式列出文件和目录&#xff0c;包…...

大模型笔记之-XTuner微调个人小助手认知

前言 使用XTuner 微调个人小助手认知 一、下载模型 #安装魔搭依赖包 pip install modelscope新建download.py内容如下 其中Shanghai_AI_Laboratory/internlm2-chat-1_8b是魔搭对应的模型ID cache_dir/home/aistudio/data/model’为指定下载到本地的目录 from modelscope im…...

用TensorFlow实现线性回归

说明 本文采用TensorFlow框架进行讲解&#xff0c;虽然之前的文章都采用mxnet&#xff0c;但是我发现tensorflow提供了免费的gpu可供使用&#xff0c;所以果断开始改为tensorflow&#xff0c;若要实现文章代码&#xff0c;可以使用colaboratory进行运行&#xff0c;当然&#…...

IT计算机软件系统类毕业论文结构指南:从标题到结论的全景视角

一、背景 在快速发展的IT和人工智能领域&#xff0c;毕业论文不仅是学术研究的重要成果&#xff0c;也展示了学生掌握新技术和应用的能力。随着大数据和智能系统的复杂性增加&#xff0c;毕业设计&#xff08;毕设&#xff09;的论文章节安排变得尤为关键。一个结构清晰、内容详…...

leetcode27:移除元素(正解)

移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k&#xff0c;要通过此题&#xff0c;您需要执行以下操作&#xf…...

docker部署nginx--(部署静态文件和服务)

文档参考 1、http://testingpai.com/article/1649671014266 2、下载nginx docker pull nginx:alpine 然后启动nginx&#xff0c; docker run --rm -it -p 9192:80 nginx:alpine /bin/sh 关闭容器后&#xff0c;自动删除该容器 进入后&#xff0c;启动nginx, nginx进行curl h…...

websocket的介绍及springBoot集成示例

目录 一、什么是Websocket 二、Websocket特点 三、WebSocket与HTTP的区别 四、常见应用场景 五、SpringBoot集成WebSocket 1. 原生注解 2. Spring封装 一、什么是Websocket WebSocket 是一种在单个 TCP 连接上进行 全双工 通信的协议&#xff0c;它可以让客户端和服务器…...

软件测试-自动化测试

自动化测试 测试人员编写自动化测试脚本&#xff0c;维护并解决自动化脚本问题 自动化的主要目的就是用来进行回归测试 回归测试 常见面试题 ⾃动化测试能够取代人工测试吗&#xff1f; ⾃动化测试不⼀定⽐人工测试更能保障系统的可靠性&#xff0c;⾃动化测试是测试⼈员手…...

Linux 安装TELEPORT堡垒机

一、查看官方文档 堡垒机官网地址&#xff1a;走向成功 - Teleport&#xff0c;高效易用的堡垒机 &#xff08;一&#xff09;官网资源链接 -》Teleport 在线文档 &#xff08;二&#xff09;手动下载安装包 二、压缩包下载和安装 &#xff08;一&#xff09;加压下载的安装…...

【14】即时编译器的中间表达形式

中间表达形式&#xff08;IR&#xff09; 编译器一般被分为前端和后端。 前端会对输入的程序进行词法分析、语法分析和语义分析&#xff0c;然后生成中间表达形式&#xff08;IR&#xff09;&#xff1b;后端对IR进行优化&#xff0c;生成目标代码 不考虑解释执行的话&#xf…...

Mysql(三)---增删查改(基础)

文章目录 前言1.补充1.修改表名1.2.修改列名1.3.修改列类型1.4.增加新列1.5.删除指定列 2.CRUD3.新增(Create)3.1.单行插入3.2.指定列插入3.3.多行插入 4.数据库的约束4.1.约束的分类4.2.NULL约束4.3.Unique约束4.4.Default 默认值约束4.5.PRIMARY KEY&#xff1a;主键约束4.6.…...

Dialog实现原理分析

在 Android 中&#xff0c;对话框&#xff08;Dialog&#xff09;是一种非常常见的用户界面组件&#xff0c;用于向用户提供额外的信息或者请求用户的确认。Android 提供了几种不同类型的对话框&#xff0c;例如简单的消息对话框 (AlertDialog)、进度条对话框 (ProgressDialog)…...

21.1 基于Netty实现聊天

21.1 基于Netty实现聊天 一. 章节概述二. `Netty`介绍三. 阻塞与非阻塞1. 阻塞与非阻塞简介2. BIO同步阻塞3. NIO同步非阻塞4. AIO异步非阻塞IO5. 异步阻塞IO(用的极少)6. 总结四. Netty三种线程模型1. 单线程模型2. 多线程模型3. 主从线程模型五. 构建Netty服务器************…...

尼卡音乐 v1.0.5 — 全新推出的免费音乐听歌软件

尼卡音乐是一款全新推出的免费音乐听歌软件&#xff0c;无需注册登录&#xff0c;打开即拥有全部功能。聚合了六大音源曲库、歌单、排行榜&#xff0c;支持在线试听、无损下载以及高清MV播放。资源全、无广告、更新快&#xff0c;适合寻找高品质音乐体验的用户。 拿走的麻烦评…...

Scratch深潜:解锁递归与分治算法的编程之门

亮眼标题&#xff1a;“Scratch深潜&#xff1a;解锁递归与分治算法的编程之门” 在编程的世界里&#xff0c;递归和分治算法是解决问题的强大工具。Scratch&#xff0c;这款广受儿童和初学者欢迎的图形化编程语言&#xff0c;以其独特的拖拽式编程块&#xff0c;激发了无数年…...

【1.0】vue3的创建

【1.0】vue3的创建 【一】vue3介绍 vue2的所有东西&#xff0c;vue3都兼容 vue3中写js代码由两种&#xff0c;组合式和配置项 配置项api&#xff0c;就是vue2的写法&#xff0c;将数据放进data&#xff0c;方法放进methods等 export default{data(){return {}},methods:…...

刷刷前端手写题

闭包用途 闭包 闭包让你可以在一个内层函数中访问到其外层函数的作用域 防抖 描述 前面所有触发都被取消&#xff0c;最后一次执行&#xff0c;在规定时间之后才会触发&#xff0c;也就是说如果连续快速的触发&#xff0c;用户操作频繁&#xff0c;但只会执行一次 。 常用场…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...