SSM整合笔记

SpringMVC学习笔记(三)

ssm框架整合

使用Intelij Idear 进行ssm整合,javaweb项目通常采用三层架构,表现层、业务层、持久层,表现层对应的式SpringMVC框架、业务层对应的是Spring框架、持久层对应的是Mybatis框架。而业务层Spring框架是表现层和持久层中间不可缺少,所以通常是spring和springmvc整合,spring和mybatis整合。
整合我们可以使用xml的方式,也可以使用注解的方式。

整合思路

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

一、Spring整合

1、创建工程,选择maven的webapp工程
2、创建包结构
  • 在src目录下分别创建javaresource两个包,分别设置成根目录。
    image
  • 在java目录下我们根据三层架构创建包
    domain包下通常是实体类、javabean等
    dao包下是实体类的接口,通常是我们对SQL语句处理
    service包下是业务处理相关,包含接口和实现类,通常和业务逻辑相关
    controller包下是前端控制器,处理请求和页面跳转。
    test包下通常是我们的单元测试类
  • 创建一个Account
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 +
                '}';
    }
}
  • dao包下创建account接口,创建findAll()saveAccount方法
public interface AccountDao {
    //查询所有
    public List<Account> findAll();

    //保存账户
    public void saveAccount(Account account);
}

  • service包下创建AccountService接口,和impl.AccountServiceImpl实现类
public interface AccountService  {

    //查询所有
    public List<Account> findAll();

    //保存账户
    public void saveAccount(Account account);
}
public class AccountServiceImpl implements AccountService {
    @Override
    public List<Account> findAll() {
        System.out.println("业务层:查询所有账户");
        return null;
    }

    @Override
    public void saveAccount(Account account) {
        System.out.println("业务层:保存账户");
        accountDao.saveAccount(account);
    }
}

  • controller包下创建AccountController
3、在resource资源包下,我们创建spring的配置文件,取名applicationContext.xml

配置文件中添加约束

<?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:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       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/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

spring中业务层中由于使用注解开发,所以我们需要开启注解扫描,由于我们只希望处理service和dao,而Controller有SpringMVC框架帮我们处理,所以这里我们可以将Controller的注解过滤掉。

<!-- 开启注解扫描,希望处理service和dao,controller不需要处理 -->
    <context:component-scan base-package="com.fanyang">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

Spring框架这一步完成

二、springmvc框架整合

1、首先我们需要在web.xml中配置servlet前端控制器,在初始化中加载在springmvc的配置文件,代码如下:
<!-- 配置前端控制器 -->
  <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:springmvc.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>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>

  • 2、由于初始化加载了springmvc.xml文件,所以我们在resource目录下创建springmvc框架的配置文件:

设置约束

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.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.xsd">

开启注解的扫面,只需要扫面Controller注解,代码如下:

<!-- 开启注解扫描,只扫描Controller注解 -->
    <context:component-scan base-package="com.fanyang">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    
    <!-- 开启SpringMVC注解的支持 -->
    <mvc:annotation-driven></mvc:annotation-driven>

配置视图解析器

<!-- 配置视图解析器对象 -->
    <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>

过滤静态资源,由于Servlet会拦截所有的资源文件,所以在页面加载过程中需要过滤静态资源

<!-- 过滤静态资源 -->
    <mvc:resources location="/css/" mapping="/css/**"></mvc:resources>
    <mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
    <mvc:resources location="/images/" mapping="/images/**"></mvc:resources>
如何整合Spring和SpringMVC

我们在Controller中由于使用到了service层处理的数据,但是我们的applictionContext.xml文件并没有随着我们的服务器启动而加载,所以我们唯一要做的是,需要在服务启动后,我们的spring配置文件能够加载,这里就用到了spring-web这个jar包。

我们在启动tomcat服务器时,会创建一个ServletContext的唯一的域对象,这个对象随着服务器开启创建,随着服务器关闭消失,这一过程都是有一个监听器在操作,监听ServletContext域对象创建和销毁。所以我们可以使用监听器去加载Spring配置文件。

 <!-- 配置Spring的监听器 -->
  <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>

三、Mybatis配置

我们使用注解的方式配置Mybatis,在到dao接口方法中进行sql语句处理,查询和保存操作!

//查询所有
    @Select("select * from account")
    public List<Account> findAll();

    //保存账户
    @Insert("insert into account(name,money) values(#{name},#{money})")
    public void saveAccount(Account account);

service包下,进行业务处理相关代码

@Service("accountService")
public class AccountServiceImpl implements AccountService {

    @Autowired
    private AccountDao accountDao;

    @Override
    public List<Account> findAll() {
        System.out.println("业务层:查询所有账户");
        List<Account> accounts = accountDao.findAll();
        for (Account account : accounts) {
            System.out.println(account);
        }

        return accounts;
    }

    @Override
    public void saveAccount(Account account) {

        System.out.println("业务层:保存账户");

        accountDao.saveAccount(account);
    }
}

controller包下进行页面控制

@Controller
@RequestMapping("/account")
public class AccountController {

    @Autowired
    private AccountService accountService;

    @RequestMapping("/findAll")
    public String findAll(Model model){
        //调用业务层方法
        List<Account> list = accountService.findAll();
        model.addAttribute("list",list);
        return "success";
    }

    @RequestMapping("/save")
    public void save(Account account, HttpServletRequest request,
                     HttpServletResponse response) throws Exception {

        accountService.saveAccount(account);
        response.sendRedirect(request.getContextPath()+"/account/findAll");
    }

这里基本代码写完,如何进行spring和mybatis的整合
applicationContext.xml中进行配置

  • 配置数据库连接池:
<!-- 配置连接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl"
                  value="jdbc:mysql://localhost:3306/ssm?characterEncoding=utf8"/>
        <property name="user" value="root"/>
        <property name="password" value="1234"/>
    </bean>
  • 配置SqlSessionFactory,这里使用注解方式
<!-- 配置SqlSessionFactory工程 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
  • 扫描dao包,添加映射文件
<bean id="mapperScanner"
          class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.fanyang.dao"></property>
    </bean>
  • 配置事务相关
<!-- 配置Spring框架声明式事务管理 -->
    <!-- 配置事务管理器 -->
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- 配置事务通知-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="find*" read-only="true"/>
            <tx:method name="*" isolation="DEFAULT" />
        </tx:attributes>

    </tx:advice>
    <!-- 配置AOP增强 -->
    <aop:config>
        <aop:advisor advice-ref="txAdvice"
                     pointcut="execution(* com.fanyang.service.impl.*ServiceImpl.*(..))" />
    </aop:config>

mybatis和spring的整合完成

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容