当前位置: 首页 > article >正文

关于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();
}

六、总结

服务器启动阶段

  1. 启动 Web 服务器:启动如 Tomcat 这样的 Web 服务器。Tomcat 启动后会开始加载部署在其中的 Web 应用。
  2. 加载 web.xml 文件:Tomcat 会读取 Web 应用 WEB - INF 目录下的 web.xml 文件,该文件是 Web 应用的核心配置文件,包含了 Servlet、Filter、Listener 等组件的配置信息。
  3. 初始化 Spring 根应用上下文
    • 当 Tomcat 解析到 web.xml 中配置的 ContextLoaderListener 时,它会触发该监听器的初始化操作。
    • ContextLoaderListener 会根据 context - param 中配置的 contextConfigLocation 参数(通常指向 applicationContext.xml 文件),加载 Spring 的根应用上下文。这个上下文中会包含数据源、事务管理器、业务逻辑层(Service)等组件的配置。
  4. 初始化 Spring MVC 前端控制器 DispatcherServlet
    • Tomcat 继续解析 web.xml 中的 <servlet> 标签,当遇到 DispatcherServlet 的配置时,会根据 init - param 中配置的 contextConfigLocation 参数(通常指向 springmvc.xml 文件),加载 Spring MVC 的应用上下文。
    • DispatcherServlet 是 Spring MVC 的核心组件,负责接收所有的 HTTP 请求,并将请求分发给相应的处理器进行处理。<load - on - startup> 参数指定了 DispatcherServlet 的加载顺序,值越小,加载越早。

请求处理阶段

  1. 接收请求:当客户端(如浏览器)向 Web 应用发送 HTTP 请求时,请求会被发送到 DispatcherServlet,因为 web.xml 中通过 <servlet - mapping> 标签将所有请求(url - pattern 为 /)都映射到了 DispatcherServlet 上。
  2. 查找处理器映射DispatcherServlet 接收到请求后,会根据请求的 URL 调用处理器映射(Handler Mapping)来查找处理该请求的处理器(Handler)。处理器映射会根据 springmvc.xml 中配置的映射规则,将请求 URL 映射到对应的控制器(Controller)方法上。
  3. 调用处理器适配器:找到处理器后,DispatcherServlet 会调用处理器适配器(Handler Adapter)来执行处理器方法。处理器适配器负责将请求参数绑定到处理器方法的参数上,并调用处理器方法进行业务处理。
  4. 业务逻辑处理:处理器方法会调用业务逻辑层(Service)的方法进行具体的业务处理。业务逻辑层会根据需求调用数据访问层(DAO)的方法来获取或保存数据。
  5. 数据访问:数据访问层(DAO)会使用 MyBatis 来与数据库进行交互。MyBatis 会根据映射文件(.xml 文件)或注解中的 SQL 语句,执行数据库操作,并将操作结果返回给业务逻辑层。
  6. 返回处理结果:业务逻辑层处理完业务后,会将处理结果返回给处理器方法。处理器方法会将结果封装成一个模型(Model),并返回一个视图名称(View Name)给 DispatcherServlet
  7. 视图解析DispatcherServlet 会根据视图名称调用视图解析器(View Resolver)来解析视图。视图解析器会根据 springmvc.xml 中配置的解析规则,将视图名称解析为具体的视图对象(如 JSP、Thymeleaf 模板等)。
  8. 渲染视图:视图解析器将视图对象返回给 DispatcherServlet 后,DispatcherServlet 会将模型数据传递给视图对象,并调用视图对象的渲染方法,将数据填充到视图模板中,生成最终的 HTML 页面。
  9. 响应客户端:最后,DispatcherServlet 将渲染好的 HTML 页面作为 HTTP 响应返回给客户端,客户端的浏览器会显示该页面。

服务器关闭阶段

  1. 销毁 Spring MVC 应用上下文:当 Tomcat 关闭时,会先销毁 DispatcherServlet 的应用上下文,释放相关的资源。
  2. 销毁 Spring 根应用上下文:接着,会销毁 Spring 的根应用上下文,释放所有在根上下文中配置的组件和资源。
  3. 关闭 Web 服务器:最后,Tomcat 完成资源的释放和清理工作,关闭服务器。

http://www.kler.cn/a/568629.html

相关文章:

  • 3.jvm的执行流程
  • 搭建基于Agent的金融问答系统
  • 安当防火墙登录安全解决方案:零信任认证+国密证书+动态口令构建全方位身份安全屏障
  • iOS 实现UIButton自动化点击埋点
  • 从人口焦虑到科技破局:新生人口减少不再是难题,未来社会已悄然蜕变
  • Mysql的索引失效
  • 数据库拓展操作
  • Vim 常用快捷键大全:跳转、编辑、查找替换全解析
  • 委托者模式(掌握设计模式的核心之一)
  • 华为手机自助维修的方法
  • Memcached监控本机内存(比redis速度更快)
  • C++编程指南21 - 线程detach后其注意变量的生命周期
  • leetcode第77题组合
  • next.js-学习4
  • 蓝桥杯 6.数学
  • 基于springboot+vue的线上考试系统的设计与实现
  • 在 Ubuntu 下通过 Docker 部署 Caddy 和 PHP-FPM 服务器
  • Java—锁—等待唤醒机制
  • 随机树算法 自动驾驶汽车的路径规划 静态障碍物(Matlab)
  • thinkphp6-使用psubscribe进行redis的注意callback中使用redis