以SSM简单整合——Spring整合SpringMVC和SSM简单整合——Spring整合Mybatis为基础,实现项目的分模块构建。
将工程分为多个模块:例如把SSM工程拆分为Web、Service、Dao多个模块。各部分关系如下图:
继承: 继承是为了消除重复,如果将dao、service、web分开创建独立的工程,则每个工程的pom.xml文件中的内容存在重复,而继承可以将这些重复的配置提取出来放在父工程的pom.xml中
聚合: 项目开发通常是分组分模块开发,每个模块开发完成要运行整个工程需要将每个单独的模块聚合在一起运行。例如:将Dao、Service、Web三个模块打包成一个war运行。
示例工程
创建父工程
1.选择不适用骨架创建父工程
2.创建子模块(此处dao、service不可以不适用骨架,而web使用骨架创建)
dao子模块的创建
service子模块的创建
web子模块的创建
编写代码
在SSM_dao(dao)子模块中编写实体类以及持久层代码
package com.liang.domain;
import java.io.Serializable;
/**
* 账户实体类
*/
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 +
'}';
}
}
package com.liang.dao;
import com.liang.domain.Account;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* 账户的持久层接口
*/
@Repository(value = "accountDao")
public interface AccountDao {
/**
* 查询所有账户
* @return
*/
@Select("select * from account;")
List<Account> findAll();
/**
* 保存账户
*/
@Insert(" insert into account(name, money) values(#{name},#{money})")
void saveAccount(Account account);
}
编写持久层配置文件(applicationConfig-dao.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置数据库连接池-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///ssm?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="liang"/>
</bean>
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.liang.dao"></property>
</bean>
</beans>
在SSM_service(service)子模块中编写业务层代码
package com.liang.service;
import com.liang.domain.Account;
import java.util.List;
/**
* 账户的业务层接口
*/
public interface AccountService {
/**
* 查询所有账户
* @return
*/
public List<Account> findAll();
/**
* 保存账户
* @param account
*/
public void saveAccount(Account account);
}
package com.liang.service.impl;
import com.liang.dao.AccountDao;
import com.liang.domain.Account;
import com.liang.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 账户的业务层实现类
*/
@Service(value = "accountService")
public class AccountServiceImpl implements AccountService {
@Autowired
public AccountDao accountDao;
public List<Account> findAll(){
System.out.println("AccountServiceImpl ——> findAll方法执行了...");
return accountDao.findAll();
}
@Override
public void saveAccount(Account account) {
System.out.println("AccountServiceImpl ——> saveAccount方法执行了...");
accountDao.saveAccount(account);
}
}
编写业务层配置文件(applicationConfig-service.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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<!--配置需要扫描的包-->
<context:component-scan base-package="com.liang.service">
</context:component-scan>
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置事务的通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" read-only="false"/>
<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
<!--配置aop-->
<aop:config>
<!--配置切入点表达式-->
<aop:pointcut id="pt1" expression="execution(* com.liang.service.impl.*.*(..))"/>
<!--建立通知和切入点表达式的关系-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"/>
</aop:config>
</beans>
在SSM_web(web)子模块中编写表现层代码
package com.liang.controller;
import com.liang.domain.Account;
import com.liang.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
@Controller
@RequestMapping(path = "/SSMtest")
public class AccountController {
@Autowired
private AccountService accountService;
@RequestMapping(path = "/findAllAccount")
public ModelAndView findAllAccount(){
System.out.println("controller findAll方法执行了");
List<Account> accounts = accountService.findAll();
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("accounts",accounts);
modelAndView.setViewName("success");
return modelAndView;
}
@RequestMapping(path = "/saveAccount")
public String saveAccount(Account account){
System.out.println("controller findAll方法执行了");
accountService.saveAccount(account);
return "redirect:/SSMtest/findAllAccount";
}
}
编写表现层配置文件(springmvc.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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--配置需要扫描的包-->
<context:component-scan base-package="com.liang.controller"></context:component-scan>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
编写整合配置文件(applicationConfig.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="classpath:applicationConfig-dao.xml"></import>
<import resource="classpath:applicationConfig-service.xml"></import>
</beans>
编写web.xml文件
<!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>
<!--配置SpringMVC的核心控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置初始化参数:用于读取SpringMVC的配置文件-->
<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>
<!--配置SpringMVC编码过滤器-->
<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>
<!--配置spring的监听器:用于启动服务时加载容器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--指定spring配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationConfig.xml</param-value>
</context-param>
</web-app>
编写jsp页面(index.jsp和success.jsp)
index.jsp
<%@page contentType="text/html; charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<body>
<h2>账户操作</h2>
<a href="SSMtest/findAllAccount">查询所有账户</a><br/><br/><br/>
<form action="SSMtest/saveAccount" method="post">
姓名:<input type="text" name="name"><br/>
金额:<input type="text" name="money"><br/>
<input type="submit" value="保存"><br/>
</form>
</body>
</html>
WEB-INF/pages/success.jsp
<%@ 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>
执行成功!!!<br/><br/>
<c:forEach items="${accounts}" var="account">
<c:out value="${account.id}"></c:out>
<c:out value="${account.name}"></c:out>
<c:out value="${account.money}"></c:out><br/>
</c:forEach>
</body>
</html>
在父工程中导入jar包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.liang</groupId>
<artifactId>SSMTest_package</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>SSM_dao</module>
<module>SSM_service</module>
<module>SSM_web</module>
</modules>
<dependencies>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<!--springmvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<!--jstl-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
</dependencies>
</project>
也可以将jar包分别导入每个模块中,