Spring Controller层
 1. Controller层
 1.1. RestController
- RestController是REST风格API的控制器
| 12
 3
 4
 5
 6
 
 | @RestController@RequestMapping("/story")
 public class StoryController {
 @Autowired
 private StoryService storyService;
 }
 
 | 
- @Controller对应表现层的Bean。这里用RestController,默认类中的方法都会以json的格式返回给前端。
- 使用@Controller注解标识StoryController之后,就表示要把StoryController交给Spring容器管理,在Spring容器中会存在一个名字为"storyController"的bean。
- 如果@Controller不指定名称,则默认的bean名字为这个类的类名首字母小写,如果指定名称【@Controller(value=“StoryController”)】或者【@Controller(“StoryController”)】,则使用value作为bean的名字。
 1.2. RequestMapping
| 12
 3
 4
 5
 6
 
 | @RestController@RequestMapping("/story")
 public class StoryController {
 @Autowired
 private StoryService storyService;
 }
 
 | 
- @RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
- @RequestMapping注解常用属性有:
- value指定请求的地址
- method指定请求类型, GET、POST、PUT、DELETE等
- consumes指定请求的接收内容类型,如application/json, text/html
- produces指定返回内容类型。
- params指定request中必须包含某些参数值,才让该方法处理请求。
- headers指定request中必须包含某些指定的header值,才让该方法处理请求。
 
 1.3. RequestParam
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | @RestController@RequestMapping("/story")
 public class StoryController {
 @Autowired
 private StoryService storyService;
 
 @PostMapping("/exchange")
 public ResultVO<Story> exchangeById(@RequestParam int src_id,@RequestParam int tar_id){…}
 }
 
 | 
- @RequestParam从request里面取参数值。
 使用http://IP:port/story/exchange?src_id=num1&tar_id=num2访问,将num1和num2传递赋值给src_id和tar_id
- Eg.@PostMapping("/url") 等同于@RequestMapping(value = “/url”,method = RequestMethod.POST)
 1.4. PathVariable
| 12
 3
 
 | @GetMapping("/list/{taskId}")
 public ResultVO<List<Story>> getByTask(@PathVariable int taskId){…}
 
 | 
- @PathVariable映射url片段到java方法的参数。
- Eg.使用http://IP:port/story/list/num访问,num将作为参数传递给taskId
- Eg.@GetMapping("/url") 等同于
 @RequestMapping(value = “/url”,method = RequestMethod.GET)
- @PathVariable 支持三种参数
- name 指定绑定参数的名称,要跟URL上面的一样
- required 指定这个参数是不是必须的
- value 跟name一样的作用,是name属性的一个别名
- @RequestParam支持四种参数,加上了defaultValue,表示如果本次请求没有携带这个参数,或者参数为空,那么就会启用默认值
 
 1.5. RequestBody
| 12
 3
 
 | @PostMapping("/create")
 public ResultVO<Story> createStory(@RequestBody StoryVO storyInput){…}
 
 | 
- @RequestBody映射请求体到java方法的参数,一般不用于get请求。
- 前端访问需要传递JSON字符串,字符串定义了StoryVO的属性值。
- ResponseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式,紫萼如到response对象输出指定格式的数据。
- 前端使用ajax访问方式如下示例
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | var data = {"taskId": $("#taskId").val(),
 "name": $("#name").val(),
 "storyPoint": $("#storyPoint").val(),
 "priority": $("#priority").val(),
 "description":
 $("#description").val(),
 "posId": $("#posId").val(),
 "acceptance":
 $("#acceptance").val(),
 "releaseId": $("#iteration").val(),
 }
 $.ajax({
 type: "POST",
 url: "/story/create",
 dataType:"json",
 contentType : ‘application/json’,
 data:JSON.stringify(data),
 success: function (data) {…}
 })
 
 | 
 1.6. GetMapping
| 12
 3
 4
 5
 6
 
 | @GetMapping("/storyMapping")public ModelAndView getMapping(@RequestParam int proId){
 ModelAndView modelAndView = new ModelAndView("storymap");
 modelAndView.addObject("proId",proId);
 return modelAndView;
 }
 
 | 
- controller除了下发操作到数据库,还用于跳转界面,返回值为ModelAndView类型。
- ModelAndView的构造参数storymap是指要跳转的目标页面storymap.html的路径。
- ModelAndView可以携带参数,这个方法传递了proId给目标页面,在storymap.html文件中接收方式如下:
| 12
 3
 
 | <script th:inline="javascript">var proId = [[${proId}]]
 </script>
 
 | 
 2. @RestController和@Controller的区别
官方文档:@RestController is a stereotype annotation that combines @ResponseBody and @Controller.
- @RestController注解相当于@ResponseBody + @Controller合在一起的作用。
 2.1. @Controller
- 这个注解在:org.springframework.stereotype包下,其中被@RequestMapping标记的方法被分发处理器扫描识别,将不同的请求分发得到对应接口。
- 查找方式主要是通过包扫描
- 在这种模式下,需要使用@ResponseBody注解
 3. 参考
- spring注解:@RestController、@Controller、@ResponseBody