目录
MVC 设计模式一般指 MVC 框架,M(Model)指数据模型层,业务模型层,V(View)指视图层,C(Controller)指控制层。使用 MVC 的目的是将 M 和 V 的实现代码分离,使同一个程序可以有不同的表现形式。
MVC 属于架构模式的一种,所谓架构就是如何设计一个程序的结构。MVC 将程序结构划分为三层,每一层都对外提供了可供上层调用的接口,既能维系三层之间的联系,也能保持相对的独立性。
这种将业务逻辑、数据和界面分离的代码组织形式,降低了模块间的耦合度,有利于日后的维护与扩展。
springmvc是基于spring Framwork衍生出来的一个mvc框架,主要解决原有mvc架构中,控制器(Controller)的问题,常见的控制器有servlet,struts2等,控制器的核心功能是根据用户的请求调用对应业务功能,然后依据业务处理的结果,控制程序的运行流程。
servlet实现控制器存在的问题:
1.接收客户端请求参数时,存在代码的冗余
2.只能接收字符串类型的数据,其它数据类型需要手动的转换
3.无法接收对象类型的参数
4.调用业务对象存在耦合 (new)
5.流程跳转存在耦合(路径耦合,视图耦合)
1.传统的开发方式
通过作用域(request,session)实现数据的传递
通过视图技术进行视图的渲染(jsp thymleaf freeMarker)
2.前后端分离开发方式
多种新的访问方式(get 、post 、put、 delete)
Restful风格的访问
Spring MVC 框架是高度可配置的,包含多种视图技术,例如 JSP、FreeMarke和 POI。Spring MVC 框架并不关心使用的视图技术,也不会强迫开发者只使用 JSP。
Spring MVC 执行流程如图 所示:

SpringMVC 的执行流程如下:
用户点击某个请求路径,发起一个 HTTP request 请求,该请求会被提交到 DispatcherServlet(前端控制器);
由 DispatcherServlet 请求一个或多个 HandlerMapping(处理器映射器),并返回一个执行链(HandlerExecutionChain)。
DispatcherServlet 将执行链返回的 Handler 信息发送给 HandlerAdapter(处理器适配器);
HandlerAdapter 根据 Handler 信息找到并执行相应的 Handler(常称为 Controller);
Handler 执行完毕后会返回给 HandlerAdapter 一个 ModelAndView 对象(Spring MVC的底层对象,包括 Model 数据模型和 View 视图信息);
HandlerAdapter 接收到 ModelAndView 对象后,将其返回给 DispatcherServlet ;
DispatcherServlet 接收到 ModelAndView 对象后,会请求 ViewResolver(视图解析器)对视图进行解析;
ViewResolver 根据 View 信息匹配到相应的视图结果,并返回给 DispatcherServlet;
DispatcherServlet 接收到具体的 View 视图后,进行视图渲染,将 Model 中的模型数据填充到 View 视图中的 request 域,生成最终的 View(视图);
视图负责将结果显示到浏览器(客户端)
Spring MVC 涉及到的组件有 DispatcherServlet(前端控制器)、HandlerMapping(处理器映射器)、HandlerAdapter(处理器适配器)、Handler(处理器)、ViewResolver(视图解析器)和 View(视图)。下面对各个组件的功能说明如下。
1)DispatcherServlet
DispatcherServlet 是前端控制器,从图 1 可以看出,Spring MVC 的所有请求都要经过 DispatcherServlet 来统一分发。DispatcherServlet 相当于一个转发器或中央处理器,控制整个流程的执行,对各个组件进行统一调度,以降低组件之间的耦合性,有利于组件之间的拓展。
2)HandlerMapping
HandlerMapping 是处理器映射器,其作用是根据请求的 URL 路径,通过注解或者 XML 配置,寻找匹配的处理器(Handler)信息。
3)HandlerAdapter
HandlerAdapter 是处理器适配器,其作用是根据映射器找到的处理器(Handler)信息,按照特定规则执行相关的处理器(Handler)。
4)Handler
Handler 是处理器,和 Java Servlet 扮演的角色一致。其作用是执行相关的请求处理逻辑,并返回相应的数据和视图信息,将其封装至 ModelAndView 对象中。
5)View Resolver
View Resolver 是视图解析器,其作用是进行解析操作,通过 ModelAndView 对象中的 View 信息将逻辑视图名解析成真正的视图 View(如通过一个 JSP 路径返回一个真正的 JSP 页面)
6)View
View 是视图,其本身是一个接口,实现类支持不同的 View 类型(JSP、FreeMarker、Excel 等)。
以上组件中,需要开发人员进行开发的是处理器(Handler,常称Controller)和视图(View)。通俗的说,要开发处理该请求的具体代码逻辑,以及最终展示给用户的界面
搭建步骤如下:
创建 Web 应用并引入 JAR 包
spring-webmvc
Spring MVC 配置:在 web.xml 中配置 Servlet,创建 Spring MVC 的配置文件

