Spring MVC 常用注解

1.@Controller注解

该注解用来标记类,由其标记的类就是一个Spring MVC Controller的一个对象,即一个控制器类

Spring使用扫描机制扫描应用程序中所有使用该注解进行注释的类,分发处理器会扫描使用了该注解的类的方法,并检测方法是否使用了@RequestMapping注解,使用了@RequestMapping注解的方法才是真正处理请求的处理器

Spring能够扫描到控制器,需要在Spring MVC的配置文件(springmvc-servlet.xml文件)中完成两个配置项:
1.在头文件中引入spring-context。
2.使用<context:component-scan/>元素,该元素的功能:启动包扫描功能,注册使用了@Controller、@Service、@Repository、@Component等注解的类成为Spring的bean。

<context:component-scan base-package="com.snow.dcl.controller"/>

base-package属性指定了需要扫描的包,该包以及其子包中的类都会被处理,所有的控制器类都应该放在该包路径下,以免扫描其他无关的包。

接下来,我们要创建一个Spring MVC的配置文件,并且从中配置,在我们的maven项目“src/main/webapp/WEB-INF”目录下创建一个springmvc-config.xml,这个xml文件就是我们的Spring MVC配置文件。配置信息如下:

<?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:context="http://www.springframework.org/schema/context" 
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"  
    xmlns:jee="http://www.springframework.org/schema/jee" 
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
    http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
    http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
    http://www.springframework.org/schhttp://localhost:8088/springmvc-comment1/helloWorldema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
    
    <!-- spring可以自动去扫描base-pack下面的包或者子包下面的java文件,
        如果扫描到有Spring的相关注解的类,则把这些类注册为Spring的bean -->
    <context:component-scan base-package="com.qianchunhua.controller"/>
    
    <!-- 视图解析器  -->
     <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
        <!-- 前缀 -->
        <property name="prefix">
            <value>/WEB-INF/content/</value>
        </property>
        <!-- 后缀 -->
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>
    
</beans>

由于在我们的java文件中使用了注解类型,因此不需要再配置文件中使用xml描述bean。

<context:component-scan base-package="com.qianchunhua.controller"/> 指定需要Spring扫描com.qianchunhua.controller包及其子包下面的所有java文件。

最后配置了视图解析器InternalResourceViewResolver来解析视图,将View呈现给用户。视图解析器中配置的prefix属性表示视图的前缀,suffix表示视图的后缀,返回的视图字符串是“helloWorld”,经过视图解析器之后,则视图的完整路径是:/WEB-INF/content/helloWorld.jsp。

需要注意的是,在此配置文件中没有配置处理映射器和处理适配器时,Spring会使用默认的处理映射器处理适配器处理请求。此外,还需要在web.xml中配置Spring MVC的前端控制器DispatcherServlet。web.xml配置信息如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name>springmvc-comment1</display-name>
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/springmvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

到此,我们就将@Controller注解的案例应用给写完了。下面,我将部署springmvc-comment1项目,在浏览器中输入如下url地址来测试应用:

http://localhost:8088/springmvc-comment1/helloWorld
2.@RequestMapping注解

该注解用来标记类或者方法,指示Spring用该类或者方法处理请求动作。

Spring MVC中用于参数绑定的注解有很多,都在org.springframework.web.bind.annotation包中,根据它们处理的request的不同内容可以分为四类(常用的类型)。
第一类:处理request body部分的注解有:@RequestParam和@RequestBody
第二类:处理requet uri部分的注解有:@PathVaribale
第三类:处理request header部分的注解有:@RequestHeader和@CookieValue
第四类:处理attribute类型的注解有:@SessionAttributes和@MoelAttribute

如果使用该注解注释类,该类所有的方法,都被映射为相对于类级别的请求,表示该控制器处理的所有请求,都被映射为value属性指定的路径下。

  1 @Controller
  2 @RequestMapping(value = "/user")
  3 public class UserController {
  4 
  5     @RequestMapping(value = "register")
  6     public String register(){
  7         return "register";
  8     }
  9 
 10     @RequestMapping(value = "login")
 11     public String login(){
 12         return "login";
 13     }
 14 }
 15 

因为在该类上使用了@RequestMapping(value = "/user")注解,请求都要加上/user路径如:

