当前位置: 移动技术网 > IT编程>开发语言>Java > spring mvc常用注解_动力节点Java学院整理

spring mvc常用注解_动力节点Java学院整理

2019年07月19日  | 移动技术网IT编程  | 我要评论

spring从2.5版本开始在编程中引入注解,用户可以使用@requestmapping, @requestparam, @modelattribute等等这样类似的注解。到目前为止,spring的版本虽然发生了很大的变化,但注解的特性却是一直延续下来,并不断扩展,让广大的开发人员的双手变的更轻松起来,这都离不开annotation的强大作用,今天我们就一起来看看spring mvc 4中常用的那些注解吧。

1. @controller

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

 <?xml version="1.0" encoding="utf-8"?><beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemalocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">
 
  <context:component-scan base-package="org.springframework.samples.petclinic.web"/>
 
  <!-- ... --></beans>

2. @requestmapping

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

@controller
@requestmapping("/favsoft")
public class annotationcontroller {
   
  @requestmapping(method=requestmethod.get)
  public string get(){
    return "";
  }
   
  @requestmapping(value="/getname", method = requestmethod.get)
  public string getname(string username) {
    return username;
  }
   
  @requestmapping(value="/{day}", method=requestmethod.get)
  public string getday(date day){
    dateformat df = new simpledateformat("yyyy-mm-dd");
    return df.format(day);
  }
   
  @requestmapping(value="/adduser", method=requestmethod.get)
  public string addfavuser(@validated favuser favuser,bindingresult result){
    if(result.haserrors()){
      return "favuser";
    }
    //favuserservice.addfavuser(favuser);
    return "redirect:/favlist";
  }
 
  @requestmapping("/test")
  @responsebody
  public string test(){
    return "aa";
  }
   
}

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

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

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

3. @pathvariable

在spring mvc中,可以使用 @pathvariable 注解方法参数并将其绑定到uri模板变量的值上。如下代码所示:

 string findowner( string , model model) {
  favuser favuser = favuserservice.findfavuser();
  model.addattribute(
   ;
}

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还支持矩阵变量,因为现实场景中用的不多,这就不详细介绍了,有需要的童鞋请查看官网的文档。

4. @requestparam

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

5. @requestbody

@requestbody是指方法参数应该被绑定到http请求body上。

@requestmapping(value = "/something", method = requestmethod.put)public void handle(@requestbody string body, writer writer) throws ioexception {
  writer.write(body);
}

如果觉得@requestbody不如@requestparam趁手,我们可以使用 httpmessageconverter将request的body转移到方法参数上, httmessageconverser将 http请求消息在object对象之间互相转换,但一般情况下不会这么做。事实证明,@requestbody在构建rest架构时,比@requestparam有着更大的优势。

6. @responsebody

@responsebody与@requestbody类似,它的作用是将返回类型直接输入到http response body中。@responsebody在输出json格式的数据时,会经常用到,代码见下图:

@requestmapping(value = "/something", method = requestmethod.put)@responsebodypublic string helloworld() {  return "hello world";
}

7. @restcontroller

我们经常见到一些控制器实现了rest的api,只为服务于json,xml或其它自定义的类型内容,@restcontroller用来创建rest类型的控制器,与@controller类型。@restcontroller就是这样一种类型,它避免了你重复的写@requestmapping与@responsebody。

@restcontroller
public class favrestfulcontroller {
 
@requestmapping(value="/getusername",method=requestmethod.post)
public string getusername(@requestparam(value="name") string name){
return name;
}
}

8. 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);
}

9. @modelattribute

@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模板变量和类型转换器检索属性。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网