前言
在看代码的过程中,经常会对项目的框架产生很多问题,比如不知道每个配置文件是干什么的。同时,也经常忘记一些名词的含义,比如Mapper,SSM是什么。所以这里来整理一下,方便未来忘记时查阅,同时也可以将新知识不断补充。
SSM框架
ssm指:Spring MVC + Spring + Mybatis,而Spring MVC = Model + View + Controller
先来看一下一个SSM例子的总体结构:

在Java源码包中,是很经典的三层结构:Controller+Service+DAO
resources包中,是各种组件的配置文件,包括spring的,mybatis的
spring配置文件这里写成好几个了,但是只是为了更职责分明,其实是可以直接全写到applicationContext里的。
WEB-INF包中,存有web.xml文件,这个很重要,里面包括了DispatcherServlet的声明,调用的过滤器,以及路由映射(不用注解时才有)。
这里有一点需要注意,mybatis相关的mapper.xml一般也放在resources里
各层职责
1、控制层(Controller)–Spring MVC
主要负责处理来自用户的HTTP请求,然后交给业务层处理。SpringMVC会根据URL映射将请求路由对应到相应的Controller方法。
2、业务层(Service)–Spring
通常负责处理具体的业务逻辑,一般会调用DAO层进行数据库操作。业务层与控制层是松耦合的,即控制层只调用业务层接口,而不是具体实现类。什么是松耦合后面会讲。
3、数据访问层(DAO)–Mybatis
Mybatis有两种方法实现SQL查询与Java方法相映射。(注意,这里是绑定Java方法,还有一种常用的数据查询方式是ORM,即直接将数据映射到对象,通过操作对象来实现SQL查询。)
一种是通过xml文件,另一种是通过注解
xml法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ssm_project.dao.BookMapper">
<select id="queryBookById" resultType="Books"> select * from ssmbuild.books where bookID = #{bookID} </select>
</mapper> package com.ssm_project.dao;
import com.ssm_project.pojo.Books;
import java.util.List;
public interface BookMapper { //根据id查询,返回一个Book Books queryBookById(String id);
}
|
注解法:
1 2 3 4 5 6 7 8 9
| @Mapper public interface StudentDAO {
@Select("SELECT * FROM students") List<Student> getAllStudents();
@Insert("INSERT INTO students(name, age) VALUES(#{name}, #{age})") void addStudent(Student student); }
|
4、模型层(Model)
这里就是常说的POJO,一般用来定义各种类,类字段对应数据库中的表字段
5、视图层(View)–SpringMVC+JSP
用于展示数据,在传统SSM中一般用JSP。
这里有一个Controller返回一个Model视图:
1 2 3 4 5 6 7 8
| @RequestMapping("/allBook") public ModelAndView list(Model model) { List<Books> list = bookService.queryAllBook(); ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("list",list); modelAndView.setViewName("allbooks"); return modelAndView; }
|
在这里就会对应allbooks.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <tbody> <c:forEach var="book" items="${requestScope.get('list')}"> <tr> <td>${book.getBookID()}</td> <td>${book.getBookName()}</td> <td>${book.getBookCounts()}</td> <td>${book.getDetail()}</td> <td> <a href="toUpdateBook?id=${book.getBookID()}">更改</a> | <a href="del/${book.getBookID()}">删除</a> </td> </tr> </c:forEach> </tbody>
|
为什么能对应到allbooks.jsp,这里要依赖spring配置文件:
1 2 3 4 5 6
| <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/view/" /> <property name="suffix" value=".jsp" /> </bean>
|
松耦合的解释
Controller层是直接调用Service接口,而不是具体实现类,那么它怎么知道要使用哪个实现类?
这里用到了Spring的依赖注入机制,它能够通过@Autowire注解来自动将具体实现类赋值给接口。当实现类唯一时,用@Autowire就够了,不然还需要使用@Qualifier(“BookServiceImpl”)来指定具体实现类。
1 2 3
| @Autowired @Qualifier("BookServiceImpl") private BookService bookService;
|
配置文件简介
Spring配置文件
1、命名空间和xml文件声明
这里告诉spring容器能够在配置文件里使用哪些标签,以及如何解析配置文件
1 2 3
| <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
|
第一行允许你通过bean标签定义bean
2、组件扫描
1
| <context:component-scan base-package="com.ssm_project.controller" />
|
这里会自动扫描包下带有@Controller等注解的类并自动注册为bean,这样就不需要手动通过bean标签配置了。这也是为什么可以直接通过@Autowired进行自动注入,因为相应的Service实现类已经被自动注册为Bean了。
3、数据源配置
这个对应上面实例项目中的spring-dao
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <context:property-placeholder location="classpath:database.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driver}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/>
<property name="maxPoolSize" value="30"/> <property name="minPoolSize" value="10"/> <property name="autoCommitOnClose" value="false"/> <property name="checkoutTimeout" value="10000"/> <property name="acquireRetryAttempts" value="2"/> </bean>
|
Spring会用这个数据源来管理数据库连接,同时注入到需要数据库连接的Bean中。
4、MyBatis配置
1 2 3 4
| <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis-config.xml" /> </bean>
|
这部分主要是指向上面的数据源配置,并导入mybatis的全局配置。
1 2 3 4 5 6 7 8
|
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> <property name="basePackage" value="com.ssm_project.dao"/> </bean>
|
这部分用于扫描Mapper接口。Mapper接口中的方法都会与SQL查询关联,这是mybatis的特点。
web.xml
1、DispatcherServlet
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <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:applicationContext.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>
|
DispatcherServlet是SpringMVC的核心组件,负责处理所有的HTTP请求,会根据请求调用Controller,并负责视图解析。
下面的URL映射代表将哪些请求交给SpringMVC处理。
2、filter
1 2 3 4 5 6 7 8 9
| <filter> <filter-name>XSSEscape</filter-name> <filter-class>com.ssm_project.filter.XssFilter</filter-class> </filter> <filter-mapping> <filter-name>XSSEscape</filter-name> <url-pattern>/*</url-pattern>
</filter-mapping>
|
这个跟Servlet里的filter一样。
MyBatis配置
首先要指定三件东西:Mapper接口,Mapper接口对应的xml,mybatis总配置的xml
Mapper接口:
1 2 3 4 5 6 7 8 9 10 11
| package com.ssm_project.dao;
import com.ssm_project.pojo.Books;
import java.util.List;
public interface BookMapper { Books queryBookById(String id);
}
|
Mapper接口对应的xml:
1 2 3 4 5 6 7 8 9 10 11 12
| <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ssm_project.dao.BookMapper"> <!--根据id查询,返回一个Book--> <select id="queryBookById" resultType="Books"> select * from ssmbuild.books where bookID = #{bookID} </select> </mapper>
|
mybatis总配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?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> <setting name="logImpl" value="STDOUT_LOGGING" /> </settings> <typeAliases> <package name="com.ssm_project.pojo"/> </typeAliases> <mappers> <mapper resource="com/ssm_project/dao/BookMapper.xml"/> </mappers>
</configuration>
|
最主要的就是要把BookMapper.xml注册到总配置里,当然也可以直接扫描包
1
| <package name="com.example.mapper" />
|
xml名称和Mapper接口的名称需要一致。
war包
SSM项目默认是打包成war包,需要放到tomcat容器里才能允许,idea里支持直接配置tomcat并运行。
SSH框架
即:Struct2+Spring+Hibernate
后面遇到具体例子再回来补
SpringBoot框架
这里目前没想到写什么,可能是还没遇到结构复杂的项目,之后来补充。