1.SpringMVC

1.1 概述

  1. Spring MVC 是 Spring 提供的一个基于 MVC 设计模式 的轻量级 Web 开发框架,本质上相当于 Servlet相当于对其的进一步封装 核心组件 DispatcherServlet

    • Spring MVC框架 内部采用松耦合、可插拔的组件结构, 具有高度可配置性,比起其他的 MVC 框架更具有扩展性和灵活性。
  2. 我们的 实体类(POJO) 就是Model层,我们的JSP就是 视图层(View),我们的Controller就是控制层。
    • Model: 负责对请求进行处理,并将结果返回给 Controller;
    • View: 负责将请求的处理结果进行渲染,展示在客户端浏览器上;
    • Controller: 是 Model 和 View 交互的纽带;主要负责接收用户请求,并调用 Model 对请求处理,然后将 Model 的处理结果传递给 View。

1.2 MVC模型是什么 ?

  1. MVC 模式,全称为 Model-View-Controller(模型-视图-控制器)模式,它是一种软件架构模式。

    • 目标: 将软件的用户界面(即前台页面)和 业务逻辑分离,使代码具有更高的可扩展性、可复用性、可维护性以及灵活性。
    • 特点:可以达到一个松耦合的效果,形成了可插拔的模块化,分层和解耦。

1.2.1 模型图

  1. web项目的演变。

    • 早期的JavaWeb的项目应用。

    • MVC 模式将应用程序划分成模型(Model)、视图(View)、控制器(Controller)等三层。

  1. 现在主流基于SSM三大框架开发都是在MVC上继续演化,出现了 ,三层架构:UI表示层,数据访问层DAL,业务逻辑层BLL,

    • 表示层::HTML、JSP 等前台页面以及后台的 Servlet,即它相当于 MVC 模式中的 View 层 + Controller 层。
    • 数据层,则只包含了 Dao 接口及其实现类(DaoImpl)的代码,即它相当于 MVC 模式中 Model 层的一部分,并不包含 Service 和实体类
    • 业务层,则只包含了 Service 接口及其实现类(Servicelmpl)的代码,即它相当于 MVC 模式中 Model 层的一部分,并不包含 Dao 和实体类。

1.2.2 MVC的工作流程

  1. 工作流程图
  2. 工作流程详细描述:
    • 用户发送请求到服务器(前端控制器DispatcherServlet,充当调度者,去调度每一个角色),DispatcherServlet收到请求调用HandlerMapping处理器映射器(根据浏览器URL地址值,找到能处理请求的类名和方法名称)。
    • DispatcherServlet调用HandlerAdapter处理器适配器,开始正式处理业务,HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
    • Controller执行完成返回ModelAndView。
    • HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
    • DispatcherServlet将ModelAndView传给ViewReslover视图解析器,ViewReslover解析后返回具体View。
    • View 视图渲染数据后,将数据填充到视图中,最终展示给用户。

1.3 课堂案例

1.3.1 将手机信息展示到页面

  1. 需求:

    • 访问网页信息,http://localhost:8080/phone/info
    • 页面显示相应的手机信息。
  2. 创建 Maven project。

    • 注意:选择 SpringBoot 的版本星号,JDK8支持3.0以下的,以上的需要 17支持。

  3. 准备创建类。

    • 创建 DemoApplication.class
    @SpringBootApplication
    public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
    }
    
    • 创建 Phone.class
    public class Phone {private  Integer id;private  String brand;public Phone(Integer id, String brand, String colour, String county) {this.id = id;this.brand = brand;}public Phone() {}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}@Overridepublic String toString() {return "Phone{" +"id=" + id +", brand='" + brand + '\'' +'}';}
    }
    • 创建 PhoneController.class
    @RestController
    @RequestMapping("/phone")
    public class PhoneController {@RequestMapping("/info")public String info(){Phone phone = new Phone(13, "Max", "紫色", "USA");String s = phone.toString();return s;}@RequestMapping("/info2")public Phone info2() {Phone phone = new Phone();phone.setId(18);phone.setBrand("phone");return phone;}//TODO 测试: 可以返回基本数据类型到页面么? 如数组?@RequestMapping("/arr")public int[] arr() {int[] a = {1,2,3,4};return a;}
    }
    
  4. 启动SpringBoot,访问地址, http://localhost:8080/phone/infohttp://localhost:8080/phone/info2

    • 得到返回结果 Phone{id=13, brand='Max'}{"id":18,"brand":"phone"}