springmvc配置文件

创建 Controller(处理请求的控制器)

创建 View(使用 JSP 作为视图)

部署运行
@RequestMapping详解
1.一个方法匹配多个路径

2.指定方法接收的请求方式





视图传参到控制器
1.基本数据类型绑定
形参的名字和传递参数的名字保持一致,参数需要全部传递否则报500错误,为了解决不传参报错,可以给基本类型的参数设置默认值

设置参数的别名

2.包装数据类型的传递
使用包装类型可以解决基本类型不传递值,出现500错误的问题但是还是要保持参数名字和形参保持一致,

3.字符串类型数据的绑定
参照包装类即可
4.数组类型

5.javaBean类型
参数名的字段和Javabean中的属性保持一致即可

返回数据到视图层

Spring MVC默认采用服务器内部转发的形式展示页面信息,同时也支持重定向页面
重定向(302状态码给浏览器)

响应json格式的数据

请求数据类型为JSON
/**
* 接收json格式的参数
* @param user
* @return
*/
@RequestMapping("/login4")
@ResponseBody
public Object login4(@RequestBody User user) {
System.out.println(user);
return user;
}
}
前台ajax请求
<script type="text/javascript">
$(function () {
$("#jsbutton").click(function () {
$.ajax({
url:'/login3',
type:'post',
data:{
username:"lisi",
age:20,
height:170,
birth:new Date()
},
dataType:'json',
success:function (result) {
console.log(result);
},
error:function () {
console.log("请求失败!")
}
})
})
$("#jsbutton2").click(function () {
var user = {
username:"lisi",
age:20,
height:170,
birth:'1999-9-9'
}
$.ajax({
url:'/login4',
type:'post',
data:JSON.stringify(user),
contentType:'application/json;charset=utf-8',
dataType:'json',
success:function (result) {
console.log(result);
},
error:function () {
console.log("请求失败!")
}
})
})
})
</script>
RestFul风格
一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制
URL定义
资源:互联网所有的事物都可以被抽象为资源 资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。 分别对应 添加、 删除、修改、查询
传统方式操作资源
http://127.0.0.1/item/queryUser.action?id=1 查询,GET http://127.0.0.1/item/saveUser.action 新增,POST http://127.0.0.1/item/updateUser.action 更新,POST http://127.0.0.1/item/deleteUser.action?id=1 删除,GET或POST
RestFul请求方式 可以通过 GET、 POST、 PUT、 PATCH、 DELETE 等方式对服务端的资源进行操作。其中:
1.实现Handlerlnterceptor接口
GET 用于查询资源,
POST 用于创建资源,
PUT 用于更新服务端的资源的全部信息,
DELETE 用于删除服务端的资源。
public class RestController {
@GetMapping("/rest")
public void test01(){
System.out.println("test01: ");
}
@PostMapping("/rest")
public void test02(){
System.out.println("test02: ");
}
@DeleteMapping("/rest")
public void test03(){
System.out.println("test03:");
}
@PutMapping("/rest")
public void test04(){
System.out.println("test04: ");
}
@PatchMapping("/rest")
public void test05(){
System.out.println("test05: ");
}
} 表单发送PUT请求设置方式 
设置web.xml
REST风格传参问题
数据提交中文乱码的处理
1.配置静态资源的路径

