SSM框架整合笔记

最近学习了SSM框架,特地整理出了三大框架整合的笔记,以便以后学习。整合的时候也踩了些坑,都记录在文章末尾,大家如果遇到同样的错误,可以参考。


首先是SSM系统架构图

在这里插入图片描述



整合思路

1. 整合dao层
	* mybatis与spring整合,使用spring管理mapper接口
	* 使用mapper的扫描前自动扫描mapper接口在spring中注册
	<br>
2. 整合service层
	- 使用spring管理 service 接口
	* 使用配置方式将service接口配置在spring配置文件中
	* 实现事物控制
	<br>
3. 整合SpringMVC
	* 是Spring的模块,不需要整合


开发环境

  • jdk:1.8
  • 编译器:IDEA
  • 数据库MySQL


整合步骤

1. 创建项目,设置好目录结构

  • 参考另外一篇博客:链接


2. 分包:分好包后的目录结构如下

	~controller		(控制层)
	~service.impl		(接口包)
	~dao			(mapper.java。逆向工程出来的)
	~pojo			(逆向工程出来的pojo类)
	~mapper		(mapper.xml。逆向工程出来的mapper.xml)
	~util				(工具包)
	~test			(测试包)

在这里插入图片描述

3. 创建配置文件

	log4j.properties	(日志框架文件):内容如下
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

db.properties	(数据库配置文件):内容如下
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/databasesname
jdbc.username=username
jdbc.password=password
#定义最大连接数
jdbc.maxActive=20
#定义最大空闲
jdbc.maxIdle=20
#定义最小空闲
jdbc.minIdle=1
#定义最长等待时间
jdbc.maxWait=60000

文件的位置如下图:



4. 在pom.xml文件中声明依赖的jar包,内容如下:

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
  <spring.version>5.0.2.RELEASE</spring.version>
  <slf4j.version>1.6.6</slf4j.version>
  <log4j.version>1.2.12</log4j.version>
  <mysql.version>5.1.6</mysql.version>
  <mybatis.version>3.4.5</mybatis.version>
</properties>


<dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <!-- 表示开发的时候引入,发布的时候不会加载此包 -->
            <scope>test</scope>
        </dependency>


        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.2.4.Final</version>
        </dependency>

        <!-- spring核心包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</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-oxm</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-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</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-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- mybatis核心包 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <!-- mybatis/spring包 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.2.2</version>
        </dependency>
        <!-- 导入java ee jar 包 -->
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
        </dependency>
        <!-- 导入Mysql数据库链接jar包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.30</version>
        </dependency>
        <!-- 导入dbcp的jar包,用来在applicationContext.xml中配置数据库 -->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.2.2</version>
        </dependency>
        <!-- JSTL标签类 -->
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- 日志文件管理包 -->
        <!-- log start -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>


        <!-- 格式化对象,方便输出日志 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.1.41</version>
        </dependency>


        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <!-- log end -->
        <!-- 映入JSON -->
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>

        <!-- AOP -->
        <dependency>
            <groupId>org.apache.geronimo.bundles</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.8_2</version>
        </dependency>

        <!-- 上传组件包 -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.9</version>
        </dependency>


5. Spring与Mybatis整合(整合好后需要测试)

创建sqlMapConfig.xml:根据需要添加设置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!-- 全局settings,根据需要添加 -->

</configuration>

创建applicationContext.xml

  • 设置数据源
  • 设置SqlSessionFactory
  • 设置mapper扫描器
<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
		http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <context:component-scan base-package="ssm"/>

    <!-- 数据库文件 -->
    <context:property-placeholder location="classpath:db.properties"/>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <!--配置数据库源-->
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="maxActive" value="${jdbc.maxActive}"/>
        <property name="maxIdle" value="${jdbc.maxIdle}"/>
        <property name="minIdle" value="${jdbc.minIdle}"/>
        <property name="maxWait" value="${jdbc.maxWait}"/>
    </bean>

    <!-- SqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 数据源 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- mybatis配置文件位置 -->
        <property name="configLocation" value="classpath:mybatis/sqlMapConfig.xml"/>
        <!-- mapper.xml文件位置-->
        <property name="mapperLocations" value="classpath:ssm/mapper/*.xml"/>
    </bean>
    
	<!-- 扫描Dao接口 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="ssm.dao"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>

