spring注解3

80 阅读3分钟

1.@CrossOrigin

是Cross-Origin ResourceSharing(跨域资源共享)的简写

作用是解决跨域访问的问题,在Spring4.2以上的版本可直接使用。在类上或方法上添加该注解

例如:

@CrossOrigin
public class TestController extends BaseController {
XXXX
}

如果失效则可能方法没解决是GET还是POST方式,指定即可解决问题。

2.@RequestParam

作用是提取和解析请求中的参数。@RequestParam支持类型转换,类型转换目前支持所有的基本Java类型

@RequestParam([value="number"], [required=false]) String number

将请求中参数为number映射到方法的number上。required=false表示该参数不是必需的,请求上可带可不带。

17.@PathVariable,@RequestHeader,@CookieValue,@RequestParam, @RequestBody,@SessionAttributes, @ModelAttribute

@PathVariable:处理requet uri部分,当使用@RequestMapping URI template 样式映射时, 即someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上

例如:

@Controller 
@RequestMapping("/owners/{a}") 
public class RelativePathUriTemplateController { 
  @RequestMapping("/pets/{b}") 
  public void findPet(@PathVariable("a") String a,@PathVariable String b, Model model) {     
    // implementation omitted 
  } 
}

@RequestHeader@CookieValue: 处理request header部分的注解

将头部信息绑定到方法参数上:

@RequestMapping("/test") 
public void displayHeaderInfo(@RequestHeader("Accept-Encoding") String encoding, 
                              @RequestHeader("Keep-Alive")long keepAlive)  { 

  //... 

}

//将cookie里JSESSIONID绑定到方法参数上

@RequestMapping("/test")  
public void displayHeaderInfo(@CookieValue("JSESSIONID") String cookie)  {  

  //...  

}

3.@Scope

配置bean的作用域。

@Controller

@RequestMapping("/test")

@Scope("prototype")

public class TestController {





}

默认是单例模式,即@Scope("singleton"),

singleton:单例,即容器里只有一个实例对象。

prototype:多对象,每一次请求都会产生一个新的bean实例,Spring不无法对一个prototype bean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,由程序员负责销毁该对象,不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用

request:对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效

web.xml增加如下配置:

<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
  </listener>

session:该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效。也要在web.xml配置如下代码:

<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
  </listener>

global session:作用不大,可不用管他。

4.@ResponseStatus

@ResponseStatus用于修饰一个类或者一个方法,修饰一个类的时候,一般修饰的是一个异常类,当处理器的方法被调用时,@ResponseStatus指定的code和reason会被返回给前端。value属性是http状态码,比如404,500等。reason是错误信息

当修改类或方法时,只要该类得到调用,那么value和reason都会被添加到response里

例如:

@ResponseStatus(value=HttpStatus.FORBIDDEN, reason="出现了错误")
public class UserException extends RuntimeException{
XXXXX
}

当某处抛出UserException时,则会把value和reason返回给前端。

@RequestMapping("/testResponseStatus")
    public String testResponseStatus(int i){
        if(i==0)
            throw new UserNotMatchException();
        return "hello";
}

修改方法:

@ControllerAdvice
@Component
public class GlobalExceptionHandler {
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        return new MethodValidationPostProcessor();
    }
@ExceptionHandler
@ResponseBody
@ResponseStatus(value=HttpStatus.BAD_REQUEST,reason="哈哈")
public String handle(ValidationException exception) {
    System.out.println("bad request, " + exception.getMessage());
    return "bad request, " + exception.getMessage();
}
}

结果如下:

正如上面所说,该方法得到调用,不论是否抛异常,都会把value和reason添加到response里。

总结:@ResponseStatus是为了在方法或类得到调用时将指定的code和reason添加到response里返前端,就像服务器常给我们报的404错误一样,我们可以自己指定高逼格错误提示。

5.@RestController

@RestController = @Controller + @ResponseBody。

是2个注解的合并效果,即指定了该controller是组件,又指定方法返回的是String或json类型数据,不会解决成jsp页面,注定不够灵活,如果一个Controller即有SpringMVC返回视图的方法,又有返回json数据的方法即使用@RestController太死板。

灵活的作法是:定义controller的时候,直接使用@Controller,如果需要返回json可以直接在方法中添加@ResponseBody