关于SSM项目的整合
一、创建基于maven管理的SSM项目
点击下一步,修改项目名称,选择你自己的maven,点击完成即可。
二、配置tomcat
选择自己本机的tomcat,设置URL,可以加上项目名称,也可以选择不加,选择JRE。
选择exploded结尾。
修改应用程序上下文,然后应用确定。tomcat就布置好了。
此时就可以先运行一下,看能不能访问到index.jsp页面。可以的话就没问题了。
三、配置pom文件
导入项目所需要的依赖。一般都是在Maven的中央仓库里找你所需要的依赖。一个一个导入,但是这种方法很慢。一般都是找你之前的项目的pom文件,将一些基本的复制过来,如果你这个项目有啥特殊需求,需要用到特殊的依赖,再去中央仓库导入即可。
以下是我的一个简单SSM项目所需要的依赖
<?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.qcby</groupId>
<artifactId>springMVCDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<!-- Spring 核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.23</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.23</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.23</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.23</version>
</dependency>
<!-- MyBatis 依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
<!-- 数据库连接池依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.11</version>
</dependency>
<!-- JDBC 驱动依赖,以 MySQL 为例 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<!-- Servlet API 和 JSP API 依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<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</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- spring - jdbc依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.23</version>
</dependency>
</dependencies>
</project>
maven视图中的依赖项,可以查看你的依赖有没有全部导入进去。
四、 创建项目结构
如图就是经典的三层架构的项目结构
三层架构将应用程序划分为表示层(controller)、业务逻辑层(service)和数据访问层 (dao)
表示层
主要职责
- 用户交互界面设计:负责创建和展示用户与系统进行交互的界面,确保界面的友好性、易用性和美观性,提升用户体验。
- 接收用户输入:收集用户在界面上输入的各种数据,如表单信息、查询条件等,并将这些数据传递给业务逻辑层进行处理。
- 显示处理结果:将业务逻辑层处理后的数据以合适的形式展示给用户,如在网页上显示查询结果列表、在移动应用中展示统计图表等。
业务逻辑层
主要职责
- 实现业务规则:处理系统的核心业务逻辑,确保业务流程的正确性和一致性。例如,在电商系统中,处理订单的创建、支付、发货等业务流程。
- 调用数据访问层:根据业务需求,调用数据访问层的方法来获取或保存数据。例如,在用户登录业务中,调用数据访问层的方法查询用户信息。
- 事务管理:负责处理数据库事务,确保数据的一致性和完整性。例如,在转账业务中,保证转出和转入操作要么同时成功,要么同时失败。
- 数据验证和处理:对表示层传递过来的数据进行验证和处理,确保数据的合法性和有效性。例如,验证用户输入的邮箱格式是否正确。
数据访问层
主要职责
- 数据存储和读取:负责与数据库或其他数据存储系统进行交互,完成数据的增删改查等操作。例如,将用户注册信息插入到数据库中,从数据库中查询商品列表。
- 封装数据访问细节:将数据库的操作细节封装起来,为业务逻辑层提供统一的数据访问接口,使业务逻辑层无需关心数据的存储方式和具体实现。
- 提高数据访问性能:通过优化 SQL 语句、使用数据库连接池等方式提高数据访问的效率和性能。
五、web.xml文件,applicationContext,springmvc 文件的配置
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app
version="4.0"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:javaee="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd">
<display-name>Archetype Created Web Application</display-name>
<!-- 配置 Spring 上下文监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 配置 Spring MVC 前端控制器 -->
<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:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
Tomcat一启动,就开始加载web.xml文件。web.xml文件中主要用于配置和管理 Web 应用的行为和组件。这个 web.xml
文件的主要作用是在 Java Web 应用中集成 Spring 和 Spring MVC 框架。通过配置 ContextLoaderListener
加载 Spring 的根应用上下文,通过配置 DispatcherServlet
加载 Spring MVC 的应用上下文,并将所有的 HTTP 请求都交给 DispatcherServlet
处理,从而实现基于 Spring MVC 的 Web 应用开发。
applicantContext.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启组件扫描 -->
<context:component-scan base-package="com.qcby.service"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssmdemo"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- 配置 SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<!-- 配置 Mapper 扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.qcby.dao"/>
</bean>
</beans>
主要做的的是扫描service和dao层,另外连接数据库
springmvc
<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.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.xsd">
<!-- 开启组件扫描 -->
<context:component-scan base-package="com.qcby.controller"/>
<!-- 开启 Spring MVC 注解支持 -->
<mvc:annotation-driven/>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
主要做的是扫描Controller层,并开启注解扫描,配置视图解析器。
表现层代码
package com.qcby.controller;
import com.qcby.entity.Student;
import com.qcby.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.List;
@Controller
public class StudentController {
@Autowired
private StudentService studentService;
@GetMapping("/queryStudents")
public String queryStudents(Model model) {
List<Student> students = studentService.getAllStudent();
model.addAttribute("students", students);
return "index";
}
}
业务逻辑层
package com.qcby.service;
import com.qcby.entity.Student;
import java.util.List;
public interface StudentService {
List<Student> getAllStudent();
}
package com.qcby.service.Impl;
import com.qcby.dao.StudentDao;
import com.qcby.entity.Student;
import com.qcby.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentDao studentDao;
@Override
public List<Student> getAllStudent() {
return studentDao.getAllStudent();
}
}
数据处理层
package com.qcby.dao;
import com.qcby.entity.Student;
import java.util.List;
public interface StudentDao {
List<Student> getAllStudent();
}
六、总结
服务器启动阶段
- 启动 Web 服务器:启动如 Tomcat 这样的 Web 服务器。Tomcat 启动后会开始加载部署在其中的 Web 应用。
- 加载
web.xml
文件:Tomcat 会读取 Web 应用WEB - INF
目录下的web.xml
文件,该文件是 Web 应用的核心配置文件,包含了 Servlet、Filter、Listener 等组件的配置信息。 - 初始化 Spring 根应用上下文:
- 当 Tomcat 解析到
web.xml
中配置的ContextLoaderListener
时,它会触发该监听器的初始化操作。 ContextLoaderListener
会根据context - param
中配置的contextConfigLocation
参数(通常指向applicationContext.xml
文件),加载 Spring 的根应用上下文。这个上下文中会包含数据源、事务管理器、业务逻辑层(Service)等组件的配置。
- 当 Tomcat 解析到
- 初始化 Spring MVC 前端控制器
DispatcherServlet
:- Tomcat 继续解析
web.xml
中的<servlet>
标签,当遇到DispatcherServlet
的配置时,会根据init - param
中配置的contextConfigLocation
参数(通常指向springmvc.xml
文件),加载 Spring MVC 的应用上下文。 DispatcherServlet
是 Spring MVC 的核心组件,负责接收所有的 HTTP 请求,并将请求分发给相应的处理器进行处理。<load - on - startup>
参数指定了DispatcherServlet
的加载顺序,值越小,加载越早。
- Tomcat 继续解析
请求处理阶段
- 接收请求:当客户端(如浏览器)向 Web 应用发送 HTTP 请求时,请求会被发送到
DispatcherServlet
,因为web.xml
中通过<servlet - mapping>
标签将所有请求(url - pattern
为/
)都映射到了DispatcherServlet
上。 - 查找处理器映射:
DispatcherServlet
接收到请求后,会根据请求的 URL 调用处理器映射(Handler Mapping)来查找处理该请求的处理器(Handler)。处理器映射会根据springmvc.xml
中配置的映射规则,将请求 URL 映射到对应的控制器(Controller)方法上。 - 调用处理器适配器:找到处理器后,
DispatcherServlet
会调用处理器适配器(Handler Adapter)来执行处理器方法。处理器适配器负责将请求参数绑定到处理器方法的参数上,并调用处理器方法进行业务处理。 - 业务逻辑处理:处理器方法会调用业务逻辑层(Service)的方法进行具体的业务处理。业务逻辑层会根据需求调用数据访问层(DAO)的方法来获取或保存数据。
- 数据访问:数据访问层(DAO)会使用 MyBatis 来与数据库进行交互。MyBatis 会根据映射文件(
.xml
文件)或注解中的 SQL 语句,执行数据库操作,并将操作结果返回给业务逻辑层。 - 返回处理结果:业务逻辑层处理完业务后,会将处理结果返回给处理器方法。处理器方法会将结果封装成一个模型(Model),并返回一个视图名称(View Name)给
DispatcherServlet
。 - 视图解析:
DispatcherServlet
会根据视图名称调用视图解析器(View Resolver)来解析视图。视图解析器会根据springmvc.xml
中配置的解析规则,将视图名称解析为具体的视图对象(如 JSP、Thymeleaf 模板等)。 - 渲染视图:视图解析器将视图对象返回给
DispatcherServlet
后,DispatcherServlet
会将模型数据传递给视图对象,并调用视图对象的渲染方法,将数据填充到视图模板中,生成最终的 HTML 页面。 - 响应客户端:最后,
DispatcherServlet
将渲染好的 HTML 页面作为 HTTP 响应返回给客户端,客户端的浏览器会显示该页面。
服务器关闭阶段
- 销毁 Spring MVC 应用上下文:当 Tomcat 关闭时,会先销毁
DispatcherServlet
的应用上下文,释放相关的资源。 - 销毁 Spring 根应用上下文:接着,会销毁 Spring 的根应用上下文,释放所有在根上下文中配置的组件和资源。
- 关闭 Web 服务器:最后,Tomcat 完成资源的释放和清理工作,关闭服务器。