学习视频:孙哥说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工厂读取配置)

    1. 把目前单一的工厂进行父子工厂的拆分

      1. 子工厂(DispatcherServlet)读取dispatcher.xml

        完成与SpringMVC相关对象的创建:视图解析器、自定义类型转换器、拦截器等

      2. 父工厂(ContextLoaderListener)读取applicationContext.xml

        完成与非SpringMVC相关对象的创建:连接池、DAO、Service、事务、Redis、ES、MQ等

    2. 工厂(容器)在需要获取对象进行操作时,首先获取子容器所创建的对象,如果没有则继续获得父容器所创建的对象

  • 编码

    • 子工厂(子容器)

      # 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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。