2. SpringMVC解析处理请求参数

2.1 GET ,POST,RESTFul

  1. 当客户端打开浏览器要访问服务器时,可能会带着一些 http协议 请求参数过来。这时,服务器需要获取http参数进行业务处理。
  2. 如何处理http请求并获取参数呢,常见的两种方式:
    • GET方式,向特定的资源发出请求,并返回实体,有固定的写法,而且数据有最大长度,超出就不行。

      • 例如:http://localhost:8080/phone/add?id=1&name=周杰伦&age=38
    • POST方式,向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据被包含在请求体中。
  1. RESTFul 方式 为了简化GET请求的写法,可以使用RESTFul方式,用法如下:

    • 需要使用注解@PathVariable来获取请求路径中的参数值,@PathVariable用来绑定值
    • 通过{???}获取路径中传递来的值
    • 以前GET的访问方式即将被简化成,http://localhost:8080/phone/add/1/周杰伦/44

2.2 处理Get请求参数

2.2.1 编写后端

  1. 页面的名称和后台形参的名称要保持一致。

    • User.class
    public class User {private int id;private String name;private int  age;private double price;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", price=" + price +'}';}
    }
    • CetController.class
    @RestController
    @RequestMapping("/phone")
    public class GetController {//1. 解析get获取的Url地址值,如: key=value 中的value@Test //使用单元测试public void get(){//http://localhost:8080/phone/insert?id=1&name=周杰伦&age=38String s = "http://localhost:8080/phone/add?id=1&name=周杰伦&age=38";String[] split = s.split("\\?")[1].split("&");for (String data:split) {//[id=1, name=周杰伦, age=38] ,然后按照等号切获取data[1],就是value值String value = data.split("=")[1];System.out.println(value); // 1, 周杰伦,38.}}/*2.如果使用框架处理问题。http://localhost:8080/phone/get2?id=1*/@RequestMapping("get2")public int get2(int a){ //页面访问值id 需要和 形式参数保持一致。return a;}//2.1 http://localhost:8080/phone/get3?name=周杰伦&age=44@RequestMapping("get3")public String get3(String name,int age){return "请求的参数name= :"+name+ " 年龄age= "+ age;}/*** 3. 假设有参数很多了该怎么办?*      框架能给我们做什么 ?*    这样如何解析:  http://localhost:8080/phone/get4?id=1&name=周杰伦&age=44&price=2.2*/// public String get4(int id,String name,int age,double price){}@RequestMapping("get4")public User get4(User u){return u;}
    }
    

2.2.2 编写前端

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!-- 超连接一个路径,点击时会跳转到方法--><a href="http://localhost:8080/phone/get4?id=1&name=周杰伦&age=44&price=2.2">点我,得到你想要的</a>
</body>
</html>

2.3 处理RESTFul 请求参数

  1. 主要简化了get请求的提交,如果是restful 请求,需要使用 @RequestParam(“页面名称”), 获取路径中传递的值。

    • 创建 RunApp.class 该类为资源包里,或者其他类的上一级或者同级 。 不同包则无效。
    @SpringBootApplication
    public class RunApp {public static void main(String[] args) {SpringApplication.run(RunApp.class, args);}}
    

2.3.1 前后端代码处理

  1. 创建 Controller.class ,形式参数上与 通过{ }获取路径中传递来的值。

    • @PathVariable在参数注解,获取传递路径上参数,需要与形参保持一致。
    @RestController
    @RequestMapping("user")
    public class Controller {//restful 请求需要 在RequestMapping 中加入{}参数//并且需要在 形式参数上@PathVariable 绑定值@RequestMapping("info/{name}/{age}")public String info(@PathVariable String name,@PathVariable Integer age){return "返回的结果 name= "+name+" 年龄 age= "+age;}//2.<a href="http://localhost:8080/user/info2/周杰伦/44/中国">restful解析</a>// 封装对象,自动赋值访问。@RequestMapping("info2/{name}/{age}/{conutry}")public Person info2(Person  person){return person;}
    }
    
  2. 前端页面

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>Title</title>
    </head>
    <body>
    <!-- 超连接一个路径,点击时会跳转到方法--><a href="http://localhost:8080/user/info/周杰伦/20">restful解析</a><a href="http://localhost:8080/user/info2/周杰伦/44/中国">restful解析2</a>
    </body>
    </html>
    

2.4 处理Post请求的参数

