开发框架简述
1diot9 Lv4

前言

在看代码的过程中,经常会对项目的框架产生很多问题,比如不知道每个配置文件是干什么的。同时,也经常忘记一些名词的含义,比如Mapper,SSM是什么。所以这里来整理一下,方便未来忘记时查阅,同时也可以将新知识不断补充。

SSM框架

ssm指:Spring MVC + Spring + Mybatis,而Spring MVC = Model + View + Controller

先来看一下一个SSM例子的总体结构:

img

在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">

<!--根据id查询,返回一个Book-->
<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
<!-- 3.配置jsp 显示ViewResolver视图解析器 -->
<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
    <!-- 1.关联数据库文件 -->
<context:property-placeholder location="classpath:database.properties"/>

<!-- 2.数据库连接池 -->
<!--数据库连接池
dbcp 半自动化操作 不能自动连接
c3p0 自动化操作(自动的加载配置文件 并且设置到对象里面)
-->
<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}"/>

<!-- c3p0连接池的私有属性 -->
<property name="maxPoolSize" value="30"/>
<property name="minPoolSize" value="10"/>
<!-- 关闭连接后不自动commit -->
<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
<!-- 4.配置扫描Dao接口包,动态实现Dao接口注入到spring容器中 -->
<!--解释 : https://www.cnblogs.com/jpfss/p/7799806.html-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 给出需要扫描Dao接口包 -->
<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
<!--DispatcherServlet-->
<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>
<!-- <dispatcher>REQUEST</dispatcher>-->
</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 {
//根据id查询,返回一个Book
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框架

这里目前没想到写什么,可能是还没遇到结构复杂的项目,之后来补充。

由 Hexo 驱动 & 主题 Keep
本站由 提供部署服务
总字数 52.9k 访客数 访问量