Spring全家桶|【SpringMVC】学习总结(一篇就够了)


文章目录

  • 一、什么是 MVC?
    • 1.1 什么是 MVC?
    • 1.2 Model、View、Controller
    • 1.3 MVC 架构要做哪些事?
    • 1.4 基于 Servlet 的 MVC 流程模型
  • 二、什么是 Spring MVC?
    • 2.1 概述:
    • 2.2 Spring MVC 有什么特点?为什么要学?
    • 2.3 中心控制器
    • 2.3 Spring MVC 原理
    • 2.4 Spring MVC 执行原理
  • 三、RestFul 和控制器
    • 3.1 什么是控制器(Controller)?
    • 3.2 实现 Controller 接口
    • 3.3 MVC 程序:
    • 3.4 注解版
  • 四、数据处理和跳转
    • 4.1 结果跳转方式
      • 4.1.1 ModelAndView
      • 4.1.2 ServletAPI
      • 4.1.3 SPringMVC
    • 4.2 数据处理
      • 4.2.1 处理提交数据
      • 4.2.2 数据显示传到前端
  • 四、数据处理和跳转
    • 4.1 结果跳转方式
      • 4.1.1 ModelAndView
      • 4.1.2 ServletAPI
      • 4.1.3 SPringMVC
    • 4.2 数据处理
      • 4.2.1 处理提交数据
      • 4.2.2 数据显示传到前端
  • 五、整合 SSM 框架
    • 5.1 搭建数据库环境
      • 5.2 基本环境搭建
    • 5.2 Mybatis 层编写
    • 5.3 编写数据库对应的实体类 com.si.pojo.Books
    • 5.4 编写 Dao 层的 Mapper 接口
    • 5.5 编写对应的 Mapper.xml 文件。需要导入 MyBatis 的包。
    • 5.6 编写 Service 接口 和 实现类
    • 5.7 Spring 层
    • 5.8 springMVC层
    • 5.9 BookController 类编写
    • 5.10 配置 tomcat
    • 5.11 测试

一、什么是 MVC? 1.1 什么是 MVC?
  • MVC 是模型(Model)、视图(View)和控制器(Controller)的简写,是一款软件设计规范
  • 将业务的逻辑、数据、展示分离的方法来组织代码的
  • MVC 主要作用降低了视图与业务逻辑间的相互耦合
  • MVC 不是一种设计模式,是一种架构模式。不同的 MVC 存在有差异
1.2 Model、View、Controller
  1. Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可认为是领域模型或者是 JavaBean 的组件。一般是分开来写的,包括 Value Object(数据DAO)和 服务层(行为 Service)。可以说是模型提供了模型数据查询和模型数据状态更新等功能,包括数据和业务。
  2. View(视图):负责进行模型的展示,一般就是看到的用户界面,客户想看到的东西。
  3. Controller(控制器):接受用户请求,委托给模型进行处理(状态改变),处理完毕之后把返回的数据返回给视图,由视图进行展示,可以说 Controller 是做了中间调度的动作。
【Spring全家桶|【SpringMVC】学习总结(一篇就够了)】最典型的 MVC 模式是 JSP + servlet + javabean 的模式。
Spring全家桶|【SpringMVC】学习总结(一篇就够了)
文章图片

Spring全家桶|【SpringMVC】学习总结(一篇就够了)
文章图片

1.3 MVC 架构要做哪些事?
  1. 将 url 映射到 Java 类或者 Java 类的方法
  2. 封装用户提交的数据
  3. 处理请求–调用业务相关处理–封装响应数据
  4. 将响应的数据进行渲染成 html 表示层的数据
1.4 基于 Servlet 的 MVC 流程模型 Spring全家桶|【SpringMVC】学习总结(一篇就够了)
文章图片

