SpringMVC中Controller层的接口的一些不同写法总结

原文链接:这里

0.前言

不同的人维护同一套代码,不同的代码习惯都能实现最后的功能,但是写法不一样。这篇文章总结一下在controller层常见的接口的一些写法。

1.get与@RequestMapping

用的比较多的是get。

最简单的写法:

@Controller @RequestMapping("/user") public class UserController {   @RequestMapping("/list") public String list() { return "sucess find all users"; } @RequestMapping("/find") public String find() { return "find one"; } }

这是比较基础的写法:

我们可以通过ip+端口+[项目名]+/user/list 来返回所有学生的列表。比如:

localhost:8080/xxx/user/list。

同理,下方find方法也是可以使用的

可以通过localhost:8080/xxx/user/find来执行另一个功能。

但是我们上面的方法没有指定方式,我们给它指定GET请求。

@Controller @RequestMapping("/user") public class UserController {   @RequestMapping("/list",method=RequestMethod.GET) public String list() { return "sucess find all users"; } @RequestMapping(value="/find",method=RequestMethod.GET) @ResponseBody public String find() { return "find one"; } }

注:实际开发中,我们一般加上@ResponseBody,可理解为把 结果放入到HTTP response body 中(数据转换成json格式),便于前端处理数据。

2.get请求传参的几种方法

1.占位符

我们可以定义后台的接口配置占位符,通过配置的占位符来要求前端传递参数。

@Controller @RequestMapping("/user") public class UserController {   @RequestMapping(value="/find/{id}/{name}",method=RequestMethod.GET) @ResponseBody public String find(@PathVariable("id") String id, @PathVariable("name") String name) { return "find one"; } }

RequestMapping中的value中有两个占位符,id和name,表示get请求中应该加入这两个参数的值,可以参考下面的写法来请求后台

localhost:8080/xxx/user/find/1001/zhangsan

2.RequestParam

@Controller @RequestMapping("/user") public class UserController {   @RequestMapping(value="/find",method=RequestMethod.GET) @ResponseBody public String find(@RequestParam("id") String id, @RequestParam(value="name",required=true) String name, @RequestParam(value="age",required=false) String age) { return "find one"; } }

像第一个id这种写法,get请求必须带这个参数。name这种写法,required为true,这种写法也必须带这个参数,而第三个age,可带可不带,那么下面两种写法都是对的。

localhost:8080/xxx/user/find?id=1001&name=zhangsan

localhost:8080/xxx/user/find?id=1001&name=zhangsan&age=11

你如果缺少了必填的参数,则会报错。

当然,对于RequestParam 还有更复杂更详细的用法,但是实际开发中用的不多,稍作了解。

@Controller @RequestMapping("/user") public class UserController {   @RequestMapping(value="/find",method=RequestMethod.GET) @ResponseBody public String find((@RequestParam(defaultValue = "1",required = false,/*value = "ss",*/name = "iddddd") String id) { return "find one"; } }

说明:

(1) @RequestParam,对于参数入参,这个注解可以不必须有,但只能匹配和你定义的入参,完全一样的名称,对应则匹配,不对应就不匹配。
(2)required ,是否必须,默认为 true,也就是说,当@RequestParam存在时,是默认required = true条件的,@RequestParam不存在时,返回 (1) 的解释。
(3)defaultValue ,设置初始值,一般和required = false一起使用,如果不传值,则使用默认值。
(4)value ,和name,一样,给变量起别名,一一对应于前端传的属性名,映射到后端接口变量名,有时前端无法按要求传给你你所希望的变量名,这个就发挥用处了。
(5)name ,和value一样,给变量起别名,两个同时存在时,访问时就会出错。

3.Param

个人用的最多,因为很方便,配合mybaits,需要的参数之间不传(就跟上面的required=false一样的效果)

@Controller @RequestMapping("/user") public class UserController {   @RequestMapping(value="/find",method=RequestMethod.GET) @ResponseBody public String find(@Param("id") String id, @Param("name") String name, @Param("age") String age) { return "find one"; } }

这样写的好处就是不需要的参数不用写,需要什么就写什么,不传递的参数默认就是null,在mybatis中的if语句中直接加判断就可以,比较方便。

3.POST请求的几种写法

post请求的几种写法跟上面类似,只不过我们一般要加上@RequestBody。

比如下面这样

@Controller @RequestMapping("/user") public class UserController {   @RequestMapping(value="/find",method=RequestMethod.POST) @ResponseBody public String find(@RequestBody Student student) { return "find one"; } }

请求参数里加入了RequestBody。那么你前端请求的时候就要构造一个和Student这个实体类一模一样的对象(字段名称必须一一对应,前台给的参数可以少不可以多)

注:实际开发中的增删改查用的非常多,你不用没考虑筛选哪些条件,直接从前台把对象映射到后台的实体类中,由mybaits判断筛选哪些字段,十分好用。像若以那种代码生成器就是这种方式。

当然,觉得实体类麻烦怎么办,我们可以用JSONObject啊。

@Controller @RequestMapping("/user") public class UserController {   @RequestMapping(value="/find",method=RequestMethod.POST) @ResponseBody public String find(@RequestBody JOSNObject student) { return "find one"; } }

这样就可以按照自己喜好随意添加删除字段了。

除此之外,你还可以这么写:

@Controller @RequestMapping("/user") public class UserController {   @RequestMapping(value="/find",method=RequestMethod.POST) @ResponseBody public String find(@RequestBody JOSNObject student, @Param("id") String id ) { return "find one"; } }

也就是你在post请求的时候可以在URL中加参数,而且这个参数可有可无,那么你的请求可以这么写

let url= localhost:8080/xxx/user/find?id=1001

this.http.post(url,{data})

url中加了参数,data是post的内容,由后台的RequestBody接收。

当然,用的不多,一般在接口需要加参数的时候才会这么干,如果一开始设计的好话一般就不这么写了。

 

上一篇:分布式实时分析数据库citus数据查询性能简单对比


下一篇:springmvc中的文件下载以及文件上传