2.4.1 前期准备

  1. 项目结构

    • 创建Maven project 结构如下:
  2. 需求处理
    • 单个参数 name
    • 读个参数 name age
    • 对象 Student
    • RestFul 形式
  3. 准备表单 Students.html ,因为post需要以表单的形式进行提交。
    • 创建 Students.html 在项目结构中。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>student</title>
</head><form action="http://localhost:8080/stu/add" method="post"><table><h2>学生表单Post测试</h2><tr><td>姓名:<input type="text" name="name"  placeholder="请输入姓名..."/></td></tr><tr><td>年龄:<input type="text" name="age" placeholder="请输入年龄..."  /></td></tr><tr><td>性别:(单选框)<input type="radio" name="sex" checked="checked" value="0"/>男<input type="radio" name="sex" value="1" />女</td></tr><tr><td>爱好:(多选)<input type="checkbox" name="hobby" checked="checked" value="lq"/>篮球<input type="checkbox" name="hobby" value="rap"/>rap<input type="checkbox" name="hobby" value="cg"/>唱歌</td></tr><tr><td>选择方向:<select name="edu"><option value ="1">初级课程</option><option value ="2">高级课程</option></select></td></tr><tr><td>入学时间: <input type="date" name="intime"/></td></tr><tr><td><input type="submit" value="保存" /><input type="reset" value="取消" /></td></tr></table>
</form>
</body>
</html>

2.4.2 准备后端代码处理

  1. 创建 Student.class

    • 注意日期类,类型不匹配会报错。页面报400 IllegalArgumentException: String->Date
    • 所以需要使用注解进行解析 @DateTimeFormat(pattern = "yyyy-MM-dd")
    public class Student {private  String name;private  Integer age;private  String sex;private String[] hobby;private  String edu;//时间类型需要处理,网页上是String类型,实际属性是Date类型。@DateTimeFormat(pattern = "yyyy-MM-dd")private Date intime;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String[] getHobby() {return hobby;}public void setHobby(String[] hobby) {this.hobby = hobby;}public String getEdu() {return edu;}public void setEdu(String edu) {this.edu = edu;}public Date getIntime() {return intime;}public void setIntime(Date intime) {this.intime = intime;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", sex='" + sex + '\'' +", hobby=" + Arrays.toString(hobby) +", edu='" + edu + '\'' +", intime=" + intime +'}';}
    }
  2. 创建 StudentController.class

    @RestController
    @RequestMapping("/stu")
    public class StudentController {@RequestMapping("add")public String add(Student student){//TODO 可以使用 jdbc 数据库中.... 略return student.toString();//将结果输出到屏幕。}
    }
  3. 创建启动RunApp.class

    @SpringBootApplication
    public class RunApp {public static void main(String[] args) {SpringApplication.run(RunApp.class, args);}}
    

3.完成前后端整合

3.1 使用Jdbc连接数据库

  1. 还记得jdbc如何使用么 ?

    • 添加数据库的依赖在pom.xml中
      <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version></dependency>
    
  2. 创建jdbc的连接步骤

    • 单独创建一个方法做业务逻辑操作,如插入。
 @RequestMapping("insert")public void insert(Student s){//TODO  进行前后端整合,使用jdbc连接数据库try {//1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.创建数据库连接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_student?characterEncoding=utf-8","root", "root");//3. 获取传输器,并发送sql语句等待返回结果String  sql = "insert into student values (null,?,?,?,?,?,?)";PreparedStatement ps = conn.prepareStatement(sql);//4。设置参数每个属性获取值
//            ps.setString(1,s.getName());
//            ps.setInt(2,s.getAge());
//            ps.setString(3,s.getSex());//4.1 Object 使用多态设置减少ps.setObject(1,s.getName());ps.setObject(2,s.getAge());ps.setObject(3,s.getSex());//ps.setObject(4,s.getHobby());ps.setObject(4, Arrays.toString(s.getHobby())); //因为是数组,需要转为String。注意ps.setObject(5,s.getEdu());ps.setObject(6,s.getIntime());ps.executeUpdate();//执行sql执行。System.out.println("数据插入成功");} catch (Exception e) {e.printStackTrace();}}

3.2 创建数据库

  1. 按照 db_student 创建数据库,根据前端逻辑页面创建。
CREATE TABLE `student` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,`age` int DEFAULT NULL,`sex` varchar(10) DEFAULT NULL,`hobby` varchar(100) DEFAULT NULL,`edu` varchar(100) DEFAULT NULL,`intime` date DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb3
  1. 注意html上得post提交action<form action="http://localhost:8080/stu/insert" method="post">

SSM框架 (一) SpringMVC相关推荐

  1. JavaWeb学习之路——SSM框架之SpringMVC(八)

    SpringMVC参数传递:把内容写到方法(HandlerMethod)参数中,SpringMVC只要有这个内容,则会注入,在这里使用注解的方式来传递参数 前提使用springmvc注解功能,相应配置 ...

  2. SSM框架:SpringMVC

    SSM框架:SpringMVC 文章目录 前言 一.回顾 1. 学习方法说明 2. 回顾MVC架构 1.什么是MVC 2.MVC的结构分析 3.Model1时代 4.Model2时代 3. 回顾Ser ...

  3. SSM框架(spring+springmvc+mybatis)+Mysql实现的社区物业管理系统(功能包含分角色,报修管理、抄表管理、车位管理、房屋管理、业主管理、投诉管理、报修统计分析等)

    博客目录 SSM框架(spring+springmvc+mybatis)+Mysql实现的社区物业管理系统 实现功能截图 系统功能 使用技术 代码 完整源码 SSM框架(spring+springmv ...

  4. SSM框架——Spring+SpringMVC+Mybatis的搭建教程

    一:概述 SSM框架在项目开发中经常使用到,相比于SSH框架,它在仅几年的开发中运用的更加广泛. Spring作为一个轻量级的框架,有很多的拓展功能,最主要的我们一般项目使用的就是IOC和AOP. S ...

  5. [转载] 手把手教你整合最优雅SSM框架:SpringMVC + Spring + MyBatis

    参考链接: Java继承类的对象创建 本文发表于2016年6月,写于作者学生时期.文中使用到的技术和框架可能不是当下最佳实践,甚至很不"优雅".但对于刚接触JavaEE和Sprin ...

  6. 手把手教你整合最优雅SSM框架:SpringMVC + Spring + MyBatis

    http://blog.csdn.net/qq598535550/article/details/51703190 我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能:而且在大部分教学课 ...

  7. SSM框架:springmvc实现图片的上传与图片上传路径的设置

    说明:这个图片类文件上传的步骤是我经过验证的,在SSM框架下完成,搭建框架的部分不在这里说明. 第一步:添加两个项目需要的依赖.(pom.xml) <dependency><grou ...

  8. SSM框架知识点-SpringMVC流程图

    文章目录 SSM框架知识点 示例图 SpringMVC流程图 SSM框架知识点 示例图 SpringMVC流程图

  9. SSM框架Spring+SpringMVC+MyBatis——详细整合教程

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎所有的JDBC代码和参 ...

最新文章

  1. CSS之定位(固定定位)
  2. WordPress 网站开发“微信小程序“实战(二)
  3. 4 Ways to Make Sure You Always Have Something to Say Online
  4. MATLAB优化——减少for的使用
  5. 初步了解超图两种3D客户端 - iClient3D for_WebGL 和 iClient3D for_Plugin
  6. 约三分之二的 DDoS 攻击指向通信服务提供商
  7. Html5开发之链接标签nav的用法
  8. hadoop使用combiner合并操作
  9. 手势UITapGestureRecognizer的tag
  10. 【Elasticsearch】Elasticsearch 导入 导出 命令行工具
  11. 使用checked关键字处理“溢出”错误
  12. python装饰器详解-python中的装饰器详解
  13. android布局自适应小示例(用户反馈界面)
  14. 运算符in和not in
  15. excel计算式自动计算_全套Excel版工程自动计算表格+实用小工具,高效工作不加班...
  16. 国网B接口调阅实时视频(INVITE)接口描述和消息示例
  17. java实现wps函数IRR_ORACLE SQL 实现IRR的计算
  18. AE制作文字模糊特效
  19. linux部署jia包常用命令
  20. mybatis学习日志一

热门文章

  1. python中rb是什么意思_python中rb含义理解
  2. Lottie动画框架入门及源码简析
  3. Matlab中生成圆形和环形模板
  4. java excel 数据有效性_Java 设置Excel数据验证(数据有效性)
  5. clusterLayer点聚合进阶
  6. python用while计算1~100的 累加和
  7. 项目管理小故事之小矮人的故事
  8. 2017第八届蓝桥杯C/C++ B组省赛
  9. 腾讯云mysql数据库内网连接不上的问题
  10. 魔兽War3 微操技巧(教学)