2.配置使用tomcat的servlet处理器
@Controller
@SessionAttributes({"model1","model2"})
public class SessionController {
@RequestMapping("/s1")
public void test01(HttpSession session){
session.setAttribute("msg", "session attribute");
}
@RequestMapping("/s2")
public void test02(HttpSession session){
System.out.println(session.getAttribute("msg"));
}
/**
* 将model放入session作用域
* @param model
*/
@RequestMapping("/s3")
public void test03(Model model){
model.addAttribute("model1", "model1 attribute");
}
/**
* 获取通过注解设置的session域中的值
* @param session
*/
@RequestMapping("/s5")
public void test05(HttpSession session){
System.out.println("msg: "+session.getAttribute("msg"));
System.out.println("model1 :"+session.getAttribute("model1"));
System.out.println("model2 :"+session.getAttribute("model2"));
}
/**
* 通过注解获取session域中的值
* @param
*/
@RequestMapping("/s6")
public void test05(@SessionAttribute(name = "msg") String session){
System.out.println(session);
}
操作cookie
public class CookieController {
@RequestMapping("/c1")
public void test01(HttpServletResponse response){
Cookie ck = new Cookie("cookie","cookieValue");
ck.setPath("/");
ck.setMaxAge(60*60*24*7);
response.addCookie(ck);
}
/**
* 获取cookie中值的方式1
* @param request
*/
@RequestMapping("/c2")
public void test02(HttpServletRequest request){
Cookie[] cookies = request.getCookies();
for (int i = 0; i < cookies.length; i++) {
System.out.println(cookies[i].getName()+":"+cookies[i].getValue());
}
}
/**
* 获取cookie中值的方式2 注解方式
* @param cookie
*/
@RequestMapping("/c3")
public void test03(@CookieValue("cookie") String cookie){
System.out.println(cookie);
}
} SpringMVC中的Interceptor拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的 处理。比如通过它来进行权限验证,或者是来判断用户是否登录等操作。对于SpringMVC拦截器的定义方式有两 种
实现接口: org.springframework.web.servlet.Handlerlnterceptor
继承适配器: org.springframework.web.servethandler.HandlerInterceptorAdapter
1.实现Handlerlnterceptor接口

2.继承HandlerInterceptorAdapter(不建议使用)
使用拦截器拦截非法请求
/**
*用户操作模拟实现
* 用户的登录(无需登录)
* 用户的添加(登录)
* 用户修改(登录)
* 用户删除(登录)
*
* @author mosin
* date 2021/8/22
* @version 1.0
*/
@Controller
@RequestMapping("/user")
@SessionAttributes("action")
public class UserInfoController {
/**
* 用户登录
*/
@RequestMapping("/login")
public ModelAndView login(HttpSession session){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("success");
User user = User.builder().password("123456").username("lisi").build();
session.setAttribute("user", user);
modelAndView.addObject("user", user);
return modelAndView;
}
/**
* 用户添加
*/
@RequestMapping("/add")
public String add(Model model){
model.addAttribute("action", "用户添加成功");
System.out.println("用户的添加方法");
return "success";
}
/**
* 用户修改
*/
@RequestMapping("/update")
public String update(Model model){
System.out.println("用户的更新方法");
model.addAttribute("action", "用户更新成功");
return "success";
}
/**
* 用户修改
*/
@RequestMapping("/delete")
public String delete(Model model){
System.out.println("用户的删除方法");
model.addAttribute("action", "用户删除成功");
return "success";
}
}
添加坐标依赖

配置解析器
后台代码
@Controller
@RequestMapping("/upload")
public class UPloadController {
@RequestMapping("/file")
public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request){
//获取项目的真实路径
String realPath = request.getSession().getServletContext().getRealPath("/");
System.out.println(realPath);
//创建文件上传的目录
File dir = new File(realPath, "/upload");
System.out.println(dir);
//判定文件夹是否存在 不存在创建
if(!dir.exists()){
dir.mkdir();
}
if(!file.isEmpty()){
//获取文件的名字
String fileName = file.getOriginalFilename();
//截取文件的后缀 生成新的文件名 避免文件名字重复
String suffix= fileName.substring(fileName.lastIndexOf("."));
//获取当前系统时间
String fileLastName = System.currentTimeMillis()+suffix;
System.out.println(fileLastName);
//将文件写入目标文件夹
try {
file.transferTo(new File(dir,fileLastName));
request.setAttribute("msg", "文件上传成功");
} catch (IOException e) {
e.printStackTrace();
request.setAttribute("msg", "文件上传失败");
}
}else{
request.setAttribute("msg", "未选择文件");
}
return "success";
}
@RequestMapping("/files")
public String uploads(@RequestParam("files") List<MultipartFile> files, HttpServletRequest request){
//遍历集合
files.forEach(multipartFile -> {
FileUploadUtil.upload(multipartFile, request);
});
return "success";
}
}
1.处理的方式1 使用 @ExceptionHandler(Exception.class) 在类中定义一个异常的方法,处理本类中的指定异常
@RestController
@RequestMapping("/exception")
public class ExceptionController01 {
@ExceptionHandler(Exception.class)
public Object handlerException(Exception e){
return JsonResult.builder().msg("出现"+"异常").code(1).data(e.getMessage()).build();
}
@RequestMapping("/e1")
public Object ex1(){
int a = 1/0;
return null;
}
@RequestMapping("/e2")
public Object ex2() throws FileNotFoundException {
new FileInputStream("ab");
return null;
}
}
2.处理的方式2 全局处理模式 定义ExceptionAdvice类

