SSM项目搭建保姆级教程
文章目录
- 1、什么是SSM框架
- 1.1、持久层
- 1.2、业务层
- 1.3、表现层
- 1.4、View层
- 1.5、SpringMVC执行流程
- 1.6、MyBatis
- 2、SSM实战搭建
- 2.1、创建工程
- 2.2、添加依赖
- 2.3、配置spring.xml文件
- 2.4、配置web.xml文件
- 2.5、log4j.properties
- 2.6、准备表
- 2.7、实体类
- 2.8、mapper
- 2.9、service
- 2.10、controller
- 2.11、前端页面
- 1、index.html
- 2、addUser.jsp
- 3、queryUser.jsp
- 4、success.jsp和fail.jsp
- 2.12、项目结构
- 2.13、部署
- 1、tomcat准备
- 2、IDEA配置Tomcat
- 3、运行
- 4、Tomcat乱码问题
1、什么是SSM框架
- SSM框架是Spring、Spring MVC 和MyBatis框架的整合,是标准的MVC模式
- 标准的SSM框架有四层,分别是dao层(mapper),service层,controller层和View层
- 使用spring实现业务对象管理,使用spring MVC负责请求的转发和视图管理,mybatis作为数据对象的持久化引擎
1.1、持久层
持久层,也就是我们常说的dao层或者mapper层
作用:主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此
- Dao层首先设计的是接口,然后再Spring的配置文件中定义接口的实现类
- 然后可以在模块中进行接口的调用来进行数据业务的处理(不在关心接口的实现类是哪个类)
- 数据源的配置以及有关数据库连接的参数都在Spring的配置文件中进行配置
1.2、业务层
业务层,也就是我们常说的service层
作用:Service层主要负责业务模块的逻辑应用设计
- 先设计接口然后再设计实类,然后再在Spring的配置文件中配置其实现的关联
- 业务逻辑层的实现具体要调用到自己已经定义好的Dao的接口上,这样就可以在应用中调用Service接口来进行业务处理
- 建立好Dao之后再建立service层,service层又要在controller层之下,因为既要调用Dao层的接口又要提供接口给controller层,每个模型都有一个service接口,每个接口分别封装各自的业务处理的方法
1.3、表现层
表现层,也就是我们常说的Controller层
作用:负责具体的业务模块流程的控制
- 配置也同样是在Spring的配置文件里面进行
- 调用Service层提供的接口来控制业务流程
- 业务流程的不同会有不同的控制器,在具体的开发中可以将我们的流程进行抽象的归纳,设计出可以重复利用的子单元流程模块
1.4、View层
作用:主要和控制层紧密结合,主要负责前台jsp页面的表示
各层之间的关系:

1.5、SpringMVC执行流程
复杂版:
1、 用户发送请求至前端控制器DispatcherServlet
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器
3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
4、 DispatcherServlet调用HandlerAdapter处理器适配器
5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)
6、 Controller执行完成返回ModelAndView
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、 ViewReslover解析后返回具体View
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
11、 DispatcherServlet响应用户
简单版:
1.客户端发送请求到DispacherServlet(分发器)
2.由DispacherServlet控制器查询HanderMapping,找到处理请求的Controller
3.Controller调用业务逻辑处理后,返回ModelAndView
4.DispacherSerclet查询视图解析器,找到ModelAndView指定的视图
5.视图负责将结果显示到客户端
1.6、MyBatis
- MyBatis是对jdbc的封装,它让数据库底层操作变的透明
- MyBatis的操作都是围绕一个SqlSessionFactory实例展开的
- MyBatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射
- 在每次与数据库交互时,通过SqlSessionFactory拿到一个SqlSession,再执行sql命令
- 所以,MyBatis的核心是SqlSession
2、SSM实战搭建
搭建思路如下:

2.1、创建工程



新建完成后工程目录结构如下:

