Spring MVC学习随笔-控制器(Controller)开发详解:调用业务对象、父子工厂拆分(applicationContext.xml、dispatcher.xml)

这篇具有很好参考价值的文章主要介绍了Spring MVC学习随笔-控制器(Controller)开发详解:调用业务对象、父子工厂拆分(applicationContext.xml、dispatcher.xml)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学习视频:孙哥说SpringMVC:结合Thymeleaf,重塑你的MVC世界!|前所未有的Web开发探索之旅

第四章、SpringMVC控制器开发详解 二

4.1 核心要点

💡 1. 接收客户端(Client)请求参数【讲解完毕】 2. 调用业务对象【讲解】 3. 页面跳转

4.2 SpringMVC控制器调用业务对象【SSM整合】

4.2.1 核心思路分析

Spring MVC学习随笔-控制器(Controller)开发详解:调用业务对象、父子工厂拆分(applicationContext.xml、dispatcher.xml)
Spring MVC学习随笔-控制器(Controller)开发详解:调用业务对象、父子工厂拆分(applicationContext.xml、dispatcher.xml)

4.2.2 编码

  • dispatcher.xml

    <!--设置注解扫描的路径-->
    <context:component-scan base-package="com.baizhi"/>
    
    <!--引入SpringMVC的核心功能-->
    <mvc:annotation-driven/>
    
    <!--整合跳转路径,解耦合-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    
    <!--连接池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/myschool?useSSL=false&amp;allowPublicKeyRetrieval=true"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>
    <!-- 创建SqlSessionFactory SqlSessionFactoryBean-->
    <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="typeAliasesPackage" value="com.baizhi.entity"/>
        <property name="mapperLocations">
            <list>
                <value>classpath:com.baizhi.mapper/*Mapper.xml</value>
            </list>
        </property>
    </bean>
    <!--创建DAO对象 MapperScannerConfigure-->
    <bean id="scanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
        <property name="basePackage" value="com.baizhi.dao"/>
    </bean>
    
    <!-- 配置事务-->
    <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
    
  • 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**
    <mapper namespace="com.baizhi.dao.UserDAO">
    
        <insert id="save">
            insert into admin(name,password) values(#{name},#{password})
        </insert>
    </mapper>
    
    
  • Service

    public interface UserService {
        void register(User user);
    }
    
    Service
    @Transactional
    public 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 父子工厂(父子容器) 拆分

4.2.4 父子容器问题

  • 问题

    按照现有父子工厂(容器)的开发方式,Service层没有添加事务。

  • 问题成因

    获取的是子容器的UserService,而子容器中没有事务配置,所以获取不到事务。

Spring MVC学习随笔-控制器(Controller)开发详解:调用业务对象、父子工厂拆分(applicationContext.xml、dispatcher.xml)

  • 解决方案

    之所以在子容器没有实现事务,是因为包扫描的全部的包,将service的包也交给子容器管理。

    子容器:只扫描控制器及与MVC相关的内容
    <context:component-scan base-package="com.baizhi.controller"/>
    
    父容器:不扫描控制器与MVC相关的内容
    <context:component-scan base-package="com.baizhi">
        <context:exclude-filter type="aspectj" expression="com.baizhi.controller"/>
    </context:component-scan>
    注意:在SpingBoot中不会出现父子容器的问题。
    

4.3 SpringMVC控制器调用业务对象总结(SSM)

4.3.1 完整编码总结

  • web.xml

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:dispatcher.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
  • dispatcher.xml

    <context:component-scan base-package="com.baizhi.controller"/>
    <mvc:annotation-driven/>
    
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    
  • applicationContex.xml

    <context:component-scan base-package="com.baizhi">
        <context:exclude-filter type="aspectj" expression="com.baizhi.controller"/>
    </context:component-scan>
    <!--连接池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/myschool?useSSL=false&amp;allowPublicKeyRetrieval=true"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>
    <!-- 创建SqlSessionFactory SqlSessionFactoryBean-->
    <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="typeAliasesPackage" value="com.baizhi.entity"/>
        <property name="mapperLocations">
            <list>
                <value>classpath:com.baizhi.mapper/*Mapper.xml</value>
            </list>
        </property>
    </bean>
    <!--创建DAO对象 MapperScannerConfigure-->
    <bean id="scanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
        <property name="basePackage" value="com.baizhi.dao"/>
    </bean>
    
    <!-- 配置事务-->
    <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
    
  • 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**
    <mapper namespace="com.baizhi.dao.UserDAO">
    
        <insert id="save">
            insert into admin(name,password) values(#{name},#{password})
        </insert>
    </mapper>
    
  • Service

    public interface UserService {
        void register(User user);
    }
    
    Service
    @Transactional
    public 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";
        }
    }
    

下一章:Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(一)文章来源地址https://www.toymoban.com/news/detail-748085.html

到了这里,关于Spring MVC学习随笔-控制器(Controller)开发详解:调用业务对象、父子工厂拆分(applicationContext.xml、dispatcher.xml)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是域控制器Domain Controller?

    一个域描述了一组用户、系统、应用程序、网络、数据库服务器和其他任何资源,这些资源都受到一组共同的管理规则的控制。通常,一个域还包括一个物理空间,比如一个办公室或多个办公室。如果你在域内,你就处于一个理论上安全和可信的空间。如果在外面,你就是不

    2024年02月07日
    浏览(65)
  • beego的控制器Controller篇 — 数据处理

    1.1 获取参数 通过如下方式获取数据: GetString(key string) string GetStrings(key string) []string GetInt(key string) (int64, error) GetBool(key string) (bool, error) GetFloat(key string) (float64, error) 例如: 如果需要的数据是其他类型的,例如是 int 类型而不是 int64,那么你需要这样处理: 1.2 获取表单中的

    2024年01月17日
    浏览(50)
  • 5、Kubernetes核心技术 - Controller控制器工作负载

    目录 一、Deployments - 控制器应用 二、Deployment升级回滚和弹性收缩 2.1、创建一个 1.14 版本的 pod 2.2、应用升级 2.3、查看升级状态 2.4、查看历史版本 2.5、应用回滚 2.6、弹性伸缩  三、StatefulSet - 有状态应用 四、DaemonSet - 守护进程 五、Job - 单次任务 六、Cronjob - 定时任务 Deplo

    2024年02月15日
    浏览(38)
  • 【P38】JMeter 随机控制器(Random Controller)

    可以让控制器内部的逻辑随机执行一个,一般用来模拟业务的不确定性;随机控制器在线程迭代或者控制器循环的时候均会触发 选择线程组右键 添加 逻辑控制器 随机控制器(Random Controller) 忽略子控制器块(Ignore sub-controller blocks):子控制器功能失效,由交替控制器代替

    2024年02月07日
    浏览(41)
  • 【P30】JMeter 事务控制器(Transaction Controller)

    可以生成一个额外的样本,这样能够将它的所有子元素作为一个计量单元进行监听;事务控制器本身不包含任何业务逻辑,只是组合出一个新的计量单元 选择线程组右键 添加 逻辑控制器 事务控制器(Transaction Controller) Generate parent sample:选中,事务控制器将作为其他取样器

    2024年02月06日
    浏览(85)
  • 第三十章 Unity角色控制器 Character Controller

    在我们之前的章节中,我们已经了解了碰撞体和刚体。但是,对于刚体这个组件来讲,有两种使用方式。其一就是用它来模拟现实世界的移动或碰撞效果(例如,门的开关);其二就是使用代码来控制物体移动或碰撞(例如,角色的行走)。两种方式使用场景不同而已。 本章

    2024年02月08日
    浏览(54)
  • 【P31】JMeter 循环控制器(Loop Controller)

    可以对部分逻辑按常量进行循环迭代 选择线程组右键 添加 逻辑控制器 循环控制器(Loop Controller) Loop Count:设置运行次数,Infinite 勾选为永久运行 2.1、设置循环次数 (1)、测试计划右键 添加 线程(用户) 线程组 参数默认即可 (2)、线程组右键 添加 取样器 调试取样器

    2024年02月07日
    浏览(47)
  • 【P34】JMeter ForEach控制器(ForEach Controller)

    可以对一个组变量进行循环迭代;该组件通常与后置处理器中的 JSON 提取器、正则提取器、边界提取器等进行联合使用 选择线程组右键 添加 逻辑控制器 ForEach控制器(ForEach Controller) 输入变量前缀(Input variable prefix):默认为一个空字符串作为前缀 开始循环字段(不包含)

    2024年02月06日
    浏览(45)
  • Kubernetes技术--k8s核心技术Controller控制器

    1.Controller概述    Controller是在集群上管理和运行容器的对象。是一个实际存在的对象。 2.pod和Controller之间的关系 pod通过controller实现应用的运维,包括伸缩、滚动升级等操作。 这里pod和controller通过label标签来建立关系。如下所示: 3.Deployment控制器应用场景 -1:部署无状态的应

    2024年02月10日
    浏览(44)
  • 【P33】JMeter 临界部分控制器(Critical Section Controller)

    可以对指定代码块增加同步锁,确保此代码块由单线程执行;通过 Java synchronized 实现 选择线程组右键 添加 逻辑控制器 临界部分控制器(Critical Section Controller) 锁名称(Lock name):锁名为空,认为每个锁为不同的锁;锁名相同,多个锁认为是同一个锁,同一个时间点

    2024年02月07日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包