SpringMVC 控制器和RestFul

Posted Mq_sir

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC 控制器和RestFul相关的知识,希望对你有一定的参考价值。

SpringMVC 控制器和RestFul

一、控制器Controller

控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现。控制器负责解析用户的请求并将其转换为一个模型。在Spring MVC中一个控制器类可以包含多个方法,对于Controller的配置方式有很多种

在这一篇博客已经介绍了这两种方式的实现SpringMVC构建简单项目

看看两种方式的区别:

通过接口的方式:必须要重写public ModelAndView handleReques方法,一个控制器中只有一个方法,如果要多个方法则需要定义多个Controller;定义的方式比较麻烦;

注解的方式:可以有很多个方法,每个方法都可以返回视图,可以做到复用。

例如这段代码:

我们通过访问不同的路径,实现跳转同一个界面,只要封装的数据部分不一样就可以实现界面的复用了。

@Controller  //为了让Spring IOC容器初始化时自动扫描到
public class MyController {

    //真实访问地址 : 项目名/MyController/hello
    @RequestMapping("/hello")
    public String mao(Model model){
        //封装数据
        model.addAttribute("msg","你好,springmvc");
        return "first";//会被视图解析器处理    //web-inf/jsp/first.jsp
    }

    @RequestMapping("/hey")
    public String mao2(Model model){
        //封装数据
        model.addAttribute("msg","你好2,springmvc2");
        return "first";//会被视图解析器处理    //web-inf/jsp/first.jsp
    }
}

所以我们这里重点介绍Controller的注解实现

  • @Controller :声明此类为控制器类,并交给spring容器管理,这个类中的方法如果返回值是String,并有具体的页面可以跳转,那么就会被视图解析器解析。
  • @RequestMapping("") :声明控制器方法,即配置url地址和方法的映射关系

注解RequestMapping:
1、同时存在类和方法上,那么此时访问的路径就是
http://localhost:8080 / 项目名/ fuqin/erzi
2、只在方法上的时候,那么此时访问的路径就是
http://localhost:8080 / 项目名/erzi

@Controller
@RequestMapping("fuqin")
public class MyController2 {


    @RequestMapping("erzi")
    public String result(Model model){

        model.addAttribute("msg","我是小钱");
        return "first";
    }
}

二、RestFul 风格

1、定义

RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。

2、功能

功能就是使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。

http方法资源操作幂等安全
GETSELECT
POSTINSERT
PUTUPDATE
DELETEDELETE

幂等性:对同一REST接口的多次访问,得到的资源状态是相同的。

安全性:对该REST接口访问,不会使服务器端资源的状态发生改变。

可以用的方法不止这四个:

在这里插入图片描述

3、形式

传统方式操作资源 :通过不同的参数来实现不同的效果!方法单一,post 和 get,例如下面:

http://127.0.0.1/item/queryItem.action?id=1 查询,GET
http://127.0.0.1/item/saveItem.action 新增,POST
http://127.0.0.1/item/updateItem.action 更新,POST
http://127.0.0.1/item/deleteItem.action?id=1 删除,GET或POST

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

http://127.0.0.1/item/1 查询,GET
http://127.0.0.1/item 新增,POST
http://127.0.0.1/item 更新,PUT
http://127.0.0.1/item/1 删除,DELETE

4、使用

下面看看具体是怎么使用的:

  1. 编写一个FestFul控制类
@Controller
public class FestFul {

    @RequestMapping("/add/{a}/{b}")
    public String mao(@PathVariable int a, @PathVariable int b, Model model){
        int c=a+b;
        model.addAttribute("msg",c);
        return "first";
    }
}

@PathVariable 注解,让方法参数的值对应绑定到一个URI模板变量上。
在这里插入图片描述

结果:
通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法,如这里访问是的路径是/commit/2/a,则路径与方法不匹配,而不会是参数转换失败。
在这里插入图片描述

method 方法(重点)的使用

在这里插入图片描述
我们在前面介绍了那么多的方法,那么我们怎么发起不同的请求呢;

这个时候我们就要用到组合注解了,主要有下面这些:

@GetMapping  等效于 @RequestMapping(method =RequestMethod.GET)
@PostMapping  
@PutMapping
@DeleteMapping
@PatchMapping

在这里插入图片描述
编写一个方法测试

@Controller
public class FestFul {


    @RequestMapping(value = "/mao",method = RequestMethod.)
    public String mao2(Model model){
        model.addAttribute("msg",);
        return "first";
    }
       @GetMapping("mao")
    public String mao3(Model model){
        model.addAttribute("msg","我是get请求");
        return "first";
    }
}

当我只有一个mao2()方法的时候,就会报405的错误,浏览器默认执行的Get方法,而我写的Post请求,所以会报错。
在这里插入图片描述
同理,当我添加了一个mao3()方法是Get请求时,就会执行。
在这里插入图片描述

当我在index.jsp中利用表单来提交Post请求时的时候

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <form action="/springmvc_02_annotation_war_exploded/mao" method="post">
    <h2>我的post请求</h2>
    <input type="submit">
  </form>
  </body>
</html>

在这里插入图片描述
结果:
在这里插入图片描述
我们发现地址没有变,这就实现了同一个url路径在不同的请求情况下返回不同的结果的复用了。这就是注解的优点。

今天的学习就到此为止吧!加油!

以上是关于SpringMVC 控制器和RestFul的主要内容,如果未能解决你的问题,请参考以下文章

5SpringMVC:Controller 详解 及 RestFul风格

5SpringMVC:Controller 详解 及 RestFul风格

SpringMVC restful风格

SpringMVC:SpringMVC的RequestMapping注解

Springday05 SpringMVC访问静态资源操作请求域控制器方法返回值JSON数据交互RESTful风格文件上传异常处理拦截器

如何使用 Spring MVC 设计通用响应构建器/RESTful Web 服务?