然后替换web.xml中的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<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_4_0.xsd"version="4.0">
</web-app>
2.2、添加依赖
在pom.xml中添加依赖,如下:
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.itsource</groupId><artifactId>SSMTest</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><name>SSMTest Maven Webapp</name><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencies><!--spring-webmvc--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.15.RELEASE</version></dependency><!--mybatis依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency><!--mybatis和spring整合的依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.6</version></dependency><!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!--druid连接池依赖--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.1</version></dependency><!--lombok依赖--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency><!--jackson java对象转换为json对象 @ResponseBody--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.2.2</version></dependency><!--servlet-api依赖--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.15.RELEASE</version></dependency><!--sql日志--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.30</version></dependency></dependencies></project>
2.3、配置spring.xml文件
在main目录下,新建java和resources目录,如下:(如果有就不需要新建了)

然后在resources目录下新建spring.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--包扫描--><context:component-scan base-package="cn.itsource" /><!-- 声明视图解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/" /><property name="suffix" value=".jsp" /></bean><!--静态资源放行--><mvc:default-servlet-handler /><!-- 声明springmvc注解驱动 --><mvc:annotation-driven /><!--数据源配置--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/ssmtest?serverTimezone=Asia/Shanghai"/><property name="username" value="root"/><property name="password" value="123456"/><!--初始化连接数量:根据你项目的并发进行评估--><!--最少连接池的个数--><property name="minIdle" value="5"/><!--初始的连接池的个数--><property name="initialSize" value="5"/><!--最大的连接个数--><property name="maxActive" value="10"/><!--超过的最大连接池个数,等待时间 单位是毫秒--><property name="maxWait" value="3000"/></bean><bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!--设置数据源--><property name="dataSource" ref="dataSource" /><!--设置mybatis映射文件的路径--><property name="mapperLocations" value="classpath:mapper/*.xml" /></bean><!--为dao接口生成代理实现类--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="cn.itsource.dao" /></bean></beans>
2.4、配置web.xml文件
web.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<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_4_0.xsd"version="4.0"><!--servlet--><servlet><servlet-name>spring</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>spring</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!-- 声明字符集过滤器 --><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param><init-param><param-name>forceRequestEncoding</param-name><param-value>true</param-value></init-param><init-param><param-name>forceResponseEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
</web-app>
2.5、log4j.properties
在resources目录下新建log4j.properties文件,内容如下:
log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
2.6、准备表
在本地MySQL服务器中新建数据库【ssmtest】,然后新建表【t_user】,建表语句如下:
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',`username` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',`sex` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别',`age` int(3) NULL DEFAULT NULL COMMENT '年龄',`intro` varchar(12) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '个人简介',PRIMARY KEY (`id`) USING BTREE,INDEX `idx_user_username`(`username`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户信息表' ROW_FORMAT = DYNAMIC;
2.7、实体类
package cn.itsource.entity;import lombok.Data;/*** <p>用户信息表对应实体类</p>** @author 波波老师(微信 : javabobo0513)*/
@Data
public class User {private Long id;private String username;private String sex;private Integer age;private String intro;
}
2.8、mapper
在dao包下新建UserMapper类,代码:
package cn.itsource.dao;import cn.itsource.entity.User;
import java.util.List;/*** <p>UserMapper</p>** @author 波波老师(微信 : javabobo0513)*/
public interface UserMapper {//保存用户信息到数据库int saveUser(User user);//查询数据库中所有用户信息List<User> selectAllUser();
}
在resources下的mapper文件夹中新建UserMapper.xml文件,代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.itsource.dao.UserMapper"><!-- 使用 insert、update、delete、select 标签编写sql语句 --><!--保存用户信息到数据库--><insert id="saveUser">insert into t_user(username, sex, age, intro) values (#{username}, #{sex}, #{age}, #{intro})</insert><!--查询所有用户信息--><select id="selectAllUser" resultType="cn.itsource.entity.User">select id, username, sex, age, intro from t_user order by id desc</select>
</mapper>
2.9、service
在service包下新建UserService类:代码如下:
package cn.itsource.service;import cn.itsource.entity.User;
import java.util.List;/*** <p>UserService</p>** @author 波波老师(微信 : javabobo0513)*/
public interface UserService {//保存用户信息到数据库int saveUser(User user);//查询数据库中所有用户信息List<User> selectAllUser();
}
然后在service包下新建impl包,其下新建UserServiceImpl类,代码如下:
package cn.itsource.service.impl;import cn.itsource.dao.UserMapper;
import cn.itsource.entity.User;
import cn.itsource.service.UserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;/*** <p>UserServiceImpl</p>** @author 波波老师(微信 : javabobo0513)*/
@Service
public class UserServiceImpl implements UserService {//注入 UserMapper 对象@Resourceprivate UserMapper userMapper;@Overridepublic int saveUser(User user) {return userMapper.saveUser(user);}@Overridepublic List<User> selectAllUser() {return userMapper.selectAllUser();}
}
2.10、controller
在controller包下新建UserController类,代码如下:
package cn.itsource.controller;import cn.itsource.entity.User;
import cn.itsource.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import java.util.List;/*** <p>UserController</p>** @author 波波老师(微信 : javabobo0513)*/
@RestController
@RequestMapping("/user")
public class UserController {@Resourceprivate UserService userService;/*** 新增用户* @param user* @return*/@PostMapping("/saveUser")public ModelAndView saveUser(User user){ModelAndView mv = new ModelAndView();int saveCount = userService.saveUser(user);if(saveCount > 0){mv.addObject("msg", "新增用户成功");mv.setViewName("success");}else{mv.addObject("msg", "新增用户失败");mv.setViewName("fail");}return mv;}/*** 查询所有用户信息* @param user* @return*/@GetMapping("/selectAllUser")public List<User> selectAllUser(User user){List<User> userList = userService.selectAllUser();return userList;}
}
2.11、前端页面
1、index.html
首先改造webapp目录下的index.html文件,内容如下:
<%@ page contentType="text/html;charset=utf-8" language="java" %>
<%String basePath=request.getScheme() + "://" + request.getServerName()+ ":" + request.getServerPort() + request.getContextPath() + "/";
%>
<html>
<head><base href="<%=basePath%>"><title>SSM实战案例</title>
</head>
<body>
<div align="center"><p>SSM整合小案例</p><table><tr><td><a href="addUser.jsp">注册用户</a></td><td><br/></td><td><a href="queryUser.jsp">查询用户</a></td></tr></table>
</div>
</body>
</html>
效果如下:

2、addUser.jsp
在webapp目录下新建文件addUser.jsp,用来新增用户,代码如下:
<%@ page contentType="text/html;charset=utf-8" language="java"%>
<html>
<head><title>注册用户</title>
</head>
<body>
<div align="center"><p>注册用户</p><form action="user/saveUser" method="post"><table><tr><td>姓名:</td><td><input type="text" name="username"></td></tr><tr><td>年龄:</td><td><input type="text" name="age"></td></tr><tr><td>性别:</td><td><input type="text" name="sex"></td></tr><tr><td>简介:</td><td><input type="text" name="intro"></td></tr><tr><td></td><td><input type="submit" value="注册"></td></tr></table></form>
</div>
</body>
</html>
效果如下:

3、queryUser.jsp
在webapp目录下新建文件queryUser.jsp,用来查询所有用户,代码如下:
<%@ page contentType="text/html;charset=utf-8" language="java" %>
<%String basePath=request.getScheme() + "://" + request.getServerName()+ ":" + request.getServerPort() + request.getContextPath() + "/";
%>
<html>
<head><base href="<%=basePath%>"><title>查询学生</title><%--<script type="text/javascript" src="js/jquery-3.6.0.js"></script>--%><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script><script type="text/javascript">$(function () {$("#myBtn").on("click",function () {$.ajax({url: "user/selectAllUser",dataType: "json",success: function (resp) {$("#userInfo").empty();$.each(resp, function (i,n) {$("#userInfo").append("<tr><td>" + n.id + "</td>" +"<td>" + n.username + "</td>" +"<td>" + n.age + "</td>" +"<td>" + n.sex + "</td>" +"<td>" + n.intro + "</td></tr>");})}})})})</script><style>.tdStyle{width: 100px;}</style>
</head>
<body>
<div align="center"><p>用户列表 <button id="myBtn">获取用户信息</button></p><table><thead><tr><td class='tdStyle'>id</td><td class='tdStyle'>姓名</td><td class='tdStyle'>年龄</td><td class='tdStyle'>性别</td><td class='tdStyle'>简介</td></tr></thead><tbody id="userInfo"></tbody></table>
</div>
</body>
</html>
效果如下:

