在第一個(gè)Spring MVC實(shí)例中,我編寫(xiě)的控制器(兩個(gè)Controller類(lèi))是實(shí)現(xiàn)了控制器接口,屬于傳統(tǒng)風(fēng)格。從Spring 2.5版本開(kāi)始引入了一個(gè)新的途徑:通過(guò)使用控制器注釋類(lèi)型。
注解的優(yōu)點(diǎn)
- 一個(gè)控制器類(lèi)可以處理多個(gè)動(dòng)作(而實(shí)現(xiàn)了Controller接口的控制器只能處理一個(gè)動(dòng)作),從而減少應(yīng)用程序的數(shù)量。
- 基于注解的控制器的請(qǐng)求映射不需要存儲(chǔ)在配置文件中。
最重要的兩個(gè)注解類(lèi)型
- Controller
- RequestMapping
Controller注解類(lèi)型
Controller的全名為:
org.springframework.stereotype.Controller
用于指示Spring類(lèi)的實(shí)例是一個(gè)控制器,如下所示:
UserController.java
package com.zpq.springmvc.controller;
import org.springframework.stereotype.Controller;
@Controller
public class UserController
{
}
那么問(wèn)題來(lái)了,如何讓Spring找到這個(gè)控制器呢?上述的注解好比是給一個(gè)類(lèi)裝載了一個(gè)信號(hào)發(fā)射器,接下來(lái)該做的就是讓這個(gè)信號(hào)發(fā)射器被發(fā)現(xiàn)——給Spring裝一個(gè)雷達(dá)!
-
Spring使用掃描機(jī)制來(lái)找到應(yīng)用程序中所有的基于注解的控制器類(lèi)。
為了保證Spring能找到我的控制器,我需要做三件事情”
首先,需要在Spring MVC的配置文件中聲明spring-context,如下所示:
springmvc-config.xml
<beans
......
xmlns:context="http://www.springframework.org/schema/context"
......
/beans>
- 然后,需要應(yīng)用<component-scan/>元素,如下所示:
springmvc-config.xml
<context:component-scan base-package="com.zpq.springmvc.controller"/>
雙引號(hào)中的值為UserController類(lèi)的類(lèi)名,盡量寫(xiě)的精確,不要太廣泛,否則就會(huì)掃描無(wú)關(guān)緊要的類(lèi)。
RequestMapping注解類(lèi)型
聲明了控制器之后,就要往控制器類(lèi)中為每一個(gè)動(dòng)作開(kāi)發(fā)相應(yīng)的處理方法。
RequestMapping的全名為:
org.springframework.web.bind.annotation.RequestMapping
用于映射一個(gè)請(qǐng)求和一種方法
使用@Controller注解可以在一個(gè)控制器類(lèi)中編寫(xiě)多個(gè)方法,如下所示:
UserController.java
@Controller
public class UserController
{
@RequestMapping("/user_input")
public String inputUser()
{
System.out.println("inputUser called!");
return "UserForm";//返回一個(gè)名稱(chēng)為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);//返回一個(gè)User bean
return "UserDetails";//返回一個(gè)名稱(chēng)為UserDetails的視圖
}
}
@RequestMapping("/user_input")與以下配置的作用是一樣:
springmvc-config.xml
<bean name="/user_input.action"
class="com.zpq.springmvc.controller.InputUserController">
</bean>
啟動(dòng)項(xiàng)目后,在瀏覽器地址欄中輸入如下:
http://localhost:8080/SpringMVC01/user_input
出現(xiàn)頁(yè)面,如下所示:
總結(jié)
- 使用注解@Controller可以聲明一個(gè)控制器,供Spring MVC掃描,并且這樣的控制器內(nèi)部可以定義多個(gè)請(qǐng)求方法。
- 使用注解@RequestMapping可以聲明一個(gè)請(qǐng)求方法,省去在springmvc-config.xml配置的工程。