(三)基于注解的控制器

在第一個(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è)面,如下所示:

user_input

總結(jié)

  • 使用注解@Controller可以聲明一個(gè)控制器,供Spring MVC掃描,并且這樣的控制器內(nèi)部可以定義多個(gè)請(qǐng)求方法。
  • 使用注解@RequestMapping可以聲明一個(gè)請(qǐng)求方法,省去在springmvc-config.xml配置的工程。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容