二、什么是 Spring MVC? 2.1 概述: Spring MVC 是Spring Framework 的一部分,是基于 Java 实现的 MVC 轻量级的 Web 框架。
官方生肉:
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#spring-web
翻译版本:(翻译版本是4.2.4的)(https://www.w3cschool.cn/spring_mvc_documentation_linesh_translation/spring_mvc_documentation_linesh_translation-dgcm27r3.html)
https://www.w3cschool.cn/spring_mvc_documentation_linesh_translation/spring_mvc_documentation_linesh_translation-dgcm27r3.html
2.2 Spring MVC 有什么特点?为什么要学?
  1. 轻量级,简单易学
  2. 高效,基于请求响应的 MVC 框架
  3. 与 Spring 兼容性好,可以做到无缝结合
  4. 约定优于配置( SpringBoot 也是)
  5. 功能强大:RESTFUL(一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源)、数据验证、格式化、本地化、主题等
  6. 简洁灵活
Spring 的 Web 框架围绕 DispatcherServlet(调度 Servlet)设计。
DispatcherServlet 的作用就是讲请求分发到不同的处理器。Spring 2.5 开始,使用 Java 5 以上版本可以基于注解开发,十分简洁
最重要的是:公司用的多
2.3 中心控制器 上面说到,Spring 的 Web 框架围绕 DispatcherServlet(调度 Servlet)设计。DispatcherServlet 的作用就是讲请求分发到不同的处理器。现在基本采用基于注解的 Controller 声明方式。
Spring MVC 框架像许多其他的 MVC 框架一样,以请求为驱动,围绕一个中心 Servlet 分派请求及提供其他的功能,DispatcherServlet 是一个实际的 Servlet(继承Http Servlet)。
关于HttpServlet介绍可以看大神的总结 https://blog.csdn.net/qq_41007534/article/details/99696559
Spring全家桶|【SpringMVC】学习总结(一篇就够了)
文章图片

2.3 Spring MVC 原理 Spring MVC 框架是高度可配置的,包括多种视图技术,例如JSP技术、Velocity、Tiles、iText和POI。SpringMVC框架并不关心使用的视图技术,也不会强迫开发者只使用JSP技术,但是这里只讨论JSP。
SpringMVC框架主要由DispatcherServlet、处理器映射、控制器、视图解析器、视图组成。其工作原理如下图所示:
Spring全家桶|【SpringMVC】学习总结(一篇就够了)
文章图片

Spring全家桶|【SpringMVC】学习总结(一篇就够了)
文章图片

2.4 Spring MVC 执行原理 中文图片便于理解:
Spring全家桶|【SpringMVC】学习总结(一篇就够了)
文章图片

完整图
![在这里插入图片描述](https://img-blog.csdnimg.cn/b9b44b861e5449bfb4d04a4208aad8ac.png
Spring全家桶|【SpringMVC】学习总结(一篇就够了)
文章图片

基于完整图:实线代表的是 Spring 提供的技术,不需要开发者进行实现,虚线是需要开发者进行实现的。
简单分析执行流程:
  • DispatcherServlet 表示的是前端控制器,是整个 Spring MVC 的控制中心。用户发出请求,DispatcherServlet 接受请求并拦截请求。
    假设请求的 url 为:http://localhost:8080/Spring/hello
    上面的 url 可以分为三部分:
    • http://localhost:8080 服务器域名
    • Spring 部署在服务器上的站点
    • hello 控制器
      可以得出,url 表示为:请求位于服务器 localhost:8080 上的 Spring 站点的 hello 控制器。
  1. HandlerMapping 为处理器映射。DispatcherServlet 调用 HandlerMapping,HandlerMapping 根据请求的 url 查找 Handler。
  2. HandlerExecution 表示具体的 Handler ,主要作用是根据 url 查找控制器,如上的 url 查找的控制器为 hello
  3. HandlerExecution 讲解析后的信息传递给 DispatcherServlet,如解析控制器映射等。
  4. HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
  5. Handler让具体的Controller执行。
  6. Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
  7. HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
  8. DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
  9. 视图解析器将解析的逻辑视图名传给DispatcherServlet。
  10. DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
  11. 最终视图呈现给用户。
三、RestFul 和控制器 3.1 什么是控制器(Controller)?
  • 控制器复杂访问应用程序的行为,通常通过接口定义或者注解定义两种方法实现。
  • 控制器负责解析用户的请求并将其转换为一个模型。
  • 在 Spring MVC 中一个控制器可以包含多个方法
  • 在 Spring MVC 中,对于控制器的配置有很多种
3.2 实现 Controller 接口 Controller 是一个接口,在 org.springframework.web.servlet.mvc 包下,接口只有一个方法:
@FunctionalInterface public interface Controller { @Nullable ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception; }

3.3 MVC 程序:
  1. 新建一个 Moudle
  2. 添加框架支持,选Web
    Spring全家桶|【SpringMVC】学习总结(一篇就够了)
    文章图片

  3. 确定导入 MVC 的依赖
    Spring全家桶|【SpringMVC】学习总结(一篇就够了)
    文章图片

  4. 配置 web.xml ,注册 DispatcherServlet(已经自动注册好)
  5. 配置 springmvc-servlet.xml 文件

  1. 编写操作业务 Controller ,实现Controller 接口,增加注解,需要返回一个 ModelAndView ,装数据,装视图
public class HellowController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { ModelAndView mv = new ModelAndView(); //封装对象,放在ModelAndView中。Model mv.addObject("msg","HelloSpringMVC!"); //封装要跳转的视图,放在ModelAndView中 mv.setViewName("/hello"); //: /WEB-INF/jsp/hello.jsp return mv; } }

  1. 配置Tomcat
    关于如何在IDEA配置请参考:配置Tomcat
  2. 将自己的类交给SpringIOC 容器,注册 bean

9、写跳转的 jsp 文件,显示 ModelAndView 存放的数据,以及正常的页面
3.4 注解版
  1. 新创建模块,引入Web、SpringMVC
  2. 修改pom.xml
SpringMVC org.example 1.0-SNAPSHOT 4.0.0SpringMVC-038 8 src/main/java **/*.properties **/*.xml false src/main/resources **/*.properties **/*.xml false

  1. 修改web.xml
> -name>SpringMVC -class>org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springmvc-servlet.xml 1 -mapping> -name>SpringMVC /

  1. 在 src/main/resources 包下创建 springmvc-servlet.xml

在视图解析器中我们把所有的视图都存放在/WEB-INF/目录下,这样可以保证视图安全,因为这个目录下的文件,客户端不能直接访问。
  1. 在pom.xml文件引入相关的依赖:主要有Spring框架核心库、Spring MVC、servlet , JSTL等。我们在父依赖中已经引入了
  2. 创建 Controller
package com.si.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/HelloController") public class HelloController { //真实访问地址:项目名/HelloController/hello @RequestMapping("/hello") public String sayHello(Model model){ model.addAttribute("msg","HelloController"); return "hello"; } }

@Controller是为了让Spring IOC容器初始化时自动扫描到;
@RequestMapping是为了映射请求路径,这里因为类与方法上都有映射所以访问时应该是/HelloController/hello;
方法中声明Model类型的参数是为了把Action中的数据带到视图中;
方法返回的结果是视图的名称hello,加上配置文件中的前后缀变成WEB-INF/jsp/hello.jsp。
  1. 创建视图层,在WEB-INF/jsp 目录中创建 hello.jsp
hello - 锐客网${msg}

  1. 启动tomcat
使用springMVC必须配置三大件:处理器映射器、处理器适配器、视图解析器
一般只需要手动配置视图解析器,另外两个可以通过主机驱动
四、数据处理和跳转 4.1 结果跳转方式 4.1.1 ModelAndView
设置 ModelAndView 对象,根据 view 的名称,和视图解析器跳到指定的页面。
页面:{视图解析器}+ viewName +{视图解析器后缀}

对应的 Controller 类
public class ControllerTest1 implements Controller {public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { //返回一个模型视图对象 ModelAndView mv = new ModelAndView(); mv.addObject("msg","ControllerTest1"); mv.setViewName("test"); return mv; } }

4.1.2 ServletAPI
通过设置 Servlet API ,不需要视图解析器
  1. 通过 HttpSevletResponse 进行输出
  2. 通过 HttpSevletResponse 实现重定向
  3. 通过 HttpSevletResponse 实现转发
package com.si.forward; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Controller public class Forward { @RequestMapping("/result/t1") public void test1(HttpServletRequest req, HttpServletResponse rsp) throws IOException { rsp.getWriter().println("Hello,Spring BY Servlet Api"); } @RequestMapping("/result/t2") public void test2(HttpServletRequest req, HttpServletResponse rsp) throws IOException { rsp.sendRedirect("/index.jsp"); } @RequestMapping("/result/t3") public void test3(HttpServletRequest req, HttpServletResponse rsp) throws IOException { //转发 req.setAttribute("msg","/result/t3"); req.getRequestDispatcher("/WEB-INF/jsp/test.jsp"); } }

4.1.3 SPringMVC
通过 SpringMVC 来实现转发和重定向 - 无需视图解析器
测试前:把视图解析器注释掉
@Controller public class ResultSpringMVC { @RequestMapping("/rsm/t1") public String test1(){ //转发 return "/index.jsp"; }@RequestMapping("/rsm/t2") public String test2(){ //转发二 return "forward:/index.jsp"; }@RequestMapping("/rsm/t3") public String test3(){ //重定向 return "redirect:/index.jsp"; } }

有视图解析器:
重定向 , 不需要视图解析器 , 本质就是重新请求一个新地方嘛 , 所以注意路径问题.
可以重定向到另外一个请求实现 .
@Controller public class ResultSpringMVC2 { @RequestMapping("/rsm2/t1") public String test1(){ //转发 return "test"; }@RequestMapping("/rsm2/t2") public String test2(){ //重定向 return "redirect:/index.jsp"; //return "redirect:hello.do"; //hello.do为另一个请求/ } }

4.2 数据处理 4.2.1 处理提交数据
  1. 提交的域名称和处理方法的参数名一致
    提交数据:http://localhost:9220/hello?name = weiyi
    处理方法:
    @RequestMapping("/hello") public String hello(String name){ System.out.println(name); return "hello"; }

    后台输出:weiyi
  2. 提交的域名称和处理方法的参数名不一致
    提交数据:http://localhost:9220/hello?name = weiyi
    处理方法:
    //@RequestParam("username") : username提交的域的名称 . @RequestMapping("/hello") public String hello(@RequestParam("username") String name){ System.out.println(name); return "hello"; }

    后台输出:weiyi
  3. 提交的是一个对象
    要求提交的表单域和对象的属性名一致 , 参数使用对象即可
    (1)实体类
    public class User { private int id; private String name; private int age; //构造 //get/set //tostring() }

(2)提交数据 : http://localhost:8080/mvc04/user?name=kuangshen&id=1&age=15
(3)处理方法:
@RequestMapping("/user") public String user(User user){ System.out.println(user); return "hello"; }

后台输出 : User { id=1, name=‘kuangshen’, age=15 }
说明:如果使用对象的话,前端传递的参数名和对象名必须一致,否则就是null。
4.2.2 数据显示传到前端
  1. 通过 ModelAndView
    我们一直就是这样使用的
    public class ControllerTest1 implements Controller {public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { //返回一个模型视图对象 ModelAndView mv = new ModelAndView(); mv.addObject("msg","ControllerTest1"); mv.setViewName("test"); return mv; } }

  2. 第二种 : 通过ModelMap
    @RequestMapping("/hello") public String hello(@RequestParam("username") String name, ModelMap model){ //封装要显示到视图中的数据 //相当于req.setAttribute("name",name); model.addAttribute("name",name); System.out.println(name); return "hello"; }

  3. 通过 Model
    @RequestMapping("/ct2/hello") public String hello(@RequestParam("username") String name, Model model){ //封装要显示到视图中的数据 //相当于req.setAttribute("name",name); model.addAttribute("msg",name); System.out.println(name); return "test"; }

三种方法对比:
Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;
ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性;
ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。
四、数据处理和跳转 4.1 结果跳转方式 4.1.1 ModelAndView
设置 ModelAndView 对象,根据 view 的名称,和视图解析器跳到指定的页面。
页面:{视图解析器}+ viewName +{视图解析器后缀}

对应的 Controller 类
public class ControllerTest1 implements Controller {public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { //返回一个模型视图对象 ModelAndView mv = new ModelAndView(); mv.addObject("msg","ControllerTest1"); mv.setViewName("test"); return mv; } }

4.1.2 ServletAPI
通过设置 Servlet API ,不需要视图解析器
  1. 通过 HttpSevletResponse 进行输出
  2. 通过 HttpSevletResponse 实现重定向
  3. 通过 HttpSevletResponse 实现转发
package com.si.forward; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Controller public class Forward { @RequestMapping("/result/t1") public void test1(HttpServletRequest req, HttpServletResponse rsp) throws IOException { rsp.getWriter().println("Hello,Spring BY Servlet Api"); } @RequestMapping("/result/t2") public void test2(HttpServletRequest req, HttpServletResponse rsp) throws IOException { rsp.sendRedirect("/index.jsp"); } @RequestMapping("/result/t3") public void test3(HttpServletRequest req, HttpServletResponse rsp) throws IOException { //转发 req.setAttribute("msg","/result/t3"); req.getRequestDispatcher("/WEB-INF/jsp/test.jsp"); } }

4.1.3 SPringMVC
通过 SpringMVC 来实现转发和重定向 - 无需视图解析器
测试前:把视图解析器注释掉
@Controller public class ResultSpringMVC { @RequestMapping("/rsm/t1") public String test1(){ //转发 return "/index.jsp"; }@RequestMapping("/rsm/t2") public String test2(){ //转发二 return "forward:/index.jsp"; }@RequestMapping("/rsm/t3") public String test3(){ //重定向 return "redirect:/index.jsp"; } }

有视图解析器:
重定向 , 不需要视图解析器 , 本质就是重新请求一个新地方嘛 , 所以注意路径问题.
可以重定向到另外一个请求实现 .
@Controller public class ResultSpringMVC2 { @RequestMapping("/rsm2/t1") public String test1(){ //转发 return "test"; }@RequestMapping("/rsm2/t2") public String test2(){ //重定向 return "redirect:/index.jsp"; //return "redirect:hello.do"; //hello.do为另一个请求/ } }

4.2 数据处理 4.2.1 处理提交数据
  1. 提交的域名称和处理方法的参数名一致
    提交数据:http://localhost:9220/hello?name = weiyi
    处理方法:
    @RequestMapping("/hello") public String hello(String name){ System.out.println(name); return "hello"; }

    后台输出:weiyi
  2. 提交的域名称和处理方法的参数名不一致
    提交数据:http://localhost:9220/hello?name = weiyi
    处理方法:
    //@RequestParam("username") : username提交的域的名称 . @RequestMapping("/hello") public String hello(@RequestParam("username") String name){ System.out.println(name); return "hello"; }

    后台输出:weiyi
  3. 提交的是一个对象
    要求提交的表单域和对象的属性名一致 , 参数使用对象即可
    (1)实体类
    public class User { private int id; private String name; private int age; //构造 //get/set //tostring() }

(2)提交数据 : http://localhost:8080/mvc04/user?name=kuangshen&id=1&age=15
(3)处理方法:
@RequestMapping("/user") public String user(User user){ System.out.println(user); return "hello"; }

后台输出 : User { id=1, name=‘kuangshen’, age=15 }
说明:如果使用对象的话,前端传递的参数名和对象名必须一致,否则就是null。
4.2.2 数据显示传到前端
  1. 通过 ModelAndView
    我们一直就是这样使用的
    public class ControllerTest1 implements Controller {public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { //返回一个模型视图对象 ModelAndView mv = new ModelAndView(); mv.addObject("msg","ControllerTest1"); mv.setViewName("test"); return mv; } }

  2. 第二种 : 通过ModelMap
    @RequestMapping("/hello") public String hello(@RequestParam("username") String name, ModelMap model){ //封装要显示到视图中的数据 //相当于req.setAttribute("name",name); model.addAttribute("name",name); System.out.println(name); return "hello"; }

  3. 通过 Model
    @RequestMapping("/ct2/hello") public String hello(@RequestParam("username") String name, Model model){ //封装要显示到视图中的数据 //相当于req.setAttribute("name",name); model.addAttribute("msg",name); System.out.println(name); return "test"; }

三种方法对比:
Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;
ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性;
ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。
五、整合 SSM 框架 前言:需要会 Spring、SpringMVC、Mybatis,以及简单的前端知识
5.1 搭建数据库环境 传建数据库表:(本人使用的是 Navicat)
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=utf8; INSERTINTO `books`(`bookID`,`bookName`,`bookCounts`,`detail`)VALUES (1,'Java',1,'从入门到放弃'), (2,'MySQL',10,'从删库到跑路'), (3,'Linux',5,'从进门到进牢');

Spring全家桶|【SpringMVC】学习总结(一篇就够了)
文章图片

IDEA 连接数据库:
Spring全家桶|【SpringMVC】学习总结(一篇就够了)
文章图片

5.2 基本环境搭建
  1. 新建一个 Maven 项目(ssmbuild),添加 web 支持
  2. 导入pom依赖
junit junit 4.12 mysql mysql-connector-java 5.1.47 com.mchange c3p0 0.9.5.2 javax.servlet servlet-api 2.5 javax.servlet.jsp jsp-api 2.2 javax.servlet jstl 1.2 org.mybatis mybatis 3.5.2 org.mybatis mybatis-spring 2.0.2 org.springframework spring-webmvc 5.1.9.RELEASE org.springframework spring-jdbc 5.1.9.RELEASE

  1. Maven 资源过滤设置
src/main/java **/*.properties **/*.xml false src/main/resources **/*.properties **/*.xml false

  1. 构建项目基本架构
  • com.si.pojo
  • com.si.dao
  • com.si.service
  • com.si.controller
  • mybatis-config.xml

  • applicationContext.xml

5.2 Mybatis 层编写
  1. 数据库配置文件 database.properties
# 如果使用mysql 8.0 以上,需要加上时区设置 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=true&useUnicode=true&characterEncoding=utf8 jdbc.username=root jdbc.password=123456

  1. 编写 MyBatis 的核心配置文件

5.3 编写数据库对应的实体类 com.si.pojo.Books 使用 Lombok 插件
添加插件
org.projectlombok lombok 1.18.24

编写实体类
package com.si.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class Books { private int bookID; private String bookName; privateint bookCounts; privateString detail; }

5.4 编写 Dao 层的 Mapper 接口
package com.si.dao; import com.si.pojo.Books; import java.util.List; public interface BookMapper { //增加一个 book int add(Books book); //根据 ID 删除一个 book int deleteBookById(int id); //更新 book int updateBook(Books book); //根据 ID 查询,返回一个 book Books queryBookById(int id); //查询全部 Book List queryAllBook(); }

5.5 编写对应的 Mapper.xml 文件。需要导入 MyBatis 的包。
insert into ssmbuild.books(bookName,bookCounts,detail) values (#{bookName}, #{bookCounts}, #{detail}) delete from ssmbuild.books where bookID=#{bookID} update ssmbuild.books set bookName = #{bookName},bookCounts = #{bookCounts},detail = #{detail} where bookID = #{bookID} ="queryBookById" resultType="Books"> select * from ssmbuild.books where bookID = #{bookID} ="queryAllBook" resultType="Books"> SELECT * from ssmbuild.books

5.6 编写 Service 接口 和 实现类 接口:
package com.si.service; import com.si.pojo.Books; import java.util.List; public interface BookService { //增加一个 book int addBook(Books book); //根据 ID 删除一个 book int deleteBookById(int id); //更新 book int updateBook(Books book); //根据 ID 查询,返回一个 book Books queryBookById(int id); //查询全部 Book List queryAllBook(); }

实现类:
package com.si.service; import com.si.dao.BookMapper; import com.si.pojo.Books; import java.util.List; public class BookServiceImpl implements BookService{ //调用dao层的操作,设置一个set接口,方便Spring管理 private BookMapper bookMapper; public BookMapper getBookMapper() { return bookMapper; }public void setBookMapper(BookMapper bookMapper) { this.bookMapper = bookMapper; }@Override public int addBook(Books book) { return bookMapper.addBook(book); }@Override public int deleteBookById(int id) { return bookMapper.deleteBookById(id); }@Override public int updateBook(Books book) { return bookMapper.updateBook(book); }@Override public Books queryBookById(int id) { return bookMapper.queryBookById(id); }@Override public List queryAllBook() { return bookMapper.queryAllBook(); } }

到这里,底层需求操作编写完毕
5.7 Spring 层
  1. 配置Spring整合MyBatis,我们这里数据源使用c3p0连接池;
  2. 编写 Spring 整合 MyBatis 的相关配置文件:spring-dao.xml

  1. Spring整合service层
    关联xml
    Spring全家桶|【SpringMVC】学习总结(一篇就够了)
    文章图片

    创建 spring-service.xml

5.8 springMVC层
  1. 配置 web.xml
> -name>DispatcherServlet -class>org.springframework.web.servlet.DispatcherServlet contextConfigLocationclasspath:applicationContext.xml 1 -mapping> -name>DispatcherServlet / encodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 encodingFilter /* 15

  1. 创建 spring-mvc.xml

  1. applicationContext.xml 导入三层架构
Spring全家桶|【SpringMVC】学习总结(一篇就够了)
文章图片

配置文件,暂时结束!Controller 和 视图层编写
5.9 BookController 类编写
  1. BookController 类编写
package com.si.controller; import com.si.pojo.Books; import com.si.service.BookService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Controller; import org.springframework.stereotype.Repository; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import java.util.List; @Controller @RequestMapping("/book") public class BookController { //创建 Service 对象 @Autowired @Qualifier("BookServiceImpl") private BookService bookService; public BookService getBookService() { return bookService; }public void setBookService(BookService bookService) { this.bookService = bookService; }//查询全部书籍 @RequestMapping("/allBook") public String lict(Model model){ List books = bookService.queryAllBook(); model.addAttribute("list",books); return "allBook"; } }

  1. 编写首页
首页 - 锐客网 ="text/css"> 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; } 点击进入列表页

  1. 写 allBook 页
书籍列表 - 锐客网
书籍编号 书籍名字 书籍数量 书籍详情 操作
${book.getBookID()} ${book.getBookName()} ${book.getBookCounts()} ${book.getDetail()} 更改 | 删除

  1. addBook 页
新增书籍 - 锐客网
书籍名称:


书籍数量:


书籍详情:



  1. updateBook 页
修改信息 - 锐客网
书籍名称: 书籍数量: 书籍详情:

5.10 配置 tomcat 5.11 测试 Spring全家桶|【SpringMVC】学习总结(一篇就够了)
文章图片

Spring全家桶|【SpringMVC】学习总结(一篇就够了)
文章图片

成功了 中间找 Bug 找了好久,真的是刚上手不容易啊 现在想一下 似乎也不是那么难了

    推荐阅读