在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;...@Controllerpublic 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;...@Controllerpublic 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
版权声明:本文为博主原创文章,未经博主允许不得转载。