在spring2.5以前的版本中,实现一个mvc的Controller的唯一方法就是实现Controller接口,一个控制器只能响应一个客户端请求,在2.5以后的版本中,spring引入了注解,利用注解简化配置文件,利用注解实现bean的声明和依赖注入(DI),注解也同样被引入到spring的web模块springMVC中。

  • 使用基于注解的控制器有两个优点
    第一:一个控制器可以处理多个动作,而不是像以前那样一个控制器只能处理一个请求
    第二:省略的在配置文件中对bean的声明和依赖注入,显著提高开发效率
    Controller和RequestMapping注解是SpringMVC中最重要的两个注解类型,下面对这两个注解做详细说明。
  • Controller注解

org.springframework.stereotype.Controller注解用于指示spring类的实例是一个控制器。下面是一个Controller注解的使用示例

package com.springmvc.test.controller;
import org.spirngframework.stereotype.Controller;
...
@Controller
public class CustomerController(){
     //request handle method
}

Spring使用扫描机制来找到应用程序中所有基于注解的控制器类,为了spring能找到你的控制器,需要做两件事:
第一,在springMVC配置文件中声明spring-context。

<beans 
   xmlns:context="http://www.springframework.org/schema/context"
  ...
   xsi:schemaLocation="http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context-3.0.xsd" 
>...

第二,在配置文件中声明<component-scan/>元素,如下所示

<context:component-scan base-package="basePackage"/>

<component-scan/>元素中制定控制器类的基本包。例如,若所有的控制器类都在com.springmvc.test.controller包及子包下,则需要写一个如下的<component-scan/>元素:

<context:component-scan base-package="com.springmvc.test.controller"/>

现在整个配置文件的配置如下:

<?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"  xsi:schemaLocation="http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context-3.0.xsd">
....
</beans>
  • RequestMapping注解类型
    现在,我们需要在控制器类的内部为每一个动作开发相应的处理方法。要让spring知道哪一种方法来处理他的动作,需要使用org.springframework.web.bind.annotation.RequestMapping注解类型映射到URI与方法。

RequestMapping注解类型的作用同其名字所表达的意思一样:映射一个请求和一种方法。可以使用RequestMapping注解一种方法或类。

一个参与RequestMapping注解的方法将成为一个处理请求的方法,并由控制器DispatcherServlet将请求关联到这个方法上。
应用RequestMapping很简单,就像下面这样:

package com.spirngmvc.test.controller;
import org.springframework.stereotype.Conroller;
import org.springframework.web.bind.annotation.RequestMapping;
...
@Controller
public class CustomerController{

     @RequestMapping(value="/customer_input")
     public String inputCustomer(){
            //handler here
         retur "customerForm";
     }
}

这样,当访问下面的地址时就会被这个方法处理

http://localhost/springmvctest/customer_input

RequestMapping除了具有value属性外,还有其他属性。例如method属性用来指示该方法处理哪些http方法。
例如,当且仅当请求方法为HTTP POST或PUT方法时,才用下面的方法处理:

...
import org.springframwork.stereotype.Controller;
import org.springframwork.web.bind.annotation.RequestMapping;
import org.springframwork.web.bind.annotation.RequestMethod;
...
     @RequestMapping(value="/order_process",
          method={RequestMethod.POST,RequestMethod.PUT}) 
     public String processOrder(){
         //handle here
         retur "orderForm";
     }

若指定一种请求方法,则无需大括号

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

如果没有制定method属性,则任意请求方法都可以。

前面所过,RequestMapping既可以作用于方法,也可以作用于类,那么作用于类的ReqeustMapping是怎么回事呢?

...
import org.springframework.stereotype.Controller;
import ogr.springframework.web.bind.annotation.RequestMapping;
import org.springframework.bind.annotation.RequestMethod;
...
@Controller
@RequestMapping("/customer")
public class CustomerController{

     @RequestMapping(value="/delete"
           method=RequestMethod.POST);
     public String deleteCustomer(){
       //handle 
         return ...;
     }
}

用下面的url可以访问到该方法:

http://domain/context/customer/delete

一目了然了,是为了简化对控制器中方法的路径配置,因为通常情况下,同一个controller下的方法处理的url都有一个相同的跟路径,就像/customer