Spring MVC 简单介绍
整体工作流程图

核心架构的具体流程步骤如下:
- 1、 首先用户发送请求 ——> DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行 处理,作为统一访问点,进行全局的流程控制;
- 2、 DispatcherServlet ——> HandlerMapping, HandlerMapping 将会把请求映射为 HandlerExecutionChain 对象(包含一 个Handler 处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新 的映射策略;
- 3、 DispatcherServlet ——> HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器, 即适配器设计模式的应用,从而很容易支持很多类型的处理器;
- 4、 HandlerAdapte r——> 处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处 理方法,完成功能处理;并返回一个ModelAndView 对象(包含模型数据、逻辑视图名);
- 5、 ModelAndView 的逻辑视图名 ——> ViewResolver,ViewResolver 将把逻辑视图名解析为具体的View,通过这种策 略模式,很容易更换其他视图技术;
- 6、 View ——> 渲染,View 会根据传进来的Model 模型数据进行渲染,此处的Model 实际是一个Map 数据结构,因此 很容易支持其他视图技术;
- 7、 返回控制权给DispatcherServlet,由DispatcherServlet 返回响应给用户,到此一个流程结束。
组件说明
- 1:DispatcherServlet:前端控制器(由框架提供),作为流程控制的中心,控制其他组件执行,统一调度,能够接受请求、响应结果。
- 2:HandlerMapping:处理器映射器(由框架提供),根据用户请求的url路径找到负责处理的Handler处理器。
- 3:HandlerAdaptor:处理器适配器(由框架提供),根据特定规则去执行Handler。
- 4:Handler:处理器(需要自己开发),作为后端控制器,对具体用户的业务请求进行请求,并将处理的结果封装在ModelAndView对象中,并返回给调用者。
- 5:ViewResolver:视图解析器(由框架提供),主要进行视图解析,根据逻辑视图名解析出真正的视图。
SpringMvc 后端开发流程
分层架构设计
基于分层架构设计思想,现对某API进行设计,如图所示 
访问流程
- 1、请求访问进入 Controller
- 2、Controller 调用业务 Service 接口, 交给接口实现类完成业务处理
- 3、Service 实现类调用 Mapper/Dao 接口实现对数据库操作
常规业务开发代码样例
Controller
java
@Controller
@RequestMapping("/admin/user/info")
public class UserInfoController {
private final IUserInfoService userInfoService;
public UserInfoController(IUserInfoService userInfoService) {
this.userInfoService = userInfoService;
}
@PostMapping("")
@ResponseBody
public ServerResponse<UserInfoDto> saveUserInfo(@RequestBody UserInfoDto userInfoDto) throws Exception {
return ServerResponse.okData(userInfoService.saveUserInfo(userInfoDto));
}
}Service
java
public interface IUserInfoService {
UserInfoDto saveUserInfo(UserInfoDto userInfoDto) throws Exception;
}Service 接口实现
java
@Service
public class UserInfoServiceImpl implements IUserInfoService {
private final IUserInfoMapper userInfoMapper;
public UserInfoServiceImpl(IUserInfoMapper userInfoMapper) {
this.userInfoMapper = userInfoMapper;
}
@Override
@Transactional(rollbackFor = Exception.class)
public UserInfoDto saveUserInfo(UserInfoDto userInfoDto) throws Exception {
UserInfo userInfo = new UserInfoVo();
BeanUtils.copyProperties(userInfoDto, userInfo);
userInfoMapper.saveUserInfo(userInfoDto)
return userInfoDto;
}
}Mapper/Dao 接口
java
public interface IUserInfoMapper {
UserInfoDto saveUserInfo(UserInfoDto userInfoDto);
}xml 数据库操作
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 命名空间(namespace.md) 指向 Mapper/Dao 接口 -->
<mapper namespace="com.test.mapper.IUserInfoMapper">
<insert id="saveUserInfo" parameterType="com.test.entity.UserInfo">
INSERT INTO SYS_USER_INGO (ID, USERNAME, NAME, PASSWORD)
VALUES
(#{id}, #{username}, #{name}, #{password})
</insert>
</mapper>
剑鸣秋朔