控制器Controller
我们通常通过接口或注解定义两种方式实现
1、实现Controller接口
Controller是一个接口,在org.springframework.web.servlet.mvc包下。
@FunctionalInterface
public interface Controller {
//处理请求并返回一个模型与视图对象
@Nullable
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}
实现接口Controller定义控制器是较老的方法
缺点是:一个控制器中只有一个方法,如果要多个方法则需要定义多个Controller;定义的方式比较麻烦!
2、使用注解@Controller
@Controller注解类型用于声明Spring类的实例是一个控制器;还有三个相同的注解!
@Component 组件
@Service Service层
@Controller Controller层
@Repository dao层
Spring可以使用扫描机制来找到对应程序中所有基于注解的控制器类,为了保证Spring能找到控制器,需要在配置文件中声明组件扫描。
<!-- 自动扫描指定的包,下面所有注解类交给IOC容器管理 -->
<context:component-scan base-package="com.star.controller"/>
注意:页面是可以进行复用,但是页面的结果是不一样的,可以多个请求指向一个视图,控制器与视图之间是弱耦合关系。
RestFul风格
概念
RestFul就是一个资源定位及资源操作的风格,不是标准也不是协议,只是一种风格,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
功能
资源:互联网所有的事物都可以被抽象为资源
资源操作:使用POST、DELETE、PUT、GET使用不同方法对资源进行操作。
分别对应:添加、删除、修改、查询
传统操作资源
通过不同的参数来实现不同的效果!方法单一,post和get
- http://127.0.0.1/item/query.action?id=1 查询 GET
- http://127.0.0.1/item/add.action 新增 POST
- http://127.0.0.1/item/update.action 修改 POST
- http://127.0.0.1/item/delete.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
测试
1、新建一个类RestFulController
package com.star.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class RestFulController {
@RequestMapping("/add") //设两个参数a,b,并将结果输出到前端
public String test1(int a, int b, Model model){
int ans = a+b;
model.addAttribute("msg","a + b 的结果:" + ans);
return "hello";
}
}
2、测试请求,我们使用传统的操作:
3、现在我们使用RestFul风格
在Spring MVC中可以使用@PatnVariable注解,让方法参数的值对应绑定到一个URL模板变量上
@Controller
public class RestFulController {
@RequestMapping("/add/{a}/{b}")
public String test1(@PathVariable int a,@PathVariable int b, Model model){
int ans = a+b;
model.addAttribute("msg","a + b 的结果:" + ans);
return "hello";
}
}
4、重启项目,测试请求:
可以看到原来的路径就会报错!url就要改为:/add/a/b
指定请求类型
我们可以使用method属性指定请求类型
用于约束请求的类型,可以收窄请求范围。指定请求谓词的类型如GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE等;
我们进行测试一下:
@Controller
public class RestFulController {
@RequestMapping(value = "/add/{a}/{b}", method = RequestMethod.POST)//指定post请求
public String test1(@PathVariable int a,@PathVariable int b, Model model){
int ans = a+b;
model.addAttribute("msg","a + b 的结果:" + ans);
return "hello";
}
}
我们使用浏览器访问默认是GET请求,会报错:
我们可以使用表单提交post请求,或者将请求改为get
创建一个表单提交页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="add/1/2" method="post">
<input type="submit">
</form>
</body>
</html>
测试请求:
Spring MVC的@RequestMapping注解能够处理HTTP请求的方法,比如GET,PUT,POST,DELETE以及PATCH。
所有的地址请求默认都会是HTTP GET类型的
方法级别的注解有如下几个:组合注解
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@XXXMapping是一个组合注解
相当于@RequestMapping(method = RequestMethod.XXX)的一个快捷方式,通常使用这个!