Spring MVC 经常使用注解

Spring MVC 经常使用注解

@RequestMapping注解

这个注解类型指示Spring用哪个类或方法来处理请求动做,该注解能够用于类或方法;html

@RequestMapping注解支持的属性java

  • value属性
这个属性将URL映射到方法上,因为value属性是@RequestMapping注解的默认属性,所以若是只有惟一属性,则能够省略属性名;即以下两个标注含义相同:
@RequestMapping("value="/hello")
@RequestMapping("/hello")

但若是超过一个属性,就必须写上value属性名称git

  • method属性
该属性用来指示该方法仅仅处理哪些HTTP请求方式,若是没有指定method属性值,则请求处理方法能够处理任意的HTTP请求方式。
  • consumes 属性
该属性指定处理请求的提交内容类型(Content-Type)
@RequestMapping(value="/hello",method=RequestMethod.POST, consumes="application/json")
表示方法仅处理request Content-Type 为"application/json"类型的请求。
  • produces属性
该属性指定返回的内容类型,返回的内容类型必须是request请求头(Accept)中所包含的类型。
@RequestMapping(value="/hello",method=RequestMethod.POST, produces="application/json")
方法仅处理request请求中Accept头中包含了"application/json"的请求,同时指明了返回的内容类型为application/json。
  • params属性
该属性指定request中必须包含某些参数值时,才让该方法处理。
@RequestMapping(value="/hello",method=RequestMethod.POST, params="myparam=myvalue")
方法仅处理其中名为"myparam"、值为"myvalue"的请求。
  • headers属性
该属性指定request中必须包含某些指定的header值,才能让该方法处理请求。
@RequestMapping(value="/hello",method=RequestMethod.POST, headers="Referer=http://www.ccgogoing.github.io")
方法仅处理request的header中包含了指定'Referer'请求头和对应值为"http://www.ccgogoing.github.io"的请求。

Model和ModelMap

Spring MVC在内部使用了一个org.springframework.ui.Model接口存储模型数据,它的功能相似java.util.Map接口,可是比Map易于使用。org.springframework.ui.ModelMap接口实现了Map接口。github

Spring MVC在调用处理方法以前会建立一个隐含的模型对象,做为模型数据的存储容器。若是处理方法的参数为Model或ModelMap类型,则Spring MVC会将隐含模型的引用传递给这些参数。在处理方法内部,开发者就能够经过这个参数对象访问模型中的全部数据,也能够向模型中添加新的属性数据。web

在处理方法中,Model和ModelMap对象均可以使用以下方法添加模型数据:
addObject(String attributeName,Object attributeValue)spring

@RequestParam

org.springframework.web.bind.annotation.RequestParam 注解类型用于将指定的请求参数赋值给方法中的形参。

使用@RequestParam 注解可指定以下表所示的属性:json

属性 类型 是否必要 是否说明
name String 指定请求头绑定的名称
value String name属性的别名
required boolean 指定参数是否必须绑定
defaultValue String 若是没有传递参数而使用的默认值

@PathVariable注解

org.springframework.web.bind.annotation.PathVariale 注解类型能够很是方便地得到请求URL中的动态参数。@PathVariable注解只支持一个属性value,类型为String,表示绑定的名称,若是省略则默认绑定同名参数.示例代码以下:
@RequestMapping(value="/pathVariableTest/{userId}")
public void pathVariableTest(@PathVariable Integer userId)

URL模版变量{userId}绑定到经过@PathVariable注解的同名参数上mvc

@ReuqestHeader注解

org.springframework.web.bind.annotation.RequestHeader注解类型用于将请求的头信息区数据映射到功能处理方法的参数上。

@CookieValue注解

org.springframework.web.bind.annotation.CookieValue用于将请求的Cookie数据映射到功能处理方法的参数上。

@SessionAttributes注解

org.spingframework.web.bind.annotation.SessionAttribute注解类型容许咱们有选择地指定Model中的哪些属性须要转存到HttpSession对象当中。
属性 类型 是否必要 是否说明
names String[] Model中属性的名称,即存储在HttpSession当中的属性名称
value String[] names属性的别名
types Class<?>[] 指定放入对象的类型
@SessionAttributes 只能声明在类上,而不能声明在方法上。

使用方法以下:app

// 将Model中的属性名为user的属性放入HttpSession对象当中
@SessionAttributes("user")
@SessionAttributes(types={User.class},value="user")
// 也能够设置多个对象到HttpSession当中:
@SessionAttributes(types={User.class,Dept.class},value={"user","dept"})
types属性用来指定放入HttpSession当中的对象类型。

信息转换

HttpMessageConverter< T >接口

HttpMessageConverter< T >是Spring3.0以后新增的一个重要接口,它负责将请求信息转换为一个对象(类型为T),并将对象(类型为T)绑定到请求方法的参数中或输出为响应信息。
DispatcherServlet默认已经装配了RequestMappingHandlerAdapter做为HandlerAdapter组件的实现类,即 HttpMessageConverterRequestMappingHandlerAdapter使用,将请求信息转换为对象,或将对象转换为响应信息。

HttpMessageConverter< T >接口中定义了如下几个方法:dom

  • boolean canRead(Class< ? > clazz,MediaType mediaType)。该方法指定转换器能够读取的对象类型,即转换器可将请求信息转换为clazz类型的对象,同时指定支持的MIME类型(text/html、application/json等)。MIME媒体类型在RFC2616中定义,具体请参考https://tools.ietf.org/html/rfc2616#section-3.7
  • boolean canWrite(Class< ? >clazz, MediaType mediaType)。该方法指定转换器能够将clazz类型的对象写到响应流当中,响应流支持的媒体类型在mediaType中定义。
  • List<MediaType> getSupportedMediaTypes()。该方法返回当前转换器支持的媒体类型。
  • T read(Class< ? extends T> clazz,HttpInputMessage inputMessage)。该方法将请求信息流转换为T类型的对象。
  • void write (T t,MediaType contentType,HttpOutputMessage outMessage)。该方法将T类型的对象写到响应流当中,同时指定响应的媒体类型为contentType。

Spring为HttpMessageConverter< T> 提供了多个实现类,这些实现类组成了一个功能强大、用途普遍的信息转换家族:

  • StringHttpMessageConverter。 将请求信息转换为字符串。泛型T为String类型,能够读取全部媒体类型( /)的请求信息,可经过设置supportedMediaTypes属性指定媒体类型。响应信息的媒体类型为text/plain(即Content-Type的值)。
  • FormHttpMessageConverter。 将表单数据读取到MultiValueMap中。泛型T为org.springframework.util.MultiValueMap< String,? >类型,支持读取application/x-www-form-urlencoded的类型,但不支持读取multipart/form-data的类型。能够写application/x-www-form-urlencoded及multipart/form-data类型的响应信息。
  • XmlAwareFormHttpMessageConverter。继承自FormHttpMessageConverter,若是部分表单属性是XML数据,则能够用该转换器进行转换。
  • ResourceHttpMessageConverter。读写org.springframework.core.io.Resource对象。泛型T为org.springframework.core.io.Resource对象,能够读取全部媒体类型( /)的请求信息。若是类路径下提供了JAF(Java Activation Framework),则根据Resource的类型指定响应的类型,不然响应的类型为application/octet-stream
  • BufferedImageHttpMessageConverter。读写BufferedImage对象。泛型T为BufferedImage对象,能够读取全部类型( /)的请求信息,返回BufferedImage相应的类型,也能够经过contentType显示指定。
  • ByteArrayHttpMessageConverter。读写二进制数据。泛型T为byte[]类型,能够读取全部类型( /)的请求信息,能够设置supportMediaTypes属性指定类型,响应信息的媒体类型为application/octet-stream。
  • SourceHttpMessageConverter。读写javax.xml.transform.Source类型的数据。泛型T为javax.xml.transform.Source类型及其扩展类,包括javax.xml.transform.dom.DOMSourcejavax.xml.transform.sax.SAXSourcejavax.xml.transform.stream.StreamSource,能够读取text/xml和application/xml类型请求,响应信息的类型为text/xml和application/xml。
  • MarshallingHttpMessageConverter。经过Spring 的 org.springframework.oxm.Marshalling(将Java对象转换成XML)和 Unmarshaller(将XML解析为Java对象)读写XML消息。泛型T为Object类型,能够读取text/xml和application/xml类型请求,响应消息的类型为text/xml和application/xml。
  • Jaxb2RootElementHttpMessageConverter。经过JAXB2读写XML消息,将请求消息转换到注解XmlRootElement和XmlType做用的类中。泛型T为Object类型,能够读取text/xml和application/xml类型的请求,响应消息的类型为text/xml和application/xml。
  • MappingJackson2HttpMessageConverter。利用Jackson开源类包读写JSON数据。泛型T为Object类型,能够读取application/json类型数据,响应信息的类型为application/jspon。

RequestMappingHandlerAdapter默认已经装配了如下的HttpMessageConverter:

  • StringHttpMessageConverter
  • ByteArrayHttpMessageConverter
  • SourceHttpMessageConverter
  • XmlAwareFormHttpMessageConverter

若是须要装配其余类型的HttpMessageConverter,则能够再Spring的Web容器的上下文中自行定义一个RequestMappingHandlerAdapter,以下所示:

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
                <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
                <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"/>
                <bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>
            </list>
        </property>
    </bean>

注意:若是Spring Web容器中显示定义了一个RequestMappingHandlerAdapter,则Spring MVC 的RequestMappingHandlerAdapter默认装配的HttpMessageConverter将再也不起做用。

转换JSON 数据

Spring MVC提供了处理JSON格式请求/响应的HttpMessageConverter:
MappingJackson2HttpMessageConverter。利用Jackson开源类包处理JSON格式的请求或响应消息。
所以只须要在Spring Web容器中为RequestMappingHandlerAdapter装配处理JSON的HttpMessageConverter,并在交互过程当中经过请求的Accept指定MIME类型,Spring MVC就可使服务端的处理方法和客户端JSON格式的消息进行通讯了。

org.springframework.web.bind.annotation.RequestBody注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,而后把相应的数据绑定到Controller中方法的参数上。

当前台页面使用GET 或 POST 方式提交数据时,数据编码格式由请求头的ContentType指定。能够分为以下几种状况:

  • application/x-www.form-urlencoded,这种状况的数据@RequestParam、@ModelAttribute也能够处理,而且很方便,固然@RequestBody也能处理。
  • multipart/form-data,@RequestBody不能处理这种格式的数据。
  • application/json、application/xml等格式的数据,必须使用@RequestBody来处理。
相关文章
相关标签/搜索