@Controller
表明该类会作为与前端作交互的控制层组件,通过服务接口定义的提供访问应用程序的一种行为,解释用户的输入,将其转换成一个模型然后将试图呈献给用户。定义控制器,它还允许自动检测定义在类路径下的组件(配置文件中配置扫描路径)并自动注册。
@RequestMapping
这个注解用于将url映射到整个处理类或者特定的处理请求的方法。可以只用通配符!
@Controller
@RequestMapping("/happy")
public class HappyController {
@Autowired
private HappyService happyService;
@RequestMapping(/hello/*)
public void sayHello(){
//请求为 /happy/hello/* 都会进入这个方法!
//例如:/happy/hello/123 /happy/hello/adb
//可以通过get/post 请求
}
@RequestMapping(value="/haha",method=RequestMethod.GET)
public void sayHaHa(){
//只能通过get请求
}
...
}
@RequestMapping 既可以作用在类级别,也可以作用在方法级别。当它定义在类级别时,标明该控制器处理所有的请求都被映射到 /favsoft 路径下。@RequestMapping中可以使用 method 属性标记其所接受的方法类型(get、post、put、delete),如果不指定方法类型的话,可以使用 HTTP GET/POST 方法请求数据,但是一旦指定方法类型,就只能使用该类型获取数据。
@RequestParam
将请求的参数绑定到方法中的参数上
有required参数,默认情况下,required=true,也就是该参数必须要传。如果该参数可以传可不传,可以配置required=false。
@RequestMapping("/happy")
public String sayHappy(
@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "age", required = true) String age) {
//age参数必须传 ,name可传可不传
...
}
@PathVariable
该注解用于方法修饰方法参数,会将修饰的方法参数变为可供使用的uri变量(可用于动态绑定)。
看我下面的6解释
@RequestMapping(value="/happy/{dayid}",method=RequestMethod.GET)
public String findPet(@PathVariable String dayid, Model mode) {
//使用@PathVariable注解绑定 {dayid} 到String dayid
}
@PathVariable中的参数可以是任意的简单类型,如int, long, Date等等。Spring会自动将其转换成合适的类型或者抛出 TypeMismatchException异常。当然,我们也可以注册支持额外的数据类型。
@PathVariable支持使用正则表达式,这就决定了它的超强大属性,它能在路径模板中使用占位符,可以设定特定的前缀匹配,后缀匹配等自定义格式。
@RequestBody
方法参数应该被绑定到HTTP请求Body上。
@RequestMapping(value = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body,@RequestBody User user){
//可以绑定自定义的对象类型
}
@ResponseBody
@ResponseBody与@RequestBody类似,它的作用是将返回类型直接输入到HTTP 响应Body中。
@ResponseBody在输出JSON格式的数据时,会经常用到。
@RequestMapping(value = "/happy", method =RequestMethod.POST)
@ResponseBody
public String helloWorld() {
return "Hello World";//返回String类型
}
@RestController
控制器实现了REST的API,只为服务于JSON,XML或其它自定义的类型内容,@RestController用来创建REST类型的控制器,与@Controller类型。@RestController就是这样一种类型,它避免了你重复的写@RequestMapping与@ResponseBody。
[
](https://blog.csdn.net/u010648555/article/details/76299467)
5. @RestController
@RestController = @ResponseBody + @Controller
@Controller 配合视图解析器InternalResourceViewResolver,返回指定页面(jsp、html)
在对应方法上加@ResponseBody,则视图解析器不起作用,返回JSON或XML或自定义mediaType内容
类上+@RestController = 类上+@Controller + 方法上+@ResponseBody,返回JSON等内容
6. @RequestParam,@PathVariable和@RequestBody三者区别
@RequestParam
获取参数,即是获取传送过来的参数;例如获取下面链接的id
参数值——用于get请求
获取id下来并且作为形参传给方法体里面的id
//链接(注意链接格式区别)
http://localhost:8090/hello?id=2
//使用@RequestParam注解获取id
public String Demo1(@RequestParam String id){
System.out.println("链接中请求参数的id:"+id);
return null;
}
@PathVariable
路径变量,作用是将路径上的id获取进来传递给方法体里面的形参id,但是变量名称必须一样
//链接(注意比较上面一条链接)
http://localhost:8090/hello/2
//使用@PathVariable注解获取id
@RequestMapping(value = "/getBook/{id}", method = RequestMethod.GET)
public String getBook(@PathVariable Integer id) {
try {
system.out.println("路径上的id:"+id);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
@RequestBody
主要是用来处理content-type:"application/json charset=utf-8"
或者 content-type:"application/xml charset=utf-8"
两种请求数据,一般是异步请求用的比较多些
此时@requestBody
注解就可以获取到请求中的各个参数然后赋值到相对应的方法形参上,另外,当有一个实体类**User**
包含了id
和name
的元素的话,在方法里面直接可以写@requestBody User user
就会自动封装好给我们使用的了,不用麻烦像这样@requestBody Integer id, @requestBody String name
一个一个的封装
//异步请求部分代码
$.ajax({
url:"/hello",
type:"POST",
data:'{"id":"123","name":"chenyc"}',
content-type:"application/json charset=utf-8",
success:function(data){
alert(data);
}
});
//@requestBody注解获取数据代码
@requestMapping("/hello")
public String hello(@requestBody Integer id,@requestBody String name){
System.out.println("id:"+id+";"+"name:"+name);
}
@ModelAttribute
@ModelAttribute可以作用在方法或方法参数上,当它作用在方法上时,标明该方法的目的是添加一个或多个模型属性(model attributes)。
该方法支持与@RequestMapping一样的参数类型,但并不能直接映射成请求。控制器中的@ModelAttribute方法会在@RequestMapping方法调用之前而调用。