【SpringMVC 笔记】控制器 Controller 与 RestFul 风格
SpringMVC 笔记
- 控制器 Controller
- 实现 Controller 接口 创建控制器
- @Controller 注解创建控制器
- @RequestMapping
- 使用 method 属性指定请求类型
- @RequestMapping 小结
- RestFul 风格
- @PathVariable
更多内容参见 SpringMVC 学习笔记目录:【Spring MVC】学习笔记汇总
控制器 Controller
- 控制器复杂提供访问应用程序的行为,通常通过 接口定义 或 注解 两种方法实现。
- 控制器负责解析用户的请求并将其转换为一个模型。
- 在 Spring MVC 中一个控制器类可以包含多个方法。
- 在 Spring MVC 中,对于 Controller 的配置方式有很多种。
实现 Controller 接口 创建控制器
Controller
是一个接口,在 org.springframework.web.servlet.mvc
包下,接口中只有一个方法;
// 实现该接口的类获得控制器功能
public interface Controller {// 处理请求且返回一个模型与视图对象ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception;
}
测试使用:
// 定义控制器
// 注意点: 不要导错包,实现 Controller 接口, 重写方法;
public class ControllerTest1 implements Controller {public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {// 返回一个模型视图对象ModelAndView mv = new ModelAndView();mv.addObject("msg","Test1Controller");mv.setViewName("test");return mv;}
}
实现接口 Controller
定义控制器是较老的办法:
- 缺点:一个控制器中只有一个方法,如果要多个方法则需要定义多个 Controller,麻烦。
@Controller 注解创建控制器
@Controller
注解类型用于声明 Spring 类的实例是一个控制器,具体参见 Spring 基础注解;
Spring 可以使用扫描机制来找到应用程序中所有基于注解的控制器类,为了保证 Spring 能找到你的控制器,需要在配置文件中声明组件扫描。
<!-- 自动扫描指定的包,下面所有注解类交给IOC容器管理 -->
<context:component-scan base-package="com.kuang.controller"/>
测试使用:
//@Controller注解的类会自动添加到Spring上下文中
@Controller
public class ControllerTest2 {//映射访问路径@RequestMapping("/t2")public String index(Model model) {//Spring MVC会自动实例化一个Model对象用于向视图中传值model.addAttribute("msg", "ControllerTest2");//返回视图位置return "test";}}
上面两个请求都可以指向一个视图 test.jsp
,但是页面结果的结果是不一样的,从这里可以看出视图是被复用的,而控制器与视图之间是弱耦合关系。
注解方式是平时使用的最多的方式!
@RequestMapping
@RequestMapping
注解用于映射 url 到控制器类或一个特定的处理程序方法,可用于类或方法上。
- 用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
只注解在 方法 上:只需要指定方法的路径即可。
- 以下代码的访问路径:
http://localhost:8080/项目名/h1
@Controller
public class TestController {@RequestMapping("/h1")public String test(){return "test";}
}
同时注解在 类 和 方法 上:需要先指定类上的路径再指定方法的路径。
- 以下代码的访问路径:
http://localhost:8080/项目名/hello/h1
@Controller
@RequestMapping("/hello")
public class TestController {@RequestMapping("/h1")public String test(){return "test";}
}
使用 method 属性指定请求类型
用于约束请求的类型,可以收窄请求范围。
指定请求谓词的类型如 GET
、POST
、HEAD
、OPTIONS
、PUT
、PATCH
、DELETE
、TRACE
等。
测试使用:
// 要求必须是 POST 请求, 则可以通过 method指定
@RequestMapping(value = "/restful", method = {RequestMethod.POST})
public String index2(Model model){model.addAttribute("msg", "hello!");return "test";
}
访问:http://localhost:8080/hello
使用浏览器地址栏进行访问 默认是Get请求,会报错405:
将代码中 method
指定为 GET
或者去除即可访问。
@RequestMapping 小结
Spring MVC 的 @RequestMapping
注解能够处理 HTTP 请求的方法
GET
、PUT
、POST
、DELETE
以及PATCH
。
浏览器的地址栏请求默认都会是 HTTP GET
类型的。
方法级别的注解变体有如下几个:组合注解
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@GetMapping
是一个组合注解,平时使用的会比较多。
- 相当于
@RequestMapping(method =RequestMethod.GET)
的一个快捷方式。
RestFul 风格
Restful 就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
传统方式操作资源:通过不同的参数来实现不同的效果,方法单一,post
和 get
。
http://127.0.0.1/item/queryItem.action?id=1
查询,GEThttp://127.0.0.1/item/saveItem.action
增加,POSThttp://127.0.0.1/item/updateItem.action
更新,POSThttp://127.0.0.1/item/deleteItem.action?id=1
删除,GET 或 POST
使用 RestFul 操作资源 :可以通过不同的请求方式来实现不同的效果。
如下:请求地址一样,但是功能可以不同。
http://127.0.0.1/item/1
查询,GEThttp://127.0.0.1/item
新增,POSThttp://127.0.0.1/item
更新,PUThttp://127.0.0.1/item/1
删除,DELETE
@PathVariable
在 SpringMVC 中可以使用 @PathVariable
注解,让方法参数的值对应绑定到一个URL模板变量上。
@Controller
public class RestFulController {// 映射访问路径@RequestMapping("/commit/{p1}/{p2}")public String index(@PathVariable int p1, @PathVariable int p2, Model model){int result = p1 + p2;// Spring MVC 会自动实例化一个 Model 对象用于向视图中传值model.addAttribute("msg", "结果:" + result);// 返回视图位置return "test";}
}
访问路径:http://localhost:8080/commit/1/2
使用路径变量的好处?
- 使路径变得更加简洁;
- 获得参数更加方便,框架会自动进行类型转换。
- 通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法,如这里访问是的路径是
/commit/1/a
,则路径与方法不匹配,而不会是参数转换失败。
例如上面的代码修改访问路径:http://localhost:8080/commit/1/a
,则会暴 400 错误的请求。
修改下对应的参数类型,再次测试:
// 映射访问路径
@RequestMapping("/commit/{p1}/{p2}")
public String index(@PathVariable int p1, @PathVariable String p2, Model model){String result = p1 + p2;// Spring MVC会自动实例化一个 Model 对象用于向视图中传值model.addAttribute("msg", "结果: " + result);// 返回视图位置return "test";
}
访问路径:http://localhost:8080/commit/1/a
【SpringMVC 笔记】控制器 Controller 与 RestFul 风格相关推荐
- SpringMVC自学日志04(Controller 及 RestFul风格 )
控制器Controller 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现. 控制器负责解析用户的请求并将其转换为一个模型. 在Spring MVC中一个控制器类可以包含多个 ...
- Controller与RestFul风格
1.Controller 在Controller类中使用注解后 视图解析器会自动将该类中返回值为String类型的方法进行解析 将返回的字符串进行url的拼接 在这里面需要注意的是 返回的字符串是需要 ...
- 最全面的SpringMVC教程(四)——Controller 与 RestFul
前言 本文为 [SpringMVC教程]Controller 与 RestFul 相关内容介绍,具体将对控制器Controller,实现Controller接口,使用注解@Controller,Req ...
- SpringMVC笔记(狂神说)
狂神说 1.回顾MVC 1.1什么是MVC MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务逻辑.数据.显示分离的方法来组织代码. M ...
- springMVC获取异步请求的参数,返回异步请求数据(json),跨域访问简单了解,文件上传,与Restful风格
springMVC获取异步请求的参数 JQuery发送异步请求回顾 <a href="javascript:void(0);" id="testAjax" ...
- SpringMVC中RestFul风格
先说一下什么是RestFul风格,以一个链接为例子,如果我们访问一个网页,想要给a和b传参数,传统的方式是?a=1&b=2,而RestFul就是改变了传统的方式,用/a/1/2的形式,达到了简 ...
- Day73.SpringMVC案例:影院系统、使用Restful风格重构
目录 springMVC:影院系统 一.准备SpringMVC环境 二.首页显示所有电影 三.影院案例-删除指定电影信息 四.影院案例-添加新电影 五.影院案例-修改指定电影信息 六.总结 七.Res ...
- SpringMVC基础学习之Restful风格的简单使用
前言: 小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师. 这个SpringM ...
- SpringMVC(三)Restful风格及实例、参数的转换
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.Restful风格 1.Restful风格的介绍 Restful 一种软件架构风格.设计风格,而不是 ...
最新文章
- 九、Swift对象存储服务(双节点搭建)
- 计算机网络·数据链路层.三个基本问题
- pytorch笔记 torch.clamp(截取上下限)
- 论如何学习一门编程语言
- linux查看注册表信息,linux登录档(日志)相关简介
- oracle audit文件,[20191128]oracle Audit文件管理2.txt
- 对编码通俗易懂的介绍
- add script param in pycharm
- 虚拟打印机 android版,Doro PDF Writer
- Linux - grep命令详解
- 【转】android builder.setPositiveButton处 报错
- 如果去掉数学前后的空格_excel表格数据消除前后空格-EXCEL表格中数据后面的空格怎么去掉,一条条手工删......
- netty 通道接口定义
- Java同步锁Synchronized底层源码和原理剖析
- Ubuntu17.04安装Firefox的flash插件
- 科普文章-另一个视角解读计算机编码(修订版)【一个吊丝的个人理解】
- 机器学习——NB算法(包括符号型与数值型两种)
- 个人博客(一)之表结构设计
- OA平台——协同管理与办公自动化
- 《Unity 3.x游戏开发实例》——1.5节欢迎来到Unity 3D
热门文章
- 我并不想劝人创业当老板
- 2020年,把i3 4170升级成e3 1231 v3有必要吗,顺便我想把750Ti换成1650s?
- 【go】atmoic.Value
- try-catch-finally机制
- 获取接口所有IPV6地址和前缀的方法
- sql azure 语法_Azure中的新SQL数据仓库
- oracle ola_Ola HallengrenSQL Server维护解决方案–索引和统计信息维护
- 【quickhybrid】H5和原生的职责划分
- [转] 多线程 《深入浅出 Java Concurrency》目录
- sublime text 3 package control