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方法 | 资源操作 | 幂等 | 安全 |
---|---|---|---|
GET | SELECT | 是 | 是 |
POST | INSERT | 否 | 否 |
PUT | UPDATE | 是 | 否 |
DELETE | DELETE | 是 | 否 |
幂等性:对同一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、使用
下面看看具体是怎么使用的:
- 编写一个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:SpringMVC的RequestMapping注解
Springday05 SpringMVC访问静态资源操作请求域控制器方法返回值JSON数据交互RESTful风格文件上传异常处理拦截器