写法一:
@RestController
@RequestMapping("/advertise")
public class AdvertiseController {
@ResponseBody
@CrossOrigin
@RequestMapping(value = "/add", method = RequestMethod.POST)
public JSONObject addAdvertise(@RequestBody JSONObject params, @Context HttpServletRequest request) {
1.@RequestBody:
读取请求body里面的值映射成参数
2.@CrossOrigin:
是用来处理跨域请求的注解
跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。
所谓同源是指,域名,协议,端口均相同,不明白没关系,举个栗子:
http://www.123.com/index.html 调用 http://www.123.com/server.PHP (非跨域)
http://www.123.com/index.html 调用 http://www.456.com/server.php (主域名不同:123/456,跨域)
http://abc.123.com/index.html 调用 http://def.123.com/server.php (子域名不同:abc/def,跨域)
http://www.123.com:8080/index.html 调用 http://www.123.com:8081/server.php (端口不同:8080/8081,跨域)
http://www.123.com/index.html 调用 https://www.123.com/server.php (协议不同:http/https,跨域)
请注意:localhost和127.0.0.1虽然都指向本机,但也属于跨域。
浏览器执行javascript脚本时,会检查这个脚本属于哪个页面,如果不是同源页面,就不会被执行。
当域名www.abc.com下的js代码去访问www.def.com域名下的资源,就会受到限制。
@CrossOrigin可以处理跨域请求,让你能访问不是一个域的文件。
3.@RequestMapping:
配置url映射,此注解即可以作用在控制器的某个方法上,也可以作用在此控制器类上。
当控制器在类级别上添加@RequestMapping注解时,这个注解会应用到控制器的所有处理器方法上。处理器方法上的@RequestMapping注解会对类级别上的@RequestMapping的声明进行补充。
例子一:@RequestMapping仅作用在处理器方法上
@RestController
public class HelloController {
@RequestMapping(value="/hello",method= RequestMethod.GET)
public String sayHello(){
return "hello";
}
}
以上代码sayHello所响应的url=localhost:8080/hello。
例子二:@RequestMapping仅作用在类级别上
@Controller
@RequestMapping("/hello")
public class HelloController {
@RequestMapping(method= RequestMethod.GET)
public String sayHello(){
return "hello";
}
}
以上代码sayHello所响应的url=localhost:8080/hello,效果与例子一一样,没有改变任何功能。
例子三:@RequestMapping作用在类级别和处理器方法上
@RestController
@RequestMapping("/hello")
public class HelloController {
@RequestMapping(value="/sayHello",method= RequestMethod.GET)
public String sayHello(){
return "hello";
}
@RequestMapping(value="/sayHi",method= RequestMethod.GET)
public String sayHi(){
return "hi";
}
}
这样,以上代码中的sayHello所响应的url=localhost:8080/hello/sayHello。
sayHi所响应的url=localhost:8080/hello/sayHi。
@RequestMapping 和 @GetMapping @PostMapping 区别:
@GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。
@PostMapping是一个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。
4.@RestController:
在spring4.0之后,引入了@RestController这个注解。这个注解相当于把@ResponseBody + @Controller合在一起。
我们先来看一下@RestController的源码:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
String value() default "";
}
前端在通过表单提交和a标签请求后端的时候只需要注解@Controller即可,但是在通过Ajax请求后端的时候,还需要增加一个@ResponseBody注解,但是在spring4.0之后,无论是表单还是a标签还是Ajax请求后端,都只要@RestController一个注解即可。
@ResponseBody能将对象自动转换为json字符串,所以以往在Ajax返回时直接返回一个对象就行,而在表单和a标签请求是返回需要调用JSON.toJSONString(object)这个方法将对象转换为json字符串。
在spring4.0后,所有请求在@RestController之下,直接返回对象即可,再也不需要转换为json字符串了。
@RestController
public class HelloController {
@RequestMapping(value="/hello",method= RequestMethod.GET)
public String sayHello(){
return "hello";
}
}
与下面的代码作用一样
@Controller
@ResponseBody
public class HelloController {
@RequestMapping(value="/hello",method= RequestMethod.GET)
public String sayHello(){
return "hello";
}
}
使用了@RestController之后,所有返回的数据他都会把你解析为json字符串,所以如果是前后台不分开式开发(即返回的是跳转页面名字)时,不能使用@RestContoller,不然只会在原来页面中显式你要跳转页面的名字!
可参考:http://www.ityouknow.com/springboot/2016/02/03/spring-boot-web.html
写法二:
@Path("/admin")
@Component
public class ManagementResource {
@POST
@Path("/login")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@CrossOrigin
public Response login(JSONObject params, @Context HttpServletRequest request) {
1.@Component:
使用@Component是让该类能够在其他地方被依赖使用,即可以直接在其他地方使用@Autowired来创建其实例对象。
2.@Produces:
@Produces注释用来指定将要返回给client端的数据标识类型(MIME)。@Produces可以作为class注释,也可以作为方法注释,方法的@Produces注释将会覆盖class的注释。
a.返回给client字符串类型(text/plain)
@Produces(MediaType.TEXT_PLAIN)
b.返回给client为json类型(application/json)
@Produces(MediaType.APPLICATION_JSON)
3.@Consumes:
@Consumes与@Produces相反,用来指定可以接受client发送过来的MIME类型,同样可以用于class或者method,也可以指定多个MIME类型,一般用于@PUT,@POST
a.接受client参数为字符串类型
@Consumes(MediaType.TEXT_PLAIN)
b.接受clent参数为json类型
@Consumes(MediaType.APPLICATION_JSON)