4、success.jsp和fail.jsp
在webapp - WEB-INF目录下新建success.jsp和fail.jsp文件,内容分别如下:
success.jsp:
<%@ page contentType="text/html;charset=utf-8" language="java" %>
<html>
<head><title>success</title>
</head>
<body>
<h3>结果:${msg}</h3>
</body>
</html>
效果:

fail.jsp:
<%@ page contentType="text/html;charset=utf-8" language="java" %>
<html>
<head><title>fail</title>
</head>
<body>
<h3>结果:${msg}</h3>
</body>
</html>
2.12、项目结构
目前项目结构如下:

2.13、部署
1、tomcat准备
本地部署到tomcat,首先需要你本地有tomcat服务器,下载地址:
链接:https://pan.baidu.com/s/1VpRboSME8R64yhXE4MwxiA
提取码:nr43
下载下来后,直接解压即可,如下:

我这里使用的tomcat版本是:8.5.75
2、IDEA配置Tomcat
按照下面步骤一步一步做就可以在IDEA中配置好tomcat了







然后开始部署:



然后:

就成这样了:

3、运行


启动成功后,会自动打开页面,如下:

到此,我们的SSM项目就部署完毕,可以正常使用了
4、Tomcat乱码问题
上面我们可以看到,Tomcat启动后,控制台打印的日志出现了乱码,按照下面方式做即可
打开tomcat安装目录下conf下的logging.properties文件:

将该配置文件中的UTF-8全部改成GBK
然后再重启一下Tomcat,就会发现已经没有乱码了:

如果按照上面设置后还没有好的话,就继续设置:
查看下IDEA的字集是不是UTF-8,确认一下,不是的话,改成UTF-8:

打开IDEA的安装目录下的bin目录,打开里面的idea64.exe.vmoptions文件:

