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接收。

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

上一篇:初学springmvc遇到“源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。“错误


下一篇:springmvc的视图