Spring Mvc 小结

一 . 了解什么是 Spring Mvc

  • Spring MVC 全称为 Spring Web MVC.
  • Spring MVC 是一个 Web 框架.
  • Spring MVC 是基于 Servlet API 构建的.
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,它也是存在于 Spring 框架之中的,通俗的说,它其实就是 Spring 框架中的 Web 模块。 

1.1  MVC 定义
  • MVC 是 Model View Controller 的缩写,它是一种设计模式,这种设计模式把软件系统分为 模型 ,视图 , 控制器 三个基本部分。

  • Model(模型)是应⽤程序中⽤于处理应⽤程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
  • View(视图)是应⽤程序中处理数据显示的部分。通常视图是依据模型数据创建的。
  • Controller(控制器)是应⽤程序中处理⽤户交互的部分。通常控制器负责从视图读取数据,控制⽤户输⼊,并向模型发送数据。
     

二 . 怎么学 Spring MVC?
学习 Spring MVC 我们只需要掌握以下 3 个功能:

  • 连接的功能:实现用户和程序的映射(在浏览器输入URL地址之后,能够在程序中匹配到相应方法)
  • 获取参数的功能:服务器端要得到用户的请求参数
  • 输出数据的功能:服务器端要将结果返回给用户(前端)

对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC。

 2.1 如何实现连接功能呢

我们连接用户和 Java 程序之前, 先要创建一个 Spring MVC 项目, 而 SpringMVC 项目就是基于 Spring MVC 项目本身是基于 Spring Boot 项目的

代码演示

@RestController
public class ControllerTest {
@RequestMapping("/say")
    public String say(){
        return "hello,world";
    }
}

在浏览器输入localhost:8080/say就可以访问代码中所写的方法

  • @Controller :加上@Controller 注解是为了让 spring MVC 项目加载类,  加载类的时候, 才可以调用对应的 hello() 方法. 如果不加 @Controller 注解, 就不能正确访问到本地程序
  • @RequestMapping : 该注解既可以修饰方法, 也可以修饰类. 当它指修饰方法的时候, 只需要通过方法的路由就可以映射到对应的方法; 当修饰类和方法时, 就需要通过类的路由 + 方法的路由一起才能映射到对应的方法. 
  • @ResponseBody :  通常用于返回 JSON 数据。如果不使用这个注解,Spring 会尝试使用 View Resolver 和模板引擎解析并渲染视图,而不是返回纯数据。
     
2.2  @RequestMapping, @GetMapping, @PostMapping 三个注解的区别
@RequestMapping 是 Spring Web 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的路
由映射的。
@RestController
@RequestMapping("/Controller")
// 可以修饰类
public class ControllerTest {
// 也可修饰方法
@RequestMapping("/say")
    public String say(){
        return "hello,world";
    }
}

@RequestMapping 注解是既支持 GET 请求又支持 POST 请求的.

当你的程序想要只支持 GET 请求或者只支持 POST 请求的时候, 就可以使用 @GetMapping 和 @PostMapping 注解, 这俩注解和 @RequestMapping 是类似的用法, 使用相应的请求类型, 是能够正确映射到本地程序的.

Get 请求

// 写法一
@RequestMapping("/hello")
 
// 写法二
@RequestMapping(value="/hello", method=RequestMethod.GET)
 
// 写法三
@GetMapping("/hello")

Poth 请求

// 写法一
@RequestMapping(value = "/hello",method = RequestMethod.POST)
 
// 写法二
@PostMapping("/hello")

2.3 在程序中获取前端传递过来的参数
  • URL 传参(人为的)
  • ajax 传参
  • form 表单传参
2.3.1 传递单个参数
@RestController
@RequestMapping("/Controller")
public class ControllerTest {

@RequestMapping("/say")
    public String say(String name){
        return "name:" + name;
    }
}

其中传的数据类型要用包装类,就算前端没有传数据,也不会报错

2.3.2 传递多个参数
@RestController
@RequestMapping("/Controller")
public class ControllerTest {
@RequestMapping("/say")
    public String say(String name,Integer id){
        return "id:" + id + " name:" + name;
    }
}

 2.3.3 获取对象

@Data
public class User {
    private int id;
    private String name;
    private int age;
}
@RequestMapping("/user")
    public String user(User user){
    return user.toString();
    }

  • 1. 当前端传递成百上千个参数的时候, 我们就不再使用接收多个变量的方式了, 而是直接封装成对象来接收, 此时 Spring MVC 就会去这个实体类里解析它所有的属性, 然后调用属性的 setter 方法, 将传递过来的值根据 key 值设置进去.
  • 2. 当某一天, 前端又突然加了几个参数时, 我们的方法是不需要做出改变的, 只需要给实体类 User 中扩充属性即可.(参数名要保证一致!!!)
  • 3. 参数名是大小写敏感的, 如果大小写不一样, 依然获取不到参数. 建议全部使用小写, 不要使用小驼峰.
     

 2.3.4  获取JSON 对象

  

2.3.5 上传文件
@Slf4j
@Controller  // 加载并注册类
@ResponseBody // 当前类返回的是非静态页面
@RequestMapping("/web") // 使用 "/web" 可以访问到当前类 (可省略)
public class WebController2 {
    //获取配置文件的保存路径
    @Value("${img.path}")
    private String imgpath;  //imgpath通过注解获取到了文件保存的路径
    //上传文件
    @RequestMapping("/upload") // 使用 "/web" + "/hello" 可以访问到当前方法
    public boolean upload(String name, @RequestPart("myfile")MultipartFile file) throws IOException {
        boolean result = false;
        //得到原图片的名称
        String filename = file.getOriginalFilename();
        //得到图片后缀(png)
        filename = filename.substring(filename.lastIndexOf("."));
        //生成不重名的文件名
        filename = UUID.randomUUID().toString() + filename;
        try {
            //将图片保存
            file.transferTo(new File( imgpath+ filename));
            result = true;
        } catch (IOException e) {
            log.error("图片上传失败!" + e.getMessage());
        }
        return result;
    }
}

为什么一定要拿到用户上传的文件后缀格式呢?

答:用户上传的文件不仅仅是 " xxx.png “,” xxx.jpg ",还有可能是 " xxx.mp4 “,” xxx.gif " …如果我们需要 " UUID " 生成一个独一无二的名字,就需要获取文件格式。因为根据用户上传的特定格式,后端必须定义相同的文件格式,只是名字发生变化而已。所以,我们就可以通过 " 截取字符串 " 的经典方式来实现
 

2.3.6 获取 Cookie/Session/Header

  @RequestMapping("/getcookie")
    public String getCookie(@CookieValue(value = "java", required = false)
                                    String ck) {
        return ck;
    }
   @RequestMapping("/get_sess")
    public String getSess(@SessionAttribute(required = false, value = "SESSION_KEY") String name) {
        return name;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值