1.引入mybatis依赖
<!-- mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- 分页pagehelper-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.1</version>
</dependency>
<!-- mybatis-spring-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.5</version>
</dependency>
2.引入spring依赖
<!-- spring-context-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.9</version>
</dependency>
<!-- spring-aspects-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.3.9</version>
</dependency>
<!-- spring-jdbc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.9</version>
</dependency>
3.springmvc依赖
<!-- spring-webmvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.9</version>
</dependency>
<!-- jackson-core-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.3</version>
</dependency>
<!-- jackson-databind-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.3</version>
</dependency>
<!-- jackson-annotations-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.11.3</version>
</dependency>
<!-- 文件上传-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
4.log4j依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.13.3</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.13.1</version>
</dependency>
5.数据库驱动和连接池
<!-- mysql-connector-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<!-- druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
6.servlet+jsp依赖
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!-- jsp-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
7.jstl依赖
<!--jstl-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
8.其它依赖
<!-- lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
<!-- junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>

3.spring核心配置文件
<?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"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 读取db.properties -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 配置数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!-- 数据库驱动 -->
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="initialSize" value="${jdbc.initialSize}" />
<property name="maxActive" value="${jdbc.maxActive}" />
<property name="maxWait" value="${jdbc.maxWait}" />
</bean>
<!-- 事务管理器,依赖于数据源 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 开启事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- 配置MyBatis工厂 SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource" />
<!-- 指定Mybatis核心配置文件位置 -->
<property name="configLocation" value="classpath:config/mybatis-config.xml" />
<!-- 扫描模块配置文件:mapper需要的xml文件(如果mapper.xml和接口在一个包下,可以不配置) -->
<property name="mapperLocations" value="classpath:mapper/*.xml" />
</bean>
<!-- 配置mapper扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.kgc.ssm.dao" />
</bean>
<!-- 扫描包-->
<context:component-scan base-package="cn.kgc.ssm" />
<!-- 开启spring注解支持-->
<context:annotation-config/>
</beans>
4.spring-mvc配置文件
<?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"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 加载注解驱动 -->
<mvc:annotation-driven />
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/" />
<property name="suffix" value=".jsp" />
</bean>
<!--释放静态资源-->
<mvc:default-servlet-handler/>
<!-- 文件上传配置文件解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 允许上传的最大文件-->
<property name="maxUploadSize" >
<value>104857600</value>
</property>
<!-- 内存中的最大缓存超出写出临时文件到硬盘-->
<property name="maxInMemorySize" >
<value>4096</value>
</property>
<property name="defaultEncoding">
<value>utf-8</value>
</property>
</bean>
</beans>
5.mybatis配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- mybatis运行时设置 -->
<settings>
<!-- 启用log4j日志 -->
<setting name="logImpl" value="LOG4J"></setting>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 别名定义 -->
<typeAliases>
<package name="cn.kgc.ssm.entity" />
</typeAliases>
<!-- mybatis插件 -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 配置mysql方言 -->
<property name="helperDialect" value="mysql" />
<!-- 设置为true时,如果pageSize=0就会查询出全部的结果 -->
<property name="pageSizeZero" value="true" />
<!-- 3.3.0版本可用,分页参数合理化,默认false禁用 -->
<!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
<!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
<property name="reasonable" value="true" />
</plugin>
</plugins>
</configuration>
6.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-name>ssm</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/spring-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ssm</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 过滤器解决中文乱码-->
<filter>
<filter-name>encoding</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>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/</url-pattern>
</filter-mapping>
</web-app>

目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我想开始使用“Sinatra”框架进行编码,但我找不到该框架的“MVC”模式。是“MVC-Sinatra”模式或框架吗? 最佳答案 您可能想查看Padrino这是一个围绕Sinatra构建的框架,可为您的项目提供更“类似Rails”的感觉,但没有那么多隐藏的魔法。这是使用Sinatra可以做什么的一个很好的例子。虽然如果您需要开始使用这很好,但我个人建议您将它用作学习工具,以对您来说最有意义的方式使用Sinatra构建您自己的应用程序。写一些测试/期望,写一些代码,通过测试-重复:)至于ORM,你还应该结帐Sequel其中(imho
如何学习ruby的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/
深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG
文章目录1、自相关函数ACF2、偏自相关函数PACF3、ARIMA(p,d,q)的阶数判断4、代码实现1、引入所需依赖2、数据读取与处理3、一阶差分与绘图4、ACF5、PACF1、自相关函数ACF自相关函数反映了同一序列在不同时序的取值之间的相关性。公式:ACF(k)=ρk=Cov(yt,yt−k)Var(yt)ACF(k)=\rho_{k}=\frac{Cov(y_{t},y_{t-k})}{Var(y_{t})}ACF(k)=ρk=Var(yt)Cov(yt,yt−k)其中分子用于求协方差矩阵,分母用于计算样本方差。求出的ACF值为[-1,1]。但对于一个平稳的AR模型,求出其滞