到这里Spring和Mybatis已经整合完成,测试结果也是没问题的。
在这里插入图片描述
TIPS:这里的素材是博主学习视频中的素材,如果需要的话可以通过这个链接去获取:资源点我!,这里的素材也就是项目中用的Mapper.java和Mapper.xml文件。



6. 接下来整合Service和Spring

  1. 将Service接口使用Spring来管理
  • 只需在Service接口实现类上标记@Service标签即可
  1. 在Spring的配置文件中添加事物控制:
<!-- 事务管理器 -->
    <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="save*" propagation="REQUIRED"/>
            <tx:method name="insert*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
        </tx:attributes>
    </tx:advice>

    <!-- 切面 -->
    <aop:config>
        <aop:advisor advice-ref="txAdvice"
                     pointcut="execution(* ssm.service.impl.*.*(..))"/>
    </aop:config>

到这里,Service和Spring就算是整合好了。同样,我们来进行一下测试。



7. 配置SpringMVC所需的配置文件

  1. 配置处理器映射器和处理器适配器(使用mvc:annotation-driver标签即可)
  2. 配置视图解析器
<!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- jsp路径前缀 -->
        <property name="prefix" value="/WEB-INF/jsp"/>
        <!-- jsp路径后缀 -->
        <property name="suffix" value=".jsp"/>
    </bean>
  1. 在web.xml文件中配置前端控制器
 <!--SpringMvc前端控制器-->
    <servlet>
        <servlet-name>springMvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/springmvc.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>springMvc</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
  1. 编写Handler
@Controller
@RequestMapping(value = "/items")
public class ItemsController {

    @Autowired
    private ItemsService itemsService;

    @RequestMapping(value = "/findItemsList", method = {RequestMethod.GET, RequestMethod.POST})
    public ModelAndView finItemsList(ItemsQueryVo itemsQueryVo) throws Exception {

        List<ItemsCustom> itemsList = itemsService.findItemsList(itemsQueryVo);

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("itemsList", itemsList);
        modelAndView.setViewName("/itemsList");

        return modelAndView;

    }
}
  1. 编写JSP页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>查询商品列表</title>
    <script type="text/javascript">
        function deleteItems() {
            //提交form
            document.itemsForm.action = "${pageContext.request.contextPath }/items/deleteItems.action";
            document.itemsForm.submit();
        }

        function queryItems() {
            //提交form
            document.itemsForm.action = "${pageContext.request.contextPath }/items/queryItems.action";
            document.itemsForm.submit();
        }
    </script>
</head>
<body>
当前用户:${username }<c:if test="${username!=null }">
    <a href="${pageContext.request.contextPath }/logout.action">退出</a>
</c:if>
<form name="itemsForm" action="${pageContext.request.contextPath }/items/queryItems.action" method="post">
    查询条件:
    <table width="100%" border=1>
        <tr>
            <td>商品名称:<input name="itemsCustom.name"/>
                商品类型:
                <select name="itemtype">
                    <c:forEach items="${itemsTypes }" var="type">
                        <option value="${type.key }">${type.value }</option>
                    </c:forEach>
                </select></td>
            <td>
                <input type="button" value="查询" onclick="queryItems()"/>
                <input type="button" value="批量删除" onclick="deleteItems()"/>
            </td>
        </tr>
    </table>
    商品列表:
    <table width="100%" border=1>
        <tr>
            <td>选择</td>
            <td>商品名称</td>
            <td>商品价格</td>
            <td>生产日期</td>
            <td>商品描述</td>
            <td>操作</td>
        </tr>

        <c:forEach items="${itemsList}" var="item">
            <tr>
                <td><input type="checkbox" name="items_id" value="${item.id}"/></td>
                <td>${item.name }</td>
                <td>${item.price }</td>
                <td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
                <td>${item.detail }</td>
                <td><a href="${pageContext.request.contextPath}/items/editItems.action?id=${item.id}">修改</a></td>
            </tr>
        </c:forEach>

    </table>
</form>
</body>

