注:此为笔者学习狂神说SpringMVC的笔记,其中包含个人的笔记和理解,仅做学习笔记之用,更多详细资讯请出门左拐B站:狂神说!!!
10、ssm整合
问了一下ChatGPT
SSM 是一个基于 Java 的开发框架整合,由 Spring、Spring MVC 和 MyBatis 三个开源框架组成。每个框架都有不同的职责和作用,通过整合,可以发挥各自的优势,形成一个完整的、高效的 Java 开发框架。
下面简要解释一下 SSM 各个组成部分的作用:
- Spring:
- 作用: 提供了一个轻量级的 IoC(控制反转)容器,用于管理应用组件的生命周期和配置。
- IoC容器: 负责创建对象、管理对象的依赖关系,实现了对象的松耦合。
- AOP(面向切面编程): 提供了面向切面编程的支持,可以方便地实现事务管理、日志记录等横切关注点。
- Spring MVC:
- 作用: 是一个基于 MVC 模式的 Web 框架,用于构建 Web 层的应用程序。
- 控制器层: 通过控制器(Controller)处理用户请求,将请求映射到相应的业务逻辑处理方法。
- 模型层: 通过模型(Model)将数据传递到视图层,与业务逻辑进行交互。
- 视图层: 通过视图(View)负责渲染页面,呈现给用户。
- MyBatis:
- 作用: 是一个持久层框架,用于简化数据库操作和 SQL 查询的编写。
- ORM(对象关系映射): 将数据库表映射为 Java 对象,通过配置文件或注解实现对象与数据库表之间的映射关系。
- SQL映射: 提供了 XML 文件或注解的方式定义 SQL 查询,可以更灵活地进行数据库操作。
- 缓存: 支持缓存机制,提高数据库查询性能。
综合起来,SSM 框架整合了 Spring 的 IoC 和 AOP 特性,Spring MVC 的 Web 层框架,以及 MyBatis 的持久层框架,使得开发者能够更方便地进行企业级 Java 应用的开发。通过配置文件和注解,可以实现各层之间的松耦合,提高代码的可维护性和可扩展性。整合后,Spring 处理业务逻辑和控制反转,Spring MVC 处理 Web 层,MyBatis 处理数据库交互,形成一个完整的、分层清晰的应用架构。
1、环境要求
环境:
- IDEA
- MySQL 5.7.19
- Tomcat 9
- Maven 3.6
要求:
- 需要熟练掌握MySQL数据库,Spring,JavaWeb及MyBatis知识,简单的前端知识;
2、数据库环境
创建一个存放书籍数据的数据库表
CREATE DATABASE `ssmbuild`;USE `ssmbuild`;DROP TABLE IF EXISTS `books`;CREATE TABLE `books` (`bookID` INT(10) NOT NULL AUTO_INCREMENT COMMENT '书id',`bookName` VARCHAR(100) NOT NULL COMMENT '书名',`bookCounts` INT(11) NOT NULL COMMENT '数量',`detail` VARCHAR(200) NOT NULL COMMENT '描述',KEY `bookID` (`bookID`)) ENGINE=INNODB DEFAULT CHARSET=utf8INSERTINTO `books`(`bookID`,`bookName`,`bookCounts`,`detail`)VALUES(1,'Java',1,'从入门到放弃'),(2,'MySQL',10,'从删库到跑路'),(3,'Linux',5,'从进门到进牢');
3、基本环境搭建
1、新建一Maven项目!ssmbuild , 添加web的支持
2、导入相关的pom依赖!
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.1.9.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.1.9.RELEASE</version> </dependency></dependencies>
3、Maven资源过滤设置
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources></build>
4、建立基本结构和配置框架!
- com.kuang.pojo
- com.kuang.dao
声明扫描xml文件,将xml和mapper绑定起来
- com.kuang.service
- com.kuang.controller
- mybatis-config.xml
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration></configuration>
- applicationContext.xml
<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 http://www.springframework.org/schema/beans/spring-beans.xsd"></beans>
5、Mybatis层编写
1、数据库配置文件 database.properties
2、IDEA关联数据库
3、编写MyBatis的核心配置文件
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><typeAliases> <package name="com.kuang.pojo"/> </typeAliases> <mappers> <mapper resource="com/kuang/dao/BookMapper.xml"/> </mappers></configuration>
4、编写数据库对应的实体类 com.kuang.pojo.Books
使用lombok插件!
package com.kuang.pojo;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@AllArgsConstructor@NoArgsConstructorpublic class Books {private int bookID; private String bookName; private int bookCounts; private String detail; }
5、编写Dao层的 Mapper接口!
package com.kuang.dao;import com.kuang.pojo.Books;import java.util.List;public interface BookMapper { //增加一个Book int addBook(Books book); //根据id删除一个Book int deleteBookById(int id); //更新Book int updateBook(Books books); //根据id查询,返回一个Book Books queryBookById(int id); //查询全部Book,返回list集合 List<Books> queryAllBook();}
6、编写接口对应的 Mapper.xml 文件。需要导入MyBatis的包;
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.kuang.dao.BookMapper"> <insert id="addBook" parameterType="Books">insert into ssmbuild.books(bookName,bookCounts,detail)values (#{bookName}, #{bookCounts}, #{detail}) </insert> <delete id="deleteBookById" parameterType="int">delete from ssmbuild.books where bookID=#{bookID} </delete> <update id="updateBook" parameterType="Books">update ssmbuild.booksset bookName = #{bookName},bookCounts = #{bookCounts},detail = #{detail}where bookID = #{bookID} </update> <select id="queryBookById" resultType="Books">select * from ssmbuild.bookswhere bookID = #{bookID} </select> <select id="queryAllBook" resultType="Books">SELECT * from ssmbuild.books </select></mapper>
7、编写Service层的接口和实现类
接口:
package com.kuang.service;import com.kuang.pojo.Books;import java.util.List;//BookService:底下需要去实现,调用dao层public interface BookService { //增加一个Book int addBook(Books book); //根据id删除一个Book int deleteBookById(int id); //更新Book int updateBook(Books books); //根据id查询,返回一个Book Books queryBookById(int id); //查询全部Book,返回list集合 List<Books> queryAllBook();}
实现类:
package com.kuang.service;import com.kuang.dao.BookMapper;import com.kuang.pojo.Books;import java.util.List;public class BookServiceImpl implements BookService { //调用dao层的操作,设置一个set接口,方便Spring管理 private BookMapper bookMapper; public void setBookMapper(BookMapper bookMapper) { this.bookMapper = bookMapper;}public int addBook(Books book) { return bookMapper.addBook(book);}public int deleteBookById(int id) { return bookMapper.deleteBookById(id);}public int updateBook(Books books) { return bookMapper.updateBook(books);}public Books queryBookById(int id) { return bookMapper.queryBookById(id);}public List<Books> queryAllBook() { return bookMapper.queryAllBook();}}
6、Spring层
1、配置Spring整合MyBatis,我们这里数据源使用c3p0连接池;
2、我们去编写Spring整合Mybatis的相关的配置文件;spring-dao.xml
<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 https://www.springframework.org/schema/context/spring-context.xsd"> <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> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> <property name="basePackage" value="com.kuang.dao"/> </bean></beans>
3、Spring整合service层
理解applicationContext.xml、spring-dao、spring-service这些配置文件的关系,和融合起来的起的作用,或者直接让spring托管就可以了
<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.kuang.service" /> <bean id="BookServiceImpl" class="com.kuang.service.BookServiceImpl"> <property name="bookMapper" ref="bookMapper"/> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean></beans>
7、SpringMVC层
1、web.xml
spring-mvc.xml
dao层、service层、mvc层整合起来
<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 http://www.springframework.org/schema/beans/spring-beans.xsd"> <import resource="spring-dao.xml"/> <import resource="spring-service.xml"/> <import resource="spring-mvc.xml"/> </beans>
springmvc层的所有的请求都被这个dispatchServlet核心分发器接管了
有错误的:dispatchServlet绑定核心配置文件的时候,只绑定了mvc层的配置文件,dao、service层的没有绑定起来,应该改为三层:mvc层、dao、service层都绑定给applicationContext.xml,交由spring托管的applicationContext.xml,才算把所有的bean都注入spring统一托管
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"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"version="4.0"> <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> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter </filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <session-config> <session-timeout>15</session-timeout> </session-config> </web-app>
2、spring-mvc.xml
<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:mvc="http://www.springframework.org/schema/mvc"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 http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <mvc:annotation-driven /> <mvc:default-servlet-handler/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> <context:component-scan base-package="com.kuang.controller" /></beans>
小结1
dao层、service层、mvc层这三个框架都是通过spring整合到一起的,这些都是框架的底层,以后写轻量级项目的基础,一定要保留下来
8、Controller 和 视图层编写
1、BookController 类编写 , 方法一:查询全部书籍
简易的的jsp页面,先测试跳转成功与否,再往下做
首页使用绝对地址
2、排除bean注入的错误
思路:
①使用单元测试底层能否查出bean是否注入的问题
结果是可以的,因为底层applicationContext.xml把三层:dao层、service层、mvc层都注入绑定在一起了,所以说明底层没有事,是springmvc整合出的问题
由于springmvc整合applicationContext出了问题,所以applicationContext整合三层也会出现bean没法注入的问题
②真正原因:springmvc整合applicationContext出了问题
有错误的:dispatchServlet绑定核心上下文配置文件的时候,只绑定了mvc层的配置文件,dao、service层的没有绑定起来,应该改为applicationContext.xml,因为三层:mvc层、dao、service层都绑定给applicationContext.xml,交由spring托管的applicationContext.xml,才算把所有的bean都注入spring统一托管
修改过来即可
结果:
小结2
从以上错误中,理解spring是如何通过绑定applicationContext.xml(绑定了三层:mvc层、dao、service层),来托管三层的,管理和注入bean的
3.编写首页 index.jsp
首页 a { text-decoration: none; color: black; font-size: 18px;} h3 { width: 180px; height: 38px; margin: 100px auto; text-align: center; line-height: 38px; background: deepskyblue; border-radius: 4px;} 点击进入列表页
4、 书籍列表页面 allbook.jsp
效果:
书籍列表 书籍列表 —— 显示所有书籍
新增 书籍编号 书籍名字 书籍数量 书籍详情 操作 ${book.getBookID()} ${book.getBookName()} ${book.getBookCounts()} ${book.getDetail()} 更改 | 删除
5、BookController 类编写 , 方法二:添加书籍
@RequestMapping("/toAddBook")public String toAddPaper() { return "addBook";}@RequestMapping("/addBook")public String addPaper(Books books) { System.out.println(books); bookService.addBook(books); return "redirect:/book/allBook";}
6、 添加书籍页面:addBook.jsp
新增书籍 新增书籍
书籍名称:
书籍数量:
书籍详情:
7、BookController 类编写 , 方法三:修改书籍
结果:
8、添加事务支持
在spring-service.xml中添加aop事务支持
导入jar包,还要往WEB-INF中导入,注意生成文件中可能没有也会报错
9、隐藏域ID的问题
添加隐藏域
显而易见是sql出现了问题,这里可以配置日志输出方式,让SQL输出日志更清晰,更容易判断出错的地方
10、 修改书籍页面 updateBook.jsp
修改信息 修改信息
书籍名称:书籍数量:书籍详情:
11、BookController 类编写 , 方法四:删除书籍
@RequestMapping("/del/{bookId}")public String deleteBook(@PathVariable("bookId") int id) { bookService.deleteBookById(id); return "redirect:/book/allBook";}
使用RestFul风格
配置Tomcat,进行运行!
到目前为止,这个SSM项目整合已经完全的OK了,可以直接运行进行测试!这个练习十分的重要,大家需要保证,不看任何东西,自己也可以完整的实现出来!
12、搜索图书
1、前端
2、controller
3、设置接口方法
4、xml配置SQL
5、添加业务
6、改进controller
7、修改前端
8、前端可视化
SpringMVC学习与开发(三)的学习笔记到此完结,笔者归纳、创作不易,大佬们给个3连再起飞吧