文章目录
- 一、什么是 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 存在有差异
- Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可认为是领域模型或者是 JavaBean 的组件。一般是分开来写的,包括 Value Object(数据DAO)和 服务层(行为 Service)。可以说是模型提供了模型数据查询和模型数据状态更新等功能,包括数据和业务。
- View(视图):负责进行模型的展示,一般就是看到的用户界面,客户想看到的东西。
- Controller(控制器):接受用户请求,委托给模型进行处理(状态改变),处理完毕之后把返回的数据返回给视图,由视图进行展示,可以说 Controller 是做了中间调度的动作。
文章图片
文章图片
1.3 MVC 架构要做哪些事?
- 将 url 映射到 Java 类或者 Java 类的方法
- 封装用户提交的数据
- 处理请求–调用业务相关处理–封装响应数据
- 将响应的数据进行渲染成 html 表示层的数据
文章图片
二、什么是 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 有什么特点?为什么要学?
- 轻量级,简单易学
- 高效,基于请求响应的 MVC 框架
- 与 Spring 兼容性好,可以做到无缝结合
- 约定优于配置( SpringBoot 也是)
- 功能强大:RESTFUL(一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源)、数据验证、格式化、本地化、主题等
- 简洁灵活
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
文章图片
2.3 Spring MVC 原理 Spring MVC 框架是高度可配置的,包括多种视图技术,例如JSP技术、Velocity、Tiles、iText和POI。SpringMVC框架并不关心使用的视图技术,也不会强迫开发者只使用JSP技术,但是这里只讨论JSP。
SpringMVC框架主要由DispatcherServlet、处理器映射、控制器、视图解析器、视图组成。其工作原理如下图所示:
文章图片
文章图片
2.4 Spring MVC 执行原理 中文图片便于理解:
文章图片
完整图
![在这里插入图片描述](https://img-blog.csdnimg.cn/b9b44b861e5449bfb4d04a4208aad8ac.png
文章图片
基于完整图:实线代表的是 Spring 提供的技术,不需要开发者进行实现,虚线是需要开发者进行实现的。
简单分析执行流程:
- DispatcherServlet 表示的是前端控制器,是整个 Spring MVC 的控制中心。用户发出请求,DispatcherServlet 接受请求并拦截请求。
假设请求的 url 为:http://localhost:8080/Spring/hello
上面的 url 可以分为三部分:- http://localhost:8080 服务器域名
- Spring 部署在服务器上的站点
- hello 控制器
可以得出,url 表示为:请求位于服务器 localhost:8080 上的 Spring 站点的 hello 控制器。
- HandlerMapping 为处理器映射。DispatcherServlet 调用 HandlerMapping,HandlerMapping 根据请求的 url 查找 Handler。
- HandlerExecution 表示具体的 Handler ,主要作用是根据 url 查找控制器,如上的 url 查找的控制器为 hello
- HandlerExecution 讲解析后的信息传递给 DispatcherServlet,如解析控制器映射等。
- HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
- Handler让具体的Controller执行。
- Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
- HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
- DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
- 视图解析器将解析的逻辑视图名传给DispatcherServlet。
- DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
- 最终视图呈现给用户。
- 控制器复杂访问应用程序的行为,通常通过接口定义或者注解定义两种方法实现。
- 控制器负责解析用户的请求并将其转换为一个模型。
- 在 Spring MVC 中一个控制器可以包含多个方法
- 在 Spring MVC 中,对于控制器的配置有很多种
@FunctionalInterface
public interface Controller {
@Nullable
ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception;
}
3.3 MVC 程序:
- 新建一个 Moudle
- 添加框架支持,选Web
文章图片
- 确定导入 MVC 的依赖
文章图片
- 配置 web.xml ,注册 DispatcherServlet(已经自动注册好)
- 配置 springmvc-servlet.xml 文件
- 编写操作业务 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;
}
}
- 配置Tomcat
关于如何在IDEA配置请参考:配置Tomcat - 将自己的类交给SpringIOC 容器,注册 bean
9、写跳转的 jsp 文件,显示 ModelAndView 存放的数据,以及正常的页面
3.4 注解版
- 新创建模块,引入Web、SpringMVC
- 修改pom.xml
SpringMVC
org.example
1.0-SNAPSHOT
4.0.0 SpringMVC-03 8
8
src/main/java
**/*.properties
**/*.xml
false
src/main/resources
**/*.properties
**/*.xml
false
- 修改web.xml
>
-name>SpringMVC
-class>org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc-servlet.xml
1
-mapping>
-name>SpringMVC
/
- 在 src/main/resources 包下创建 springmvc-servlet.xml
在视图解析器中我们把所有的视图都存放在/WEB-INF/目录下,这样可以保证视图安全,因为这个目录下的文件,客户端不能直接访问。
- 在pom.xml文件引入相关的依赖:主要有Spring框架核心库、Spring MVC、servlet , JSTL等。我们在父依赖中已经引入了
- 创建 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。
- 创建视图层,在WEB-INF/jsp 目录中创建 hello.jsp
hello - 锐客网 ${msg}
- 启动tomcat
一般只需要手动配置视图解析器,另外两个可以通过主机驱动
四、数据处理和跳转 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 ,不需要视图解析器
- 通过 HttpSevletResponse 进行输出
- 通过 HttpSevletResponse 实现重定向
- 通过 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 处理提交数据
- 提交的域名称和处理方法的参数名一致
提交数据:http://localhost:9220/hello?name = weiyi
处理方法:
@RequestMapping("/hello") public String hello(String name){ System.out.println(name); return "hello"; }
后台输出:weiyi
- 提交的域名称和处理方法的参数名不一致
提交数据: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
- 提交的是一个对象
要求提交的表单域和对象的属性名一致 , 参数使用对象即可
(1)实体类
public class User { private int id; private String name; private int age; //构造 //get/set //tostring() }
(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 数据显示传到前端
- 通过 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; } }
- 第二种 : 通过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"; }
- 通过 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 ,不需要视图解析器
- 通过 HttpSevletResponse 进行输出
- 通过 HttpSevletResponse 实现重定向
- 通过 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 处理提交数据
- 提交的域名称和处理方法的参数名一致
提交数据:http://localhost:9220/hello?name = weiyi
处理方法:
@RequestMapping("/hello") public String hello(String name){ System.out.println(name); return "hello"; }
后台输出:weiyi
- 提交的域名称和处理方法的参数名不一致
提交数据: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
- 提交的是一个对象
要求提交的表单域和对象的属性名一致 , 参数使用对象即可
(1)实体类
public class User { private int id; private String name; private int age; //构造 //get/set //tostring() }
(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 数据显示传到前端
- 通过 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; } }
- 第二种 : 通过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"; }
- 通过 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,'从进门到进牢');
文章图片
IDEA 连接数据库:
文章图片
5.2 基本环境搭建
- 新建一个 Maven 项目(ssmbuild),添加 web 支持
- 导入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
- Maven 资源过滤设置
src/main/java
**/*.properties
**/*.xml
false
src/main/resources
**/*.properties
**/*.xml
false
- 构建项目基本架构
- com.si.pojo
- com.si.dao
- com.si.service
- com.si.controller
- mybatis-config.xml
- applicationContext.xml
5.2 Mybatis 层编写
- 数据库配置文件 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
- 编写 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 层
- 配置Spring整合MyBatis,我们这里数据源使用c3p0连接池;
- 编写 Spring 整合 MyBatis 的相关配置文件:spring-dao.xml
- Spring整合service层
关联xml
文章图片
创建 spring-service.xml
5.8 springMVC层
- 配置 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
- 创建 spring-mvc.xml
- applicationContext.xml 导入三层架构
文章图片
配置文件,暂时结束!Controller 和 视图层编写
5.9 BookController 类编写
- 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";
}
}
- 编写首页
首页 - 锐客网
="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;
}
点击进入列表页
- 写 allBook 页
书籍列表 - 锐客网
>书籍列表 —— 显示所有书籍
- addBook 页
新增书籍 - 锐客网
>新增书籍
- updateBook 页
修改信息 - 锐客网
>修改信息
5.10 配置 tomcat 5.11 测试
文章图片
文章图片
成功了 中间找 Bug 找了好久,真的是刚上手不容易啊 现在想一下 似乎也不是那么难了
推荐阅读
- 算法|【玩转数据结构 从入门到进阶12学习笔记】红黑树
- #|HashSet源码学习
- Java|Java Junit注解 @Test @Before @After @BeforeClass @AfterClass 学习以及实践总结
- 算法刷题打卡|算法学习 第三十天 有序数组构造二叉搜索树
- java|Java基于Socket实现简单QQ聊天详细教程
- rabbitmq从入门到精通|RabbitMQ入门 -- 阿里云服务器安装RabbitMQ
- JUC并发编程|JUC并发编程—— volatile 关键字详解
- java|Java中volatile关键字详解
- java学习|JUC并发编程汇总彻底搞懂JUC