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 属性指定请求类型

用于约束请求的类型,可以收窄请求范围。

指定请求谓词的类型如 GETPOSTHEADOPTIONSPUTPATCHDELETETRACE 等。

测试使用:

// 要求必须是 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 请求的方法

  • GETPUTPOSTDELETE 以及 PATCH

浏览器的地址栏请求默认都会是 HTTP GET 类型的。

方法级别的注解变体有如下几个:组合注解

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

@GetMapping 是一个组合注解,平时使用的会比较多。

  • 相当于 @RequestMapping(method =RequestMethod.GET) 的一个快捷方式。

RestFul 风格

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

传统方式操作资源:通过不同的参数来实现不同的效果,方法单一,postget

  • 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

@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 风格相关推荐

  1. SpringMVC自学日志04(Controller 及 RestFul风格 )

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

  2. Controller与RestFul风格

    1.Controller 在Controller类中使用注解后 视图解析器会自动将该类中返回值为String类型的方法进行解析 将返回的字符串进行url的拼接 在这里面需要注意的是 返回的字符串是需要 ...

  3. 最全面的SpringMVC教程(四)——Controller 与 RestFul

    前言 本文为 [SpringMVC教程]Controller 与 RestFul 相关内容介绍,具体将对控制器Controller,实现Controller接口,使用注解@Controller,Req ...

  4. SpringMVC笔记(狂神说)

    狂神说 1.回顾MVC 1.1什么是MVC MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务逻辑.数据.显示分离的方法来组织代码. M ...

  5. springMVC获取异步请求的参数,返回异步请求数据(json),跨域访问简单了解,文件上传,与Restful风格

    springMVC获取异步请求的参数 JQuery发送异步请求回顾 <a href="javascript:void(0);" id="testAjax" ...

  6. SpringMVC中RestFul风格

    先说一下什么是RestFul风格,以一个链接为例子,如果我们访问一个网页,想要给a和b传参数,传统的方式是?a=1&b=2,而RestFul就是改变了传统的方式,用/a/1/2的形式,达到了简 ...

  7. Day73.SpringMVC案例:影院系统、使用Restful风格重构

    目录 springMVC:影院系统 一.准备SpringMVC环境 二.首页显示所有电影 三.影院案例-删除指定电影信息 四.影院案例-添加新电影 五.影院案例-修改指定电影信息 六.总结 七.Res ...

  8. SpringMVC基础学习之Restful风格的简单使用

    前言: 小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师. 这个SpringM ...

  9. SpringMVC(三)Restful风格及实例、参数的转换

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.Restful风格 1.Restful风格的介绍 Restful 一种软件架构风格.设计风格,而不是 ...

最新文章

  1. 九、Swift对象存储服务(双节点搭建)
  2. 计算机网络·数据链路层.三个基本问题
  3. pytorch笔记 torch.clamp(截取上下限)
  4. 论如何学习一门编程语言
  5. linux查看注册表信息,linux登录档(日志)相关简介
  6. oracle audit文件,[20191128]oracle Audit文件管理2.txt
  7. 对编码通俗易懂的介绍
  8. add script param in pycharm
  9. 虚拟打印机 android版,Doro PDF Writer
  10. Linux - grep命令详解
  11. 【转】android builder.setPositiveButton处 报错
  12. 如果去掉数学前后的空格_excel表格数据消除前后空格-EXCEL表格中数据后面的空格怎么去掉,一条条手工删......
  13. netty 通道接口定义
  14. Java同步锁Synchronized底层源码和原理剖析
  15. Ubuntu17.04安装Firefox的flash插件
  16. 科普文章-另一个视角解读计算机编码(修订版)【一个吊丝的个人理解】
  17. 机器学习——NB算法(包括符号型与数值型两种)
  18. 个人博客(一)之表结构设计
  19. OA平台——协同管理与办公自动化
  20. 《Unity 3.x游戏开发实例》——1.5节欢迎来到Unity 3D

热门文章

  1. 我并不想劝人创业当老板
  2. 2020年,把i3 4170升级成e3 1231 v3有必要吗,顺便我想把750Ti换成1650s?
  3. 【go】atmoic.Value
  4. try-catch-finally机制
  5. 获取接口所有IPV6地址和前缀的方法
  6. sql azure 语法_Azure中的新SQL数据仓库
  7. oracle ola_Ola HallengrenSQL Server维护解决方案–索引和统计信息维护
  8. 【quickhybrid】H5和原生的职责划分
  9. [转] 多线程 《深入浅出 Java Concurrency》目录
  10. sublime text 3 package control