您的位置:首页 > 编程语言 > Java开发

spring mvc 注解

2016-04-06 11:58 561 查看
@Restcontroller

它继承自@Controller注解。4.0之前的版本,Spring MVC的组件都使用@Controller来标识当前类是一个控制器servlet。

使用这个特性,我们可以开发REST服务的时候不需要使用@Controller而专门的@RestController。

当你实现一个RESTful web services的时候,response将一直通过response body发送。

@controller



通过@controller标注即可将class定义为一个controller类。

Controller控制器是通过服务接口定义的提供访问应用程序的一种行为,它解释用户的输入,将其转换成一个模型然后将试图呈献给用户。Spring
MVC 使用 @Controller 定义控制器,它还允许自动检测定义在类路径下的组件并自动注册。如想自动检测生效,需在XML头文件下引入 spring-context:

@RequestMapping

我们可以 @RequestMapping 注解将类似 “/favsoft”这样的URL映射到整个类或特定的处理方法上。一般来说,类级别的注解映射特定的请求路径到表单控制器上,而方法级别的注解只是映射为一个特定的HTTP方法请求(“GET”,“POST”等)或HTTP请求参数。



既可以作用在类级别,也可以作用在方法级别。当它定义在类级别时,标明该控制器处理所有的请求都被映射到
/favsoft 路径下。@RequestMapping中可以使用 method 属性标记其所接受的方法类型,如果不指定方法类型的话,可以使用 HTTP GET/POST 方法请求数据,但是一旦指定方法类型,就只能使用该类型获取数据。

可以使用
@Validated与BindingResult联合验证输入的参数,在验证通过和失败的情况下,分别返回不同的视图。

支持使用URI模板访问URL。URI模板像是URL模样的字符串,由一个或多个变量名字组成,当这些变量有值的时候,它就变成了URI。

value表示需要匹配的url的格式。
method表示所需处理请求的http 协议(如get,post,put,delete等),可选值为RequestMethod这个enum的值。
params格式为”paramname=paramvalue” 或 “paramname!=paramvalue”。 表示参数必须等于某值,或者不等于才进入此映射方法。不填写的时候表明不限制
headers用来限定对应的reqeust请求的headers中必须包括的内容,例如headers={"Connection=keep-alive"}, 表示请求头中的connection的值必须为keep-alive。
@RequestParam

将请求的参数绑定到方法中的参数上,如下面的代码所示。其实,即使不配置该参数,注解也会默认使用该参数。如果想自定义指定参数的话,如果将@RequestParam的 required 属性设置为false(如@RequestParam(value="id",required=false))。

value对应表单name空间的值
required是否允许为空
defaultValue默认值
@PathVariable

可以使用 @PathVariable 注解方法参数并将其绑定到URI模板变量的值上

获得地址栏中传的参数 例如:

[java] view
plain copy

print?

@RequestMapping(value="/{groupId}.do")

public void detail(@PathVariable long groupId){

groupRepository.selectOne(groupId);

}

URI模板 “favusers/{favUserId}"指定变量的名字 favUserId ,当控制器处理这个请求的时候, favUserId的值会被设定到URI中。比如,当有一个像“favusers/favccxx”这样的请求时,favUserId的值就是 favccxx。

@PathVariable 可以有多个注解,像下面这样:

@RequestMapping(value="/owners/{ownerId}/pets/{petId}", method=RequestMethod.GET)
public String findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {
    Owner owner = ownerService.findOwner(ownerId);
    Pet pet = owner.getPet(petId);
    model.addAttribute("pet", pet);    
return "displayPet";
}


@PathVariable中的参数可以是任意的简单类型,如int, long, Date等等。Spring会自动将其转换成合适的类型或者抛出 TypeMismatchException异常。当然,我们也可以注册支持额外的数据类型。

如果@PathVariable使用Map<String, String>类型的参数时, Map会填充到所有的URI模板变量中。

@PathVariable支持使用正则表达式,这就决定了它的超强大属性,它能在路径模板中使用占位符,可以设定特定的前缀匹配,后缀匹配等自定义格式。

@PathVariable还支持矩阵变量,因为现实场景中用的不多,这就不详细介绍了,有需要的童鞋请查看官网的文档。

@RequestBody

在参数之前加入@RequestBody注解。用来将指定的客户端发送过来的请求参数的数据格式转换成java实体

[java] view
plain copy

print?

@RequestMapping(value = "/xxxxx.do")

public void create(@RequestBody() String host){

System.out.println("-----------" + host);

}

@RequestHeader

在参数之前加入@RequestHeader注解。用来将指定的请求头信息影射为方法的参数。

[java] view
plain copy

print?

@RequestMapping(value = "/xxxxx.do")

public void create(@RequestHeader() MultiValueMap<String, String> host){

System.out.println("-----------" + host);

}

