ssm:myBatis Spring SpringMVC MVC三层架构

javaSE:一般老师带

javaWeb:一般老师带

框架:研究官方文档,锻炼自学能力,锻炼笔记能力,锻炼项目能力

SpringMVC+Vue+SpringBoot+SpringClude+Linux

Spring:IOC和AOP是比较重要的,如果忘记了一定要回去重新学习

SpringMVC:SpringMVC的执行流程(也非常重要)

SpringMVC:SSM框架整合!

1,什么是MVC?

  1. M

    数据和业务

  2. V

    视图层

  3. C

    交接控制层

模型(dao,servisce) 视图(jsp) 控制器(Servlet),它是一种软件设计规范,它不是一种设计模式,而是一种架构模式,所以不同的MVC是存在着差异的

dao

service

servlet:转发,重定向

jsp/html

前端 数据传输 实体类

 ​
 实体类:用户名,密码,生日,爱好
 ​
 前端:用户名,密码
 实体类有很多属性,但是前端登录时只需要两个属性,所以没有必要封装成一个对象进行处理

这时候我们就可继续细分pojo:

  • pojo:User(这里面有一个user所有的属性)

  • vo:userVo(但是这里面只有user视图层的相关属性)

  • dto:userDto(关于user数据传输层面的相关属性)

  • dao:

  • do:

  • bo:

在Modol1:JSP:本质就是一个Servlet(jsp职责不单一,职责过重,不便于维护)

面试题:
 会问你:你项目的架构,是设计好的,还是演进的?
 1,肯定不能回答是设计好的
 2,Alibab 刚开始是买的国外的一个PHP网站
 3,随着用户大,转变使用了Java
 4,王坚(一个人) 因为IOE的花销很大,所以去除了IOE 使用了MySQL
 5,All in one----->微服务

1.1,MVC框架需要做哪些事情?

  1. 将url映射到java类或者java类的方法

  2. 封装用户提交的数据

  3. 处理请求--调用相应的业务处理--封装响应数据

  4. 将相应的数据进行渲染.jsp/html等表示层数据

1.2,MVC演化的框架

MVVM:M V VM(也是三层架构) VM--ViewModel(双向绑定)这个是前后端分离的核心

1.3,SpringMVC的特点

  1. 轻量级,简单易学

  2. 高效,基于请求响应的MVC框架

  3. 与Spring兼容性好,无缝衔接

  4. 约定优于配置

  5. 功能强大:RESTful,数据验证,格式化,本地化,主题等

  6. 简洁灵活

2,回顾Servlet

  1. 先创建maven项目,然后导入依赖

     <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>4.13.2</version>
     </dependency>
     <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-webmvc</artifactId>
         <version>5.3.23</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>
  2. 建立一个子项目,然后添加web框架,导入该子项目的相应依赖

  3. 编写一个Servlet类,用来处理用户的请求

3,springmvc-hello

3.1,springmvc-servlet配置文件

     <context:component-scan base-package="com.springmvc.controller"/>
     <mvc:default-servlet-handler/>
     <mvc:annotation-driven/>
     <bean               class="org.springframework.web.servlet.view.InternalResourceViewResolver"id="internalResourceViewResolver">
         <property name="prefix" value="/WEB-INF/jsp/"/>
         <property name="suffix" value=".jsp"/>
     </bean>

4,Controller以及RestFul风格

4.1,控制器Controller

  • 控制器复杂提供访问应用程序的行为,通常通过接口定义或者注解定义两种方法实现

  • 控制器负责解析用户的请求并将其转化为一个模型

  • 在Spring MVC中一个控制器可以包含多个方法

  • 在Spring MVC中对于Controller的配置方式有很多种

    1. 去实现一个Controller接口,但是这种方法比较慢,而且一个Controller中只能实现一种方法,而且需要额外的去xml中配置bean

    2. 或者使用Controller注释,一个Controller中可以实现很多方法,而且不用额外去配置bean

 @Component  组件
 @Service    service
 @Controller controller
 @Repository dao

4.2,RequestMapping

@RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法,可用于类或者方法上。用于类上,表示类中所有响应请求的方法都是以该地址作为父路径

4.3,RestFul风格

  1. 概念:是一个资源定位以及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制

  2. 功能:

    • 资源:互联网所有的事务都可以被抽象为资源

    • 资源操作:使用POST,DELEDE,PUT,GET,使用不同方法对资源进行操作

    • 分别对应添加,删除,修改,查询。

  3. 传统方法操作资源:通过不同的参数来实现不同的效果!方法单一,post和get,传参的方式是问号后面加入参数

  4. 使用RestFul风格:可以通过不同的请求方式来实现不同的效果!如下:请求地址一样,但是功能可以不同

简单来讲,就是用不同的提交方法来产生不同的效果

@PathVariable:路径变量注释,通过这个注解,就可以让方法参数的值对应绑定到一个URL模板变量上。

 @RequestMapping("/add/{a}/{b}")
 public String test2(@PathVariable int a, @PathVariable int b,Model model){
     int res = a + b;
     model.addAttribute("msg","结果是:"+res);
     return "text";
 }

特点:

  • 使路径变得更加简洁;

  • 获得参数更加方便,框架会自动进行类型转换;

  • 通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法

插:小黄鸭调试法

  • 场景一:

    我们都有过向别人(甚至可能向完全不会编程的人)提问以及解释编程问题的经历,但是很多时候就在我们解释的过程中自己却想到了问题的解决方案,然后对方一脸茫然;

  • 场景二:

    你的同行跑来问你问题,但是当他把问题说完,说这说到一半的时候就想出答案走了,留下一脸茫然地你

4.4,转发与重定向(有视图解析器)

  •  //这个就是默认情况下,是转发
     @GetMapping( "/add/{a}/{b}")
     public String test2(@PathVariable int a, @PathVariable int b,Model model){
         int res = a + b;
         model.addAttribute("msg","结果2是:"+res);
         return "text";
     }

  •  //这个是重定向
     @GetMapping( "/add/{a}/{b}")
     public String test2(@PathVariable int a, @PathVariable int b,Model model){
         int res = a + b;
         model.addAttribute("msg","结果2是:"+res);
         return "redirect:/text.jsp";
     }

5,数据处理

5.1,处理提交数据

  1. 提交的域名城和处理方法的参数名字一致

    ........?name = lxl

     //处理方法就是
        @RequestMapping("/add")
         public String test1(String name) {
             System.out.println(name);
             return "text";
         }
  2. 提交的域名城和处理方法的参数名不一致

    ........?username = lxl

     //处理方法就是
        @RequestMapping("/add")
         public String test1(@RequestParam("username") String name) {
             System.out.println(name);
             return "text";
         }
  3. 前端提交的是一个对象

    要求提交的表单域和对象的属性名一致,参数使用对象即可

     <form action="${pageContext.request.contextPath}+/user/getUser" method="post">
         <label>
             <input name="id" type="text" value="请输入id">
         </label>
         <label>
             <input name="name" type="text" value="请输入name">
         </label>
         <label>
             <input name="age" type="text" value="请输入age">
         </label>
         <input type="submit" value="提交">
     </form>
  •  @PostMapping("/getUser")
     public String getUser(User user){
         System.out.println(user);
         return "text";
     }

注意:如果使用对象的话,前端传递的参数名要和对象里面的属性名是一致的,否则就是null

5.2,数据显示到前端

第一种:通过ModelAndView(没用Controller注释)

我们前面一直都是如此,就不过多解释

 String result = "HelloSpringMVC";
 modelAndView.addObject("msg",result);

第二种:通过Model(使用了Cotroller注释)

这个在我们前面也一直使用

 model.addAttribute("msg", name);

第三种:通过ModelMap

对比:

  • Model只有寥寥几个方法,只适合用于储存数据,简化了新手对于 Model对象的操作和理解

  • ModelMap:继承了LinkedMap,除了实现自身的一些方法,同样继承了LinkedMap的方法和特性

  • ModelAndView:可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转

5.3,乱码问题

之前都是自己写一个过滤器类,然后处理乱码,现在可以直接使用Spring提供的类,只用在web.xml中配置就行

 <filter>
     <filter-name>encoding</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>encoding</filter-name>
     <url-pattern>/*</url-pattern>
 </filter-mapping>

6,JSON

6.1,什么是JSON

前后端分离时代:后端部署后端,提供接口,提供数据

json

前端独立部署,负责渲染后端的数据

  • 是一种轻量级的数据交换格式,目前使用的很广泛

  • 采用完全独立于编程语言的文本格式来储存和表示数据

  • 简介和清晰的层次结构使得JSON成为理想的数据交换语言

  • 易于人阅读和编写,同时也易于机器解析和生成,并有效的提升网络传输效率

在JavaScript语言中,一切都是对象。因此,任何javaScript支持的类型都可以通过JSON来表示,例如字符串,数字,对象,数组等,看看他的语法格式:

  • 对象表示为键值对,数据由逗号分割

  • 花括号保存对象

  • 方括号保存数组

JSON键值对:

是用来保存JavaScript对象的一种方式

 {"name":"lxl"}
 {"age":"18"}
 {"sex":"男"}

6.2,js对象和json对象相互转换

 //将js对象转化为json对象
         const json = JSON.stringify(user);
 //将json对象转化为js对象
         const obj = JSON.parse(json);

6.3,Controller返回JSON数据

  • jackson应该是目前比较好的json解析工具了

  • 当然工具不止这一个,比如还有阿里巴巴的fastjson等等

  • 我们这里使用jackson,使用它需要导入他的jar包

6.4,json乱码问题

 //解决方案
 @RequestMapping(value = "/j1",produces = "application/json;charset=UTF-8")

上面的方法每一个Controller都需要添加,很麻烦,我们可以统一解决

我们可以在Springmvc的配置文件上添加一段消息StringHttpMessageConverter转换配置

6.5,FastJson

他是阿里开发的一个专门用于java开发的包,可以方便的实现json对象和javabean对象的转换

里面有三个比较重要的类:

  1. JSONObject-代表了json对象

    • JSONObject实现了Map接口

    • JSONObject对应json对象,通过各种形式的get()方法可以获取json对象中的数据,也可以利用诸如sixe(),isEmpty()等方法获取“键:值”对的个数和判断是否为空。其本质是通过实现Map接口并调用接口中的方法完成的

  2. JSONArray-代表json对象数组

    • 内部使用List接口中的方法来完成操作的

  3. JSON-代表JSONObject和JSONArray之间的转化

    • JSON类源码分析与使用

    • 仔细观察这些方法,主要是实现json对象,json对象数组,javabean对象,json字符串之间的互相转化

7,SpringMVC:整合SSM

7.1,环境要求

  • IDEA

  • Mysql

  • tomcat

  • Maven

7.2,数据库环境

创建一个存放书籍额数据库表

8,SpringMVC:Ajax技术

简介:

  • ajax是异步的javascript和XML

  • 是一种无需重新加载整个网页的情况下,能够更新部分网页的技术

  • ajax不是一种新的编程语言,而是一种用于创建更好更快已经交互性更强的Web应用程序的技术