添加内容:
-Dfile.encoding=UTF-8
-Dconsole.encoding=UTF-8
相关文章:
SSM项目搭建保姆级教程
文章目录1、什么是SSM框架1.1、持久层1.2、业务层1.3、表现层1.4、View层1.5、SpringMVC执行流程1.6、MyBatis2、SSM实战搭建2.1、创建工程2.2、添加依赖2.3、配置spring.xml文件2.4、配置web.xml文件2.5、log4j.properties2.6、准备表2.7、实体类2.8、mapper2.9、service2.10、…...
LeetCode 350. 两个数组的交集 II
原题链接 难度:easy\color{Green}{easy}easy 题目描述 给你两个整数数组 nums1nums1nums1 和 nums2nums2nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现…...
Python可以解码吗,解码打码是如何实现的
前言 咳咳,进来的铁汁都是抱着学习的心态进来看的吧,咱今天不讲解解码,咱来说说python如何来实现打码功能~ 这一个个进来的 都是标题党吧哈哈哈 有兴趣的可以继续看看哦 最近重温了一档综艺节目 至于叫什么 这里就不细说了 老是看着看着就…...
Jackson 序列化:Cannot deserialize value of type `java.time.LocalDateTime`
问题描述 使用 jackson 反序列化异常如下: Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type java.time.LocalDateTime from String “2023-02-13 19:43:01”: Failed to deserialize java.time.LocalDat…...
机试_3_数据结构(一)_习题
数据结构(一)——练习题 学习完第三章-数据结构(一)之后,当然要做相应地练习啦~ 注:上述习题都可以在牛客进行测试。 例如,第2题链接:计算表达式_牛客题霸_牛客网 (nowcoder.com)…...
《Hadoop篇》------HDFS与MapReduce
目录 一、HDFS角色职责总结 二、CheckPoint机制 三、Mapreduce序列化 四、Mapper 4.1、官方介绍 4.2、Split计算 4.3、Split和block对应关系 4.4、启发式算法 五、MapTask整体的流程 六、压缩算法 6.1、压缩算法适用场景 6.2、压缩算法选择 6.2.1、Gzip压缩 6.2…...
网络爬虫简介
前言 没什么可以讲的所以就介绍爬虫吧 介绍 网络爬虫(英语:web crawler),也叫网路蜘蛛(spider),是一种用来自动浏览万维网的网络机器人。其目的一般为编纂网络索引。 网路搜索引擎等站点通过…...
通过4个月的自动化学习,现在我也拿到了25K的offer
毕业后的5年,是拉开职场差距的关键时期。有人通过这5年的努力,实现了大厂高薪,有人在这5年里得到贵人的赏识,实现了职级的快速拔升,还有人在这5年里逐渐掉队,成了职场里隐身一族,归于静默。 而…...
分库分表了解
数据切分根据其切分类型,可以分为两种方式:垂直(纵向)切分和水平(横向)切分一:垂直(纵向)切分【基于表或字段划分,表结构不同】1:垂直分库根据业务…...
docker中 gitlab 安装、配置和初始化
小笔记:gitlab配置文件 /etc/gitlab/gitlab.rb 配置项jcLee95 的CSDN博客:https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/1…...
有哪些好用的C++Json库?
文章目录RapidJSONJSON for Modern CBoost.PropertyTreeJanssonPicoJSONC REST SDKnlohmann json(ky用的这个)jsoncpp(cw用的这个)RapidJSON RapidJSON是一个快速、高效的C JSON解析器和生成器,支持SAX和DOM两种解析模…...
Docker 快速上手学习入门教程
目录 1、docker 的基础概念 2、怎样打包和运行一个应用程序? 3、如何对 docker 中的应用程序进行修改? 4、如何对创建的镜像进行共享? 5、如何使用 volumes 名称对容器中的数据进行存储?// 数据挂载 6、另一种挂载方式&…...
深度学习笔记:误差反向传播(1)
1 计算图 计算图使用图(由节点和边构成的图)来表达算式。 如图,我们用节点代表运算符号,用边代表传入的参数,即可算出购买苹果和橘子的总价格。 2 计算图的局部计算 局部计算意味着每个节点只处理和其相关的运算&…...
锁相环(1)
PLL代表相位锁定环。顾名思义,如下图所示,PLL是一种具有反馈循环的电路,可将反馈信号的相/频率保持与参考输入信号的相/频率相同(锁定)。 如下图所示,如果参考输入和反馈输入之间存在相位差,则…...
2023金三银四跳槽必会Java核心知识点笔记整理
现在互联网大环境不好,互联网公司纷纷裁员并缩减 HC,更多程序员去竞争更少的就业岗位,整的 IT 行业越来越卷。身为 Java 程序员的我们就更不用说了,上班 8 小时需要做好本职工作,下班后还要不断提升技能、技术栈&#…...
二十四节气—雨水,好雨知时节,当春乃发生。
雨水,是二十四节气之第2个节气。 雨水节气不仅表明降雨的开始及雨量增多,而且表示气温的升高,意味着进入气象意义的春天。 雨水节是一个非常富有想象力和人情味的节气,在这一天,不管下不下雨都充满着一种雨意蒙蒙的诗…...
为什么要使用数据库?
随着互联网技术的高速发展,预计2020 年底全世界网民的数量将达到 50 亿。网民数量的增加带动了网上购物、微博,网络视频等产业的发展。那么,随之而来的就是庞大的网络数据量。 大量的数据正在不断产生,那么如何安全有效地存储、检…...
【原创】java+swing+mysql图书管理系统设计与实现
图书管理系统是一个比较常见的系统,今天我们主要介绍如何使用javaswiingmysql去开发一个cs架构的图书管理系统,方便学生进行图书借阅。 功能分析: 宿舍报修管理系统的使用角色,一般分为管理员和学生,管理员主要进行学…...
图论 —— 强连通分量
概念 连通图 无向图 G G G 中,若对任意两点 V i , V j V_i, V_j V<...
计算机网络(二):物理层和链路层,通道复用,MAC地址,CSMA/CD协议,PPP点对点协议
文章目录一、物理层主机之间的通信方式通道复用技术常见的宽带接入技术二、链路层MAC地址和IP地址分别有什么作用为什么有了MAC地址之后还需要IP地址为什么有了IP地址还需要MAC地址以太网中的CSMA/CD协议数据链路层上的三个基本问题PPP协议一、物理层 主机之间的通信方式 单工…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
