5.2.2 定义类级别的请求处理

现在,已经为 HomeController 编写了测试,那么我们可以做一些重构,并通过测试来保证不会对功能造成什么破坏。我们可以做的一件事就是拆分 @Request-Mapping,并将其路径映射部分放到类级别上。程序清单 5.7 展示了这个过程。

程序清单 5.7 拆分 HomeController 中的 @RequestMapping
package spittr.web;

import static org.springframework.web.bind.annotation.RequestMethod.*;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/")
public class HomeController {

  @RequestMapping(method = GET)
  public String home(Model model) {
    return "home";
  }

}

在这个新版本的 HomeController 中,路径现在被转移到类级别的 @Request-Mapping 上,而 HTTP 方法依然映射在方法级别上。当控制器在类级别上添加@RequestMapping 注解时,这个注解会应用到控制器的所有处理器方法上。处理器方法上的 @RequestMapping 注解会对类级别上的 @RequestMapping 的声明进行补充。

就 HomeController 而言,这里只有一个控制器方法。与类级别的 @Request-Mapping 合并之后,这个方法的 @RequestMapping 表明 home() 将会处理对 / 路径的 GET 请求。

换言之,我们其实没有改变任何功能,只是将一些代码换了个地方,但是 HomeController 所做的事情和以前是一样的。因为我们现在有了测试,所以可以确保在这个过程中,没有对原有的功能造成破坏。

当我们在修改 @RequestMapping 时,还可以对 HomeController 做另外一个变更。@RequestMapping 的 value 属性能够接受一个 String 类型的数组。到目前为止,我们给它设置的都是一个 String 类型的 /。但是,我们还可以将它映射到对 /homepage 的请求,只需将类级别的 @RequestMapping 改为如下所示:

@Controller
@RequesiMapping({"/", "/homepage"})
public class HomeController {
}

现在,HomeController 的 home() 方法能够映射到对 //homepage 的 GET 请求。

Last updated