@ResponseBody

如果这个方法定义了@ResponseBody注解。那么会把返回值转换成这个数据格式,输出给客户端

@ResponseBody与@RequestBody类似,它的作用是将返回类型直接输入到HTTP response body中。@ResponseBody在输出JSON格式的数据时,会经常用到

[java] view
plain copy

print?

@RequestMapping(value = "/xxx.do")

@ResponseBody

public MultiValueMap<String, String> create(@RequestHeader() MultiValueMap<String, String> hosts) throws Exception {

return hosts;

}

@ResponseStatus

返回一个指定的http response状态码。

[java] view
plain copy

print?

@ResponseStatus(reason="no reason",value=HttpStatus.BAD_REQUEST)

@RequestMapping("/responsestatus")

public void responseStatusTest(){

}

@SessionAttributes

写在类级别的注解,定义一个session attributes,属性名字为SessionAttributes指定。可以指定多个(数组),也同时可以指定类型。

[java] view
plain copy

print?

@Controller

@SessionAttributes( { "user" })

@RequestMapping("/test")

public class ControllerTest {

@RequestMapping("/session")

@ResponseBody

public String sessionIn(@ModelAttribute("user") User user) {

return "index";

}

}

@CookieValue

[java] view
plain copy

print?

@RequestMapping("/cookie")

@ResponseBody

public String cookie(@CookieValue("JSESSIONID") String sessionId) {

return sessionId;

}

@InitBinder



在controller中注册一个customer protperty editor以解析request中的参数并通过date bind机制与handler method中的参数做绑定。

[java] view
plain copy

print?

@InitBinder

public void initBinder(WebDataBinder binder) {

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

dateFormat.setLenient(false);

binder.registerCustomEditor(Date.class, new CustomDateEditor(

dateFormat, false));

}

[java] view
plain copy

print?

@RequestMapping("/databind1")

public ModelAndView databind1(Date date) {



}

访问url http://localhost:8080/springmvc/databind1.action?date=2000-01-02
通过initbinder中注册的customeDateEditor类型,自动将2000-01-02转换为日期类型

@ExceptionHandler

[java] view
plain copy

print?

@RequestMapping("/exception")

public void ExceptionTest() throws Exception{

throw new Exception("i don't know");

}

@ExceptionHandler

public String handleException(Exception e,HttpServletRequest request){

System.out.println(e.getMessage());

return "helloworld";

}

HttpEntity

HttpEntity除了能获得request请求和response响应之外,它还能访问请求和响应头,如下所示:

@RequestMapping("/something")
public ResponseEntity<String> handle(HttpEntity<byte[]> requestEntity) throws UnsupportedEncodingException {
    String requestHeader = requestEntity.getHeaders().getFirst("MyRequestHeader"));    
byte[] requestBody = requestEntity.getBody();    
// do something with request header and body

   HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.set("MyResponseHeader", "MyValue");    
return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);
}


@ModelAttribute

可以作用在方法或方法参数上,当它作用在方法上时,标明该方法的目的是添加一个或多个模型属性(model attributes)。该方法支持与@RequestMapping一样的参数类型,但并不能直接映射成请求。控制器中的@ModelAttribute方法会在@RequestMapping方法调用之前而调用,示例如下:

@ModelAttribute
public Account addAccount(@RequestParam String number) {
    return accountManager.findAccount(number);
}

@ModelAttribute
public void populateModel(@RequestParam String number, Model model) {
    model.addAttribute(accountManager.findAccount(number));    
    // add more ...
}


@ModelAttribute方法用来在model中填充属性,如填充下拉列表、宠物类型或检索一个命令对象比如账户(用来在HTML表单上呈现数据)。

@ModelAttribute方法有两种风格:一种是添加隐形属性并返回它。另一种是该方法接受一个模型并添加任意数量的模型属性。用户可以根据自己的需要选择对应的风格。

@ModelAttribute作用在方法参数上

当@ModelAttribute作用在方法参数上时,表明该参数可以在方法模型中检索到。如果该参数不在当前模型中,该参数先被实例化然后添加到模型中。一旦模型中有了该参数,该参数的字段应该填充所有请求参数匹配的名称中。这是Spring MVC中重要的数据绑定机制,它省去了单独解析每个表单字段的时间。

@ModelAttribute是一种很常见的从数据库中检索属性的方法,它通过@SessionAttributes使用request请求存储。在一些情况下,可以很方便的通过URI模板变量和类型转换器检索属性。

注解的出现终结了XML配置文件漫天飞的年代,它让程序拥有更高的可读性,可配置性与灵活性。当然,也有一些人说注解不如配置文件显的结构清晰,个人觉得所谓的结构应该是一个统一的规范,而不是将一堆文件结构糅合在一起。这就好比是面向对象与面向结构,你能说面向对象的逻辑不清晰吗?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: