SSM整合
什么是SSM
即Spring,SpringMVC,Mybatis三大框架整合在一起的技术。
整合的思路
- 搭建整合的环境
- 先把spring的配置搭建好
- 再使用spring整合SpringMVC框架
- 最后再使用Spring整合Mybatis框架
整合步骤
-
创建一个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>
-
编写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>
-
编写java代码
-
业务层
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("业务层:保存帐户..."); } }
-
持久层
/** * 帐户dao接口 */ public interface AccountDao { // 查询所有账户 public List<Account> findAll(); // 保存帐户信息 public void saveAccount(Account 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 + '}'; } }
-
-
编写测试类,测试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()); } }
-
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>
-
编写SpringMVC配置文件
<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>
-
编写控制层代码
/** * 帐户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"; } }
-
编写前端页面,并开启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>
-
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); }
-
在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>
-
修改前端页面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>
-
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>
-
在控制层添加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"); }
-
修改前端页面,并开启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对象,所以一旦发生错误一定要好好看清配置文件是否有配错类,注解是否有漏加,这是典型的错误,毕竟人无完人,总有走神的时候,多加注意就好。