Controller的不同写法和相应注解
⼀、写法⼀:
@RestController
@RequestMapping("/advertise")
public class AdvertiseController {
@CrossOrigin
@RequestMapping(value = "/add/{id}", method = RequestMethod.POST)
public JSONObject addAdvertise(@RequestBody JSONObject params, @Context HttpServletRequest request, @PathVariable("id") String id) {
1.@PathVariable:
通过@PathVariable可以将URL中占位符参数绑定到控制器处理⽅法的⼊参中:URL中的{xxx}占位符可以通过@PathVariable(“xxx”)绑定到操作⽅法的⼊参中。
2.@RequestBody:
将请求体中的整体数据转化为对象,GET⽅式⽆请求体,所以使⽤@RequestBody接收数据时,前端不能使⽤GET⽅式提交数据,⽽是⽤POST⽅式进⾏提交。
3.@Context:
不太了解这个注解,但是我发现把这个注解去掉也不影响啥。
@RestController
public class HuiController {
@RequestMapping(value="huitest")
public String hui(@RequestBody JSONObject params, HttpServletRequest request) {
String qiang = Parameter("hehe");
String xiao = String("qiang");
return qiang + "<-->" + xiao;
}
}
也可以⽤这个curl命令测试:
curl localhost:8080/huitest -X POST -d '{"qiang":"qie"}' --header "Content-Type: application/json"
4.@CrossOrigin:
是⽤来处理跨域请求的注解
跨域,指的是浏览器不能执⾏其他⽹站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。
所谓同源是指,域名,协议,端⼝均相同,不明⽩没关系,举个栗⼦:
www.123/index.html 调⽤ www.123/server.PHP (⾮跨域)
www.123/index.html 调⽤ www.456/server.php (主域名不同:123/456,跨域)
abc.123/index.html 调⽤ def.123/server.php (⼦域名不同:abc/def,跨域)
www.123:8080/index.html 调⽤ www.123:8081/server.php (端⼝不同:8080/8081,跨域)www.123/index.html 调⽤ www.123/server.php (协议不同:http/https,跨域)
请注意:localhost和127.0.0.1虽然都指向本机,但也属于跨域。
浏览器执⾏javascript脚本时,会检查这个脚本属于哪个页⾯,如果不是同源页⾯,就不会被执⾏。
当域名www.abc下的js代码去访问www.def域名下的资源,就会受到限制。
@CrossOrigin可以处理跨域请求,让你能访问不是⼀个域的⽂件。
5.@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仅作⽤在类级别上
@RestController
@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)的缩写。
如果@RequestMapping不指定请求⽅式则两种请求⽅式都可以。
@RestController
public class HuiController {
@RequestMapping("huitest")
// @PostMapping("huitest") 和 @RequestMapping(value="huitest",method = RequestMethod.POST)等效
/
/ @GetMapping(value="huitest") 和 @RequestMapping(value="huitest",method = RequestMethod.GET)等效
public String hui(HttpServletRequest request) {
String hui = Parameter("hehe");
return hui;
}
}
⽤浏览器直接访问其实是GET请求
6.@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标签请求是返回需要调⽤JSONString(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,不然只会在原来页⾯中显式你要跳转页⾯的名字!
可参考:www.ityouknow/springboot/2016/02/03/spring-boot-web.html
注意:@Contoller注解在springboot1.5以前的版本中在maven配置spring-boot-starter-web(@Contoller引⼊的包是
org.springframework.stereotype.Controller)中有,⽽1.5及以后则没有了。
⼆、写法⼆(其实就是Jersey写Restful接⼝):
@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)
三、其他常⽤注解:
参考:
1.@Bean:
放在⽅法上,⽤@Bean标注⽅法等价于XML中配置bean,这个⽅法⼀般返回⼀个实体对象,告诉spring这⾥产⽣⼀个对象,然后这个对象会交给Spring管理。产⽣这个对象的⽅法Spring只会调⽤⼀次,随后这个Spring将会将这个Bean对象放在⾃⼰的容器中。
2.@Configuration:
标注当前类是配置类,并会将当前类内声明的⼀个或多个以@Bean注解标记的⽅法的实例纳⼊到srping容器中,并且实例名就是⽅法名。(其实就是靠@Component注解),源码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
String value() default "";
}
3.@Resource:
是按照名称来注⼊的,当不到与名称匹配的bean才会按照类型来注⼊。其实我们平时⽤的@Resource都是⽤了他的默认的⽅式,即都不指定名字和类型。spring通过反射机制使⽤byName⽅法⾃动注⼊。
@Resource(type = ShiroService.class, name = "shiroService")
private ShiroService shiroService;
@Resource 的装配顺序:
1. 如果同时指定了 name 属性和 type 属性,那么 Spring 将从容器中唯⼀匹配的 bean 进⾏装配,不到则抛出异常
2. 如果指定了 name 属性值,则从容器中查名称匹配的 bean 进⾏装配,不到则抛出异常
3. 如果指定了 type 属性值,则从容器中查类型匹配的唯⼀的 bean 进⾏装配,不到或者到多个都会抛出异常
4. 如果都不指定,则会⾃动按照 byName ⽅式进⾏装配(我们⼀般都⽤的是这个。。。)
4.@Autowried:
默认是按照类型进⾏装配注⼊,如果允许 null 值,可以设置它 required 为false。即:当不能确定 Spring 容器中⼀定拥有某个类的 Bean 时,可以在需要⾃动注⼊该类 Bean 的地⽅可以使⽤ @Autowired(required = false) ,这等于告诉 Spring:在不到匹配 Bean 时也不报错。
resource和autowired注解的区别@Autowired(required = false)
private ShiroService shiroService;
5.@Qualifier:
@Autowired是根据类型进⾏⾃动装配的。如果当spring上下⽂中存在不⽌⼀个A类型的bean时,就会
抛出BeanCreationException异常;如果Spring上下⽂中不存在A类型的bean,⽽且我们⼜使⽤A类型,也会抛出BeanCreationException异常。针对存在多个A类型的Bean,我们可以联合使⽤@Qualifier和@Autowired来解决这些问题。
@Autowried
@Qualifier("adminDAO")
private AdminDAO adminDAO;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论