SpringMVC (Thymeleaf版)
文章目录
第一章、SpringMVC的引言
1.1 什么是SpringMVC
1. 概念: SpringMVC是基于Spring Framework衍生而来的一个MVC框架。主要解决了原有MVC框架开发过程中,控制器(Controller)的问题。
- SpringMVC是一个MVC框架
1. MVC是一个架构思想,在JavaEE开发中多用于Web开发。
2. 应用MVC架构思想开发应用,会把一个项目划分为了3个层次,M(Model) 模型层,V(View) 视图层,C(Controller) 控制层。
View JSP
Model Service+DAO
Controller Servlet
3. MVC这种分层开发,体现了面向对象各司其职的设计思想,也更加有利于后续的项目维护(修改)。
-
为什么要基于Spring Framework
- 通过工厂(容器)创建对象,解耦合 (IOC DI)。
- 通过AOP的方式,为目标类(原始类),增加额外功能。
- 方便与第三方框架的集成
- MyBatis
- JPA
- MQ
-
原有MVC开发中控制器存在的问题
1. 原有MVC开发中的控制器是通过哪些技术实现的?
2. 这些技术在实现控制器时,存在着哪些问题?
-
原有控制器的实现技术
- Servlet [基于Java Model2模式]
- Struts2中的Action
-
Servlet实现控制器存在的问题
-
控制器的核心作用
1. 接受用户的请求,调用业务功能(Service),并根据处理结果控制程序的运行流程。
- 控制器的核心代码
1. 接受client请求参数
2. 调用业务对象(Service)
3. 流程跳转(页面跳转)
-
控制器存在的问题
- 接受client请求参数
1. 代码冗余 2. 只能接受字符串类型的数据,需要手工进行类型转换 3. 无法自动封装对象
UserService userService = new UserServiceImpl(); //耦合代码
boolean isLogin = userService.login(name,password);
1. 通过new的方式获得业务对象(service),存在耦合
- 流程跳转(页面跳转)
1. 跳转路径耦合
2. 与视图层技术的耦合
1.2 SpringMVC课程的学习要点
1.2.1 SpringMVC的三种开发模式
● 传统视图开发
1. 通过作用域(request,session)进行数据的传递。
2. 通过视图层技术进行数据的展示(JSP,FreeMarker,Thymeleaf)。
● 前后端分离开发
1. 多种新的请求发送方式
2. Restful的访问
3. 通过HttpMessageConverter进行数据响应
● Spring5 WebFlux开发
1. 替换传统JavaWeb开发的一种新的Web开发方式。
2. 通过NettyServer,进行Web通信。
1.2.2 控制器开发
1. 接受client请求参数
2. 调用业务对象
3. 流程跳转
第二章、第一个SpringMVC程序的开发
2.1 开发版本
1. JDK1.8+
2. Maven3.6+
3. IDEA2021+
4. SpringFramework 5.1.4
5. Tomcat8.5.29
6. MySQL5.7.18
2.2 环境搭建
2.2.1 引入相关相关jar
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.14.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.1.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.1.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.1.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.18</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.1.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.8</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.logback-extensions</groupId>
<artifactId>logback-ext-spring</artifactId>
<version>0.1.4</version>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.25</version>
</dependency>
注意 SpringMVC比前面我们所学习的Spring,就多引入了一个jar包,叫做spring-webmvc.jar
2.2.2 配置文件
SpringMVC的配置文件,就是Spring的配置文件
1. 名字可以随便命名,本次课程取名dispatcher.xml。
2. 放置路径可以根据需要,随意放置,本次课程放置在资源目录的根下。
2.2.3 初始化配置
- web.xml
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--用于配置SpringMVC的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:dispatcher.xml</param-value>
</init-param>
<!--设置servlet在Tomcat启动时自动加载创建-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
DispatcherServlet
1. DispatcherServlet称为前端控制器(中央控制器)
2. DispatcherServlet的核心作用:
1. 用于创建Spring的工厂(容器)。
ApplicationContext ctx = new ClassPathXmlApplicationContext("dispatcher.xml");
因为DispatcherServlet封装的Spring工厂(容器)只能读取xml,所以无法迁移到纯注解
2. 控制SpringMVC内部的运行流程。
SpringMVC的配置文件dispacher.xml
<mvc:annotation-driven/>
<context:component-scan base-package="com.baizhiedu"/>
mvc:annotation-driven
# <mvc:annotation-driven/> 这段配置的主要作用:引入SpringMVC的核心功能。
# 主要引入了2个核心类型
# 1.RequestMappingHandlerMapping
# 2.RequestMappingHandlerAdapter
1. RequestMappingHandlerMapping实现了HandlerMapping接口【了解】
它会处理@RequestMapping注解,并将其注册到请求映射表中。
2. RequestMappingHandlerAdapter实现了 HandlerAdapter接口【了解】
它是处理请求的适配器,确定调用某个符合要求的控制器类中具体服务的方法。
SpringMVC对mvc:annotation-driven的封装
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-31I0JGz2-1665022310089)(https://cdn.ycode-nav.top/img/image (8)].png)
context:component-scan
1. 进行注解扫描
2. DispatcherServlet所创建的工厂需要读取XML的配置文件,不能使用纯注解的开发。所以目前使用Spring配置文件+基础注解的形式,进行开发。
基础注解:@Component,@Service,@Repository,@Controller,@Scope,@Transactional等
高级注解:@Configuration,@Bean,@ComponentScan等
后续SpringMVC高级版的课程,会使用纯注解版开发,与SpringBoot的使用方式高度一致。
2.3 编码开发
2.3.1 思路分析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BVyCsHPx-1665022310089)(https://cdn.ycode-nav.top/img/image (6)].png)
# 基本流程
1. 开发一个类在上面加入@Controller注解
2. 提供一个控制器方法:参数是HttpServletRequest,HttpServletResponse,返回值是String的,同时加入@RequestMapping注解定义请求路径
3. 在控制方法中,完成核心开发功能,把对应JSP页面的路径,作为方法的返回值返回。
2.3.2 编码
@Controller
public class FirstController {
@RequestMapping("/first")
public String first(HttpServletRequest request, HttpServletResponse response) {
System.out.println("FirstController.first");
return "/result.jsp";
}
}
必须要进行@Controller注解的扫描,<context:component-scan base-package="com.baizhiedu"/>
2.3.3 一个控制器中,提供多个服务方法
- Servlet作为控制器,一个类中只能提供一个服务方法
1. Servlet开发中,明确控制器的方法必须实现接口规定的service(HttpServletRequest,HttpServletResponse)方法,一个类中是能实现一次,所以一个类中只能有一个服务方法。
http://localhost:8989/basic/loginServlet
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException