在第一个Spring MVC实例中,我编写的控制器(两个Controller类)是实现了控制器接口,属于传统风格。从Spring 2.5版本开始引入了一个新的途径:通过使用控制器注释类型。
注解的优点
- 一个控制器类可以处理多个动作(而实现了Controller接口的控制器只能处理一个动作),从而减少应用程序的数量。
- 基于注解的控制器的请求映射不需要存储在配置文件中。
最重要的两个注解类型
- Controller
- RequestMapping
Controller注解类型
Controller的全名为:
org.springframework.stereotype.Controller
用于指示Spring类的实例是一个控制器,如下所示:
UserController.java
package com.zpq.springmvc.controller;
import org.springframework.stereotype.Controller;
@Controller
public class UserController
{
}
那么问题来了,如何让Spring找到这个控制器呢?上述的注解好比是给一个类装载了一个信号发射器,接下来该做的就是让这个信号发射器被发现——给Spring装一个雷达!
-
Spring使用扫描机制来找到应用程序中所有的基于注解的控制器类。
为了保证Spring能找到我的控制器,我需要做三件事情”
首先,需要在Spring MVC的配置文件中声明spring-context,如下所示:
springmvc-config.xml
<beans
......
xmlns:context="http://www.springframework.org/schema/context"
......
/beans>
- 然后,需要应用<component-scan/>元素,如下所示:
springmvc-config.xml
<context:component-scan base-package="com.zpq.springmvc.controller"/>
双引号中的值为UserController类的类名,尽量写的精确,不要太广泛,否则就会扫描无关紧要的类。
RequestMapping注解类型
声明了控制器之后,就要往控制器类中为每一个动作开发相应的处理方法。
RequestMapping的全名为:
org.springframework.web.bind.annotation.RequestMapping
用于映射一个请求和一种方法
使用@Controller注解可以在一个控制器类中编写多个方法,如下所示:
UserController.java
@Controller
public class UserController
{
@RequestMapping("/user_input")
public String inputUser()
{
System.out.println("inputUser called!");
return "UserForm";//返回一个名称为UserForm的View
}
@RequestMapping("/user_save")
public String SaveUser(UserForm userForm, Model model)
{
System.out.println("saveUser called!");
//populate action properties
User user = new User();
user.setName(userForm.getName());
user.setDescription(userForm.getDescription());
model.addAttribute("User", user);//返回一个User bean
return "UserDetails";//返回一个名称为UserDetails的视图
}
}
@RequestMapping("/user_input")与以下配置的作用是一样:
springmvc-config.xml
<bean name="/user_input.action"
class="com.zpq.springmvc.controller.InputUserController">
</bean>
启动项目后,在浏览器地址栏中输入如下:
http://localhost:8080/SpringMVC01/user_input
出现页面,如下所示:
总结
- 使用注解@Controller可以声明一个控制器,供Spring MVC扫描,并且这样的控制器内部可以定义多个请求方法。
- 使用注解@RequestMapping可以声明一个请求方法,省去在springmvc-config.xml配置的工程。