SSM整合(spring+springMVC+mybatis)

SSM整合

什么是SSM

在这里插入图片描述

即Spring,SpringMVC,Mybatis三大框架整合在一起的技术。

整合的思路

  1. 搭建整合的环境
  2. 先把spring的配置搭建好
  3. 再使用spring整合SpringMVC框架
  4. 最后再使用Spring整合Mybatis框架

整合步骤

  1. 创建一个Maven工程,导入需要的坐标依赖(版本和连接池因人而异)

    <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
          <scope>compile</scope>
        </dependency>
        <!-- 数据库配置 -->
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>8.0.18</version>
        </dependency>
    
        <!-- Spring配置-->
        <dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjweaver</artifactId>
          <version>1.8.14</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-web</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aop</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-tx</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-test</artifactId>
          <version>5.1.5.RELEASE</version>
        </dependency>
    
        <!-- jsp -->
        <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>javax.servlet.jsp-api</artifactId>
          <version>2.3.3</version>
          <scope>provided</scope>
        </dependency>
        <!-- jstl -->
        <dependency>
          <groupId>javax.servlet.jsp.jstl</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
        </dependency>
        <dependency>
          <groupId>taglibs</groupId>
          <artifactId>standard</artifactId>
          <version>1.1.2</version>
        </dependency>
    
        <!--mybatis-->
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.5.4</version>
        </dependency>
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis-spring</artifactId>
          <version>2.0.3</version>
        </dependency>
    
        <!-- log日志 -->
        <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.17</version>
        </dependency>
    
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
          <version>1.7.30</version>
    
        </dependency>
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <version>1.7.30</version>
        </dependency>
      <!-- 连接池 -->
        <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid</artifactId>
          <version>1.1.21</version>
        </dependency>
        <dependency>
         <!-- 测试 -->
          <groupId>org.junit.jupiter</groupId>
          <artifactId>junit-jupiter</artifactId>
          <version>RELEASE</version>
          <scope>compile</scope>
        </dependency>
        <dependency>
          <!-- Servlet -->
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.0.1</version>
          <scope>provided</scope>
        </dependency>
      </dependencies>
    
  2. 编写spring的配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/aop
            https://www.springframework.org/schema/aop/spring-aop.xsd
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd
             http://www.springframework.org/schema/tx
            https://www.springframework.org/schema/tx/spring-tx.xsd"
    >
        <!--开启扫描,只希望处理Service和dao,controller不需要Spring框架处理-->
        <context:component-scan base-package="cn.okt">
            <!--配置哪些不扫描-->
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
        </beans>
    
  3. 编写java代码

    1. 业务层

      
      public interface AccountService {
          // 查询所有账户信息
          List<Account> findAll();
      
          // 保存账户信息
          void saveAccount(Account account);
      }
      
      
      @Service("accountService")
      public class AccountServiceImpl implements AccountService{
      
      
          public List<Account> findAll() {
              System.out.println("业务层:查询所有账户...");
              return null;
          }
      
          public void saveAccount(Account account) {
              System.out.println("业务层:保存帐户...");
          }
      }
      
    2. 持久层

      
      /**
       * 帐户dao接口
       */
      public interface AccountDao {
      
          // 查询所有账户
          public List<Account> findAll();
      
          // 保存帐户信息
          public void saveAccount(Account account);
      
      }
      
    3. 实体类

      public class Account implements Serializable {
      
          private Integer id;
          private String name;
          private Double money;
      
          public Integer getId() {
              return id;
          }
      
          public void setId(Integer id) {
              this.id = id;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public Double getMoney() {
              return money;
          }
      
          public void setMoney(Double money) {
              this.money = money;
          }
      
          @Override
          public String toString() {
              return "Account{" +
                      "id=" + id +
                      ", name='" + name + '\'' +
                      ", money=" + money +
                      '}';
          }
      }
      
  4. 编写测试类,测试spring环境是否搭建成功

    public class TestSpring {
        @Test
        public void run1(){
            ApplicationContext ac=new ClassPathXmlApplicationContext("classpath:spring的配置文件名称");
            AccountService service=(AccountService) ac.getBean("accountService");
            service.findAll();
            service.saveAccount(new Account());
        }
    }
    
  5. Spring整合springMVC,编写web.xml,配置前端控制器,中文乱码,Spring监听器

    <!DOCTYPE web-app PUBLIC
            "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
            "http://java.sun.com/dtd/web-app_2_3.dtd" >
    <web-app>
        <display-name>Archetype Created Web Application</display-name>
        <!--配置Spring的监听器,默认只加载WEB-INF目录下的applicationContext.xml配置文件-->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        <!--设置配置文件的路径-->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring配置名称</param-value>
        </context-param>
        <!--配置前端控制器-->
        <servlet>
            <servlet-name>dispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!--加载springmvc.xml配置文件-->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc配置名称</param-value>
            </init-param>
            <!--启动服务器,创建该servlet-->
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>dispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
        <!--解决中文乱码的过滤器-->
        <filter>
            <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
    </web-app>
    
    
  6. 编写SpringMVC配置文件

    扫描二维码关注公众号,回复: 9079431 查看本文章
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.2.xsd">
        <!--开启注解扫描-->
        <context:component-scan base-package="cn.okt">
            <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
        <!--视图解析器对象-->
        <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/pages/"></property>
            <property name="suffix" value=".jsp"></property>
        </bean>
    
        <!--前端控制器,哪些静态资源不拦截
        <mvc:resources mapping="/js/**" location="/js/"></mvc:resources>
    	-->
    	
        <!--开启SpringMVC框架注解支持-->
        <mvc:annotation-driven></mvc:annotation-driven>
    
    
    </beans>
    
  7. 编写控制层代码

    /**
     * 帐户web
     */
    @Controller
    @RequestMapping("/account")
    public class AccountController {
    
        @Autowired
        private AccountService accountService;
    
        @RequestMapping("/findAll")
        public String findAll(Model model){
            System.out.println("表现层:查询所有账户...");
            // 调用service的方法
            List<Account> list = accountService.findAll();
            model.addAttribute("list",list);
            return "list";
        }
    }
    
  8. 编写前端页面,并开启tomcat测试

    <index页面>
    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <h3>测试</h3>
    <a href="account/findAll">测试</a>
        <form action="account/save" method="post">
            姓名:<input type="text" name="name"><br>
            金额:<input type="text" name="money"><br>
            <input type="submit" value="保存">
        </form>
    </body>
    </html>
    
    <list页面>
    
    <%@ page contentType="text/html;charset=UTF-8" language="java"  isELIgnored="false" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <h3>已成功查询</h3>
    </body>
    </html>
    
  9. Spring整合Mybatis,修改持久层和业务层代码

    @Service("accountService")
    public class AccountServiceImpl implements AccountService{
    
        @Autowired
        private AccountDao accountDao;
    
        public List<Account> findAll() {
            System.out.println("业务层:查询所有账户...");
            return accountDao.findAll();
        }
    
        public void saveAccount(Account account) {
            System.out.println("业务层:保存帐户...");
            accountDao.saveAccount(account);
        }
    }
    
    /**
     * 帐户dao接口
     */
    @Repository
    public interface AccountDao {
    
        // 查询所有账户
        @Select("select * from account")
        public List<Account> findAll();
    
        // 保存帐户信息
        @Insert("insert into account (name,money) values (#{name},#{money})")
        public void saveAccount(Account account);
    
    }
    
  10. 在spring配置文件中配置mybatis

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/aop
            https://www.springframework.org/schema/aop/spring-aop.xsd
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd
             http://www.springframework.org/schema/tx
            https://www.springframework.org/schema/tx/spring-tx.xsd"
    >
        <!--开启扫描,只希望处理Service和dao,controller不需要Spring框架处理-->
        <context:component-scan base-package="cn.okt">
            <!--配置哪些不扫描-->
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
    
        <!--spring整合mybatis-->
        <!--配置连接池-->
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
            <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
            <property name="url" value="jdbc:mysql:///ssm?serverTimezone=UTC"></property>
            <property name="username" value="root"></property>
            <property name="password" value="19970930"></property>
        </bean>
        <!--配置SqlSessionFactory-->
        <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"></property>
        </bean>
    
        <!--配置AccountDao接口所在位置-->
        <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="cn.okt.dao"></property>
        </bean>
    </beans>  
    
  11. 修改前端页面list.jsp,并打开Tomcat进行测试

    <%@ page contentType="text/html;charset=UTF-8" language="java"  isELIgnored="false" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <h3>已成功查询</h3>
    <c:forEach items="${list}" var="account">
        ${account.name}
    </c:forEach>
    </body>
    </html>
    
  12. Spring配置事务,在spring配置文件中添加如下

        <!--配置事务通知-->
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
                <!--方法名为find*的都是只读不提交事务-->
            <tx:attributes>
                <tx:method name="find*" read-only="true"/>
                <tx:method name="*" isolation="DEFAULT"></tx:method>
            </tx:attributes>
        </tx:advice>
        <!--配置AOP增强,一般选用业务层来控制事务-->
        <aop:config>
            <aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.okt.service.impl.*ServiceImpl.*(..))"></aop:advisor>
        </aop:config>
    
  13. 在控制层添加save方法

        @RequestMapping("/save")
        public void save(Account account, HttpServletRequest request, HttpServletResponse response) throws IOException {
            System.out.println("表现层:增加账户...");
            // 调用service的方法
            accountService.saveAccount(account);
            //重定向
            response.sendRedirect(request.getContextPath()+"/account/findAll");
        }
    
  14. 修改前端页面,并开启Tomcat测试

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <h3>测试</h3>
    <a href="account/findAll">测试</a>
        <form action="account/save" method="post">
            姓名:<input type="text" name="name"><br>
            金额:<input type="text" name="money"><br>
            <input type="submit" value="保存">
        </form>
    </body>
    </html>
    

总结

归根到底我们要以Spring为核心对其他两个框架进行集成,如若上述测试都通过则代表你已经成功的整合了SSM环境,这时就可以进行项目的开发了。在此处我曾发生了一个让我抓狂的问题,就是在web.xml中将监听类写错了,导致我开启Tomcat时无法加载我的spring的配置文件,从而无法创建所有bean对象,所以一旦发生错误一定要好好看清配置文件是否有配错类,注解是否有漏加,这是典型的错误,毕竟人无完人,总有走神的时候,多加注意就好。

发布了15 篇原创文章 · 获赞 7 · 访问量 1915

猜你喜欢

转载自blog.csdn.net/weixin_40875853/article/details/104259354