SpringMVC框架笔记总结(史上最全)SpringMVC从⼊门到精通
⽂章⽬录
本⽂章是基于尚硅⾕的 ,加⼊了⾃⼰的⼀些见解,⽂中有出错的地⽅还请指正,码字不易,⽀持⼀下吧!
概念引⼊
⼈们习惯将JavaEE分为经典的三层架构:
表现层(web层)
整个表现层负责接收客户端请求并响应结果给客户端(Http请求)
具体来说,表现层=view视图层+controller控制层。controller层主要负责接收请求,转发请求给service层、跳转视图页⾯servlet–>struts(过滤器)–>springmvc
业务层(service层)
负责业务逻辑处理,和项⽬需求息息相关(⽐如转账业务)。
spring–>springboot(全注解)
主要涉及逻辑:异常处理 参数处理 声明式事务AOP
持久层(DAO层)
和数据库交互,对数据表进⾏增删改查操作
jdbc–>jdbcTemplate–>DBUtils–>Mybatis–>spring Data JPA
主流:SSM–>潮流:SSS(spring全家桶)
那MVC⼜是什么呢?
MVC是⼀种软件架构的思想,将软件按照模型、视图、控制器来划分
M:Model,模型层,指⼯程中的JavaBean,作⽤是处理数据
JavaBean分为两类:
⼀类称为实体类Bean:专门存储业务数据的,如 Student、User 等
⼀类称为业务处理 Bean:指 Service 或 Dao 对象,专门⽤于处理业务逻辑和数据访问。
V:View,视图层,指⼯程中的html或jsp等页⾯,作⽤是与⽤户进⾏交互,展⽰数据
C:Controller,控制层,指⼯程中的servlet,作⽤是接收请求和响应浏览器
MVC的⼯作流程: ⽤户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller调⽤相应的Model层处理请求,处理完毕将结果返回到Controller,Controller再根据请求处理的结果到相应的View视图,渲染数据后最终响应给浏览器
⽽springMVC就是对MVC思想的⼀个很好的体现产品。
SpringMVC 是 Spring 为表述层开发提供的⼀整套完备的解决⽅案。在表述层框架历经 Strust、WebWork、Strust2 等诸多产品的历代更迭之后,⽬前业界普遍选择了 SpringMVC 作为 Java EE 项⽬表述层开发的⾸选⽅案。
注:三层架构分为表述层(或表⽰层)、业务逻辑层、数据访问层,表述层表⽰前台页⾯和后台servlet
SpringMVC的特点:
Spring 家族原⽣产品,与 IOC 容器等基础设施⽆缝对接
基于原⽣的Servlet,通过了功能强⼤的前端控制器DispatcherServlet,对请求和响应进⾏统⼀处理
表述层各细分领域需要解决的问题全⽅位覆盖,提供全⾯解决⽅案
代码清新简洁,⼤幅度提升开发效率
内部组件化程度⾼,可插拔式组件即插即⽤,想要什么功能配置相应组件即可
性能卓著,尤其适合现代⼤型、超⼤型互联⽹项⽬要求
Spring都能⼲什么呢?
接受请求
跳转页⾯
会话控制
过滤拦截
异步交互
⽂件上传
⽂件下载
数据校验
类型转换
⼊门案例
之前: request请求到servlet,⼀个项⽬中有很多servlet,不同serlvet处理不同的事情。这就导致当我们的项⽬需求越来越⼤的时候,会有超级多的servlet,及其不易维护和管理。
但是所有的servlet却都进⾏同样的两件事:请求和转发。
因此我们需要⼀个中央控制器,由他接收全部的请求,然后根据具体的请求类型分发给不同的页⾯进⾏响应。⽽springMVC就是这样实现的,SpringMVC全局只需要⼀个servlet。SpringMVC的最根本的思想就是分发思想。
开发环境
这⾥我所⽤的开发环境是:
IDE:idea 2021.1.3
构建⼯具:maven 3.8.4
tomcat:9.0.56
spring:5.3.15
模板引擎:thymeleaf
创建项⽬进⾏配置
创建⼀个web项⽬,这⾥我是使⽤maven构建⼯具创建的,所需要的jar包依赖如下:
<dependencies>
<!--测试包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- SpringMVC -->
<dependency>
<groupId>org.springframework</groupId>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.15</version>
</dependency>spring ioc注解
<!-- ⽇志 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- ServletAPI -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- Spring5和Thymeleaf整合包 -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.12.RELEASE</version>
</dependency>
<!--快速封装JavaBean-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
</dependencies>
注:由于 Maven 的传递性,我们不必将所有需要的包全部配置依赖,⽽是配置最顶端的依赖,其他靠传递性导⼊。
导⼊依赖之后,配置l⽂件
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"java.sun/dtd/web-app_2_3.dtd" >
<web-app>
<!--
配置servlet:前端控制器,类名为DispatcherServlet,本⾝就是Servlet,继承⾃HttpServlet
客户端浏览器所有的请求,都让前端控制器接收
请求分发给不同的程序
-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!--
url-pattern 配置浏览器的请求地址
/ 所匹配的请求可以是/login或.html或.js或.css⽅式的请求路径
但是/不能匹配.jsp请求路径的请求
*.do
*.action
浏览器的地址栏,最后⾯是.do的请求全部接受
-->
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
我们知道DispatcherServlet是做请求转发的,根据不同的请求调⽤不同的控制器,因此我们还需要⼀系列的控制器。创建⼀个包:ller,在包内创建⼀个类SayHelloController作为控制器:
package ller;
/**
* 控制器:控制页⾯跳转,调⽤service层等
* @author soberw
* @Classname SayHelloController
* @Description
* @Date 2022-03-01 9:28
*/
public class SayHelloController {
public String sayHello(){
System.out.println("");
return null;
}
}
那么控制器有了,如何与中央控制器产⽣联系呢?
我们需要将其放在IOC容器中,因此需要通过@Controller注解将其标识为⼀个控制层组件,交给Spring的IOC容器管理,此时SpringMVC才能够识别控制器的存在
在⽅法上添加@RequestMapping注解:
/**
* ⽅法:浏览器请求,调⽤⽅法sayHello
* 注解:@RequestMapping
*      注解的属性  value=浏览器的请求地址
*/
@RequestMapping(value ="/sayHello")
public String sayHello(){
System.out.println("");
return null;
}
创建⼀个配置⽂件l,引⼊context命名空间,配置包扫描;
因为我使⽤的是thymeleaf渲染的页⾯,因此还需要配置thymeleaf:
<!--配置包扫描-->
<component-scan base-package="ller"/>
<!-- 配置Thymeleaf视图解析器 -->
<bean id="viewResolver"class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<!--设置视图解析器优先级,越⼩优先级越⾼-->
<property name="order"value="1"/>
<!--设置解析编码-->
<property name="characterEncoding"value="UTF-8"/>
<!--设置模板内部bean注⼊-->
<property name="templateEngine">
<bean class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="templateResolver">
<bean class="org.plateresolver.SpringResourceTemplateResolver">
<!-- 视图前缀 -->
<property name="prefix"value="/WEB-INF/pages/"/>
<!-- 视图后缀 -->
<property name="suffix"value=".html"/>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。