http://localhost:8080/user/login
http://localhost:8080/user/register

@RequestMapping注解支持的常用属性:

属性 类型 说明
value String[] 用于将指定请求映射到方法上
method RequestMethod[] 映射指定请求的方法类型,包括GET、POST、PUT......
consumes String[] 指定处理请求的提交内容类型(Content-Type:application/json、text/html等)
produces String[] 指定返回的内容类型,必须是request请求头(Accept)中包含的类型
params String[] 指定request中必须包含某些参数,才让该方法处理请求
header String[] 指定request中必须包指定的header值,才让该方法处理请求
  • value属性

value是@RequestMapping注解的默认属性,如果该注解使用时只有此一个属性,则可以省略属性名,若有多个属性,则必须写上value属性名。

  @RequestMapping(value = "/hello")
  @RequestMapping("/hello")

value属性是String[]类型,所以可以设置多个值:

 @RequestMapping(value = {"/hello","/hello1"})
  • method属性

该属性用来指示该方法仅仅处理哪些HTTP请求方式。如下代码:

@RequestMapping(value="/hello",method=RequestMethod.POST)

以上代码method=RequestMethod.POST表示该方法只支持POST请求,也可以同时支持多个HTTP请求。如下:

@RequestMapping(value="/hello",method={RequestMethod.POST,method=RequestMethod.GET})

若没有指定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。

  • 5、params属性

该属性指定request中必须包含某些参数值时,才让该方法处理。如下伪代码:

@RequestMapping(value="/hello",method=RequestMethod.POST,params="myParam=myValue")

方法仅处理其中名为“myPara”,值为“myValue”的请求。

  • headers属性

该属性指定request中必须包含某些特性的header值,才能让该方法处理请求。如下代码:

@RequestMapping(value="/hello",method=RequestMethod.POST,headers="Referer=http://www.qianchunhua.com/")

方法仅处理request的header中包含了指定的“Referer”请求头和对应值为“http://www.qianchunhua.com”的请求。

3.@RequestParam注解

该注解用来将指定的请求参数赋值给方法中的形参。
@RequestParam注解支持的常用属性:

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

请求处理方法参数的可选类型位Java的8种基本数据类型、String类和集合类。如下示例伪代码:

@RequestMapping(value="/hello")
public ModelAndView hello(
    @RequestParam("loginname") String loginname,
    @RequestParam("password") String password) {
    return...;
}

假设请求如下:http://localhost:8088/springmvc-comment1/login?loginname=qianch&password=123456

以上代码会将请求中的loginname参数的值“qianch”赋给loginname变量,password参数的值“123456”赋给password变量。

4.@PathVaribale注解

该注解类型可以非常方便的获得请求url中的动态参数。@PathVaribale注解只支持一个属性value,类型String,表示绑定的名称,如果省略则默认绑定同名参数。如下示例伪代码:

@RequestMapping(value="/pathVariableTest/{userId})
public void pathVariableTest(@PathVaribale ("userId")Integer userId)

假如请求的url地址为:http://localhost:8088/springmvc-comment1/pathVariableTest/1 ,则自动将url中模板变量{userId}绑定到通过@PathVaribale注解的同名参数上,即userId变量将被赋值为1。

5.@RequestHeader注解

该注解类型用于将请求的头的信息区域数据映射到功能处理方法的参数上。
@RequestHeader注解支持的常用属性:

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

示例代码:

@RequestMapping(value="/requestHeaderTest")
public void requestHeaderTest(
    @RequestHeader("User-Agent") String userAgent,
    @RequestHeader(value="Accept") String[] accepts) {
}

以上配置自动将请求头“User-Agent”的值赋到userAgent变量上,并将“Accept”请求头的值赋到accept参数上。

6.@CookieValue注解

该注解用于将请求的Cookie数据映射到功能处理方法的参数。
@CookieValue注解支持的常用属性:

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

示例:

@RequestMapping(value="/cookieValueTest")
public void cookieValueTest(
    @CookieValue(value="JSESSIONID",defaultValue="") String sessionId) {
}

以上配置会自动将JSESSIONID值设置到sessionId参数上,defaultValu表示Cookie中没有JSESSIONID时默认为空。

7.
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容