学习视频:孙哥说SpringMVC:结合Thymeleaf,重塑你的MVC世界!|前所未有的Web开发探索之旅
第四章、SpringMVC控制器开发详解 二4.1 核心要点💡 1. 接收客户端(Client)请求参数【讲解完毕】2. 调用业务对象【讲解】3. 页面跳转
4.2 SpringMVC控制器调用业务对象【SSM整合】4.2.1 核心思路分析
4.2.2 编码
dispatcher.xml
classpath:com.baizhi.mapper/*Mapper.xml
DAO
// **POJO**public class User implements Serializable { private Integer id; private String name; private String password;// **建表**create table t_user( id integer primary key auto_increment; name varchar(12), password varchar(12));// **DAO**public interface UserDAO { void save(User user);}// **Mapper** insert into admin(name,password) values(#{name},#{password})
Service
public interface UserService { void register(User user);}Service@Transactionalpublic class UserServiceImpl implements UserService { @Autowired private UserDAO userDAO; @Override public void register(User user) { userDAO.save(user); }}
Controller
@Controller@RequestMapping("/user")public class UserController { @Autowired private UserService userService; @RequestMapping("/register") public String register(User user) { userService.register(user); return "regOk"; }}
4.2.3 父子工厂(父子容器) 拆分
现有SSM开发中存在的问题
MVC层的对象(Controller,mvc:annotation-driven/,视图解析器)与非MVC层的(连接池 DAO Service 事务),都配置在dispatcher.xml中,最终交给DispatcherServlet创建的工厂来进行实例化,存在着耦合问题,后续一旦替换MVC的实现,代码会受到影响,不利于项目的维护
如何解决
将非MVC的配置放在applicationContext.xml(引入ContextLoaderListener工厂读取配置)
把目前单一的工厂进行父子工厂的拆分
子工厂(DispatcherServlet)读取dispatcher.xml
完成与SpringMVC相关对象的创建:视图解析器、自定义类型转换器、拦截器等
父工厂(ContextLoaderListener)读取applicationContext.xml
完成与非SpringMVC相关对象的创建:连接池、DAO、Service、事务、Redis、ES、MQ等
工厂(容器)在需要获取对象进行操作时,首先获取子容器所创建的对象,如果没有则继续获得父容器所创建的对象
编码
子工厂(子容器)
# dispatcher.xml# SpringMVC相关的配置 # web.xml子容器的配置 dispatcherServlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:dispatcher.xml 1 dispatcherServlet /
父工厂(父容器)
# applicationContext.xml# Spring相关配置 classpath:com.baizhi.mapper/*Mapper.xml # web.xml父容器的配置 org.springframework.web.context.ContextLoaderListener contextConfigLocation classpath:applicationContext.xml
4.2.4 父子容器问题
问题
按照现有父子工厂(容器)的开发方式,Service层没有添加事务。
问题成因
获取的是子容器的UserService,而子容器中没有事务配置,所以获取不到事务。
解决方案
之所以在子容器没有实现事务,是因为包扫描的全部的包,将service的包也交给子容器管理。
子容器:只扫描控制器及与MVC相关的内容父容器:不扫描控制器与MVC相关的内容 注意:在SpingBoot中不会出现父子容器的问题。
4.3 SpringMVC控制器调用业务对象总结(SSM)4.3.1 完整编码总结
web.xml
org.springframework.web.context.ContextLoaderListener contextConfigLocation classpath:applicationContext.xml dispatcherServlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:dispatcher.xml 1 dispatcherServlet / encodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 encodingFilter /*
dispatcher.xml
applicationContex.xml
classpath:com.baizhi.mapper/*Mapper.xml
DAO
// **POJO**public class User implements Serializable { private Integer id; private String name; private String password;// **建表**create table t_user( id integer primary key auto_increment; name varchar(12), password varchar(12));// **DAO**public interface UserDAO { void save(User user);}// **Mapper** insert into admin(name,password) values(#{name},#{password})
Service
public interface UserService { void register(User user);}Service@Transactionalpublic class UserServiceImpl implements UserService { @Autowired private UserDAO userDAO; @Override public void register(User user) { userDAO.save(user); }}
Controller
@Controller@RequestMapping("/user")public class UserController { @Autowired private UserService userService; @RequestMapping("/register") public String register(User user) { userService.register(user); return "regOk"; }}
作者:扬眉剑出鞘
出处: https://www.cnblogs.com/eyewink/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。