</html>
  1. 在web.xml中启动Spring容器
	 <!-- 加载spring容器 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
  1. 部署到Tomcat运行测试:可以从数据库从拿到结果[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4ez4Y9ln-1635267879950)(http://note.youdao.com/yws/res/5510/DBE268688B9542DD85A60B971F07DBFD)]
    在这里插入图片描述

到这里,SSM框架的整合也就算结束了,如果有什么不对的地方欢迎大家指正。在整合时也遇到了许多问题。
  1. 包建错:IDEA中建包需要小心,IDEA可能会自动将你的包合并,在service和service.impl哪里容易出错。
  2. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):大概的意思就是找不到maper.xml文件,这个问题可以参考这篇文章,解释的很详细。—看文章点我—。需要在Maven中添加插件,插件如下:
<plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>2.6</version>
                    <executions>
                        <execution>
                            <id>copy-xmls</id>
                            <phase>process-resources</phase>
                            <goals>
                                <goal>copy-resources</goal>
                            </goals>
                            <configuration>
                                <outputDirectory>${basedir}/target/classes</outputDirectory>
                                <resources>
                                    <resource>
                                        <directory>${basedir}/src/main/java</directory>
                                        <includes>
                                            <include>**/*.xml</include>
                                        </includes>
                                    </resource>
                                </resources>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>

或者加入以下代码:(还有一种办法就是将mapper文件放入resources文件夹中)

<resources>
            <!-- maven项目中src源代码下的xml等资源文件编译进classes文件夹,
                注意:如果没有这个,它会自动搜索resources下是否有mapper.xml文件,
                如果没有就会报org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.pet.mapper.PetMapper.selectByPrimaryKey-->
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>

            <!--将resources目录下的配置文件编译进classes文件  -->
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
  1. 404问题:造成404的情况有很多
  • <context:component-scan base-package = “”/> 标签不能放到applicationContext.xml文件下,不然会扫描不到Controller类(这个问题困扰了很久!!!)
  • 没有写RequestMapping
  • 浏览器地址写错
  • 前端控制器的url-pattern属性设置错误(不能设置为" / ")
  1. 使用了错误的类来 @Autowired
 比如应该
	@Autowired
	ItemsService itemsService
	
写成
	@Autowired
	ItemsServiceImpl itemsServiceImpl
  1. 测试的时候applicationContext.xml文件中没配置<context:component-scan base-package=“ssm”/>标签导致找不到Bean

TIPS:这里之所以整合好一个以后就测试是因为第一次自己整合,怕完全整合后出了问题太难找出来,所以就整合好一层就测试一次。


最后给大家附上这个项目的源码,大家需要的可以去下载:链接,数据库文件也在里边。
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴能回答你关于黑马程序员SSM框架笔记的问题!SSM框架是指Spring + SpringMVC + MyBatis的组合,它们分别是Java开发中常用的三个主流框架。下面是一些关于SSM框架的基本笔记: 1. Spring框架:Spring是一个轻量级的JavaEE开发框架,它提供了很多功能,包括依赖注入、面向切面编程、事务管理等。使用Spring可以简化开发过程,提高代码的可维护性和可测试性。 2. SpringMVC框架:SpringMVC是Spring框架的一部分,它是一个基于MVC(Model-View-Controller)模式的Web框架。SpringMVC提供了很多特性,如请求映射、数据绑定、视图解析等,使得开发Web应用更加简单和灵活。 3. MyBatis框架:MyBatis是一个持久层框架,它提供了对数据库的访问和操作。MyBatis使用简单的XML或注解来配置SQL语句,并提供了很多数据库操作的方法,使得开发数据访问层更加方便。 4. SSM整合配置:在使用SSM框架时,需要将Spring、SpringMVC和MyBatis进行整合。一般来说,可以通过Spring的配置文件将它们整合在一起,配置数据源、事务管理、扫描包等。 5. 常用注解:在SSM框架中,有很多常用的注解可以使用。例如,@Controller用于标识一个控制器类,@RequestMapping用于映射请求路径和处理方法等。 以上是一些关于黑马程序员SSM框架的基本笔记,希望能对你有所帮助!如果你有任何其他问题,欢迎继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值