使用Spring MVC
时,大多数情况下我们都是在开发控制器类和控制器方法,也就是那些使用@Controller
/@RequestMapping
注解的类及其方法,这些控制器类/方法可以用于实现复杂的控制器逻辑,它们最终在应用运行时会用于处理对应的请求。这也算是Spring MVC
请求处理业务逻辑开发的常规和主要手段了。但实际上,有时候我们会遇见一些不需要复杂处理的请求,在这些情况下,即使这种常规手段,也会显得复杂,这时候,我们可以考虑使用Spring MVC
ViewControllerRegistry
的快捷配置,这样我们可以使用少量的代码轻松解决问题。
Spring MVC
ViewControllerRegistry
快捷配置支持如下几种需求 :
- 针对某些
URL
请求只需要返回某个HTTP
响应码即可 - 针对某些
URL
请求只需要跳转到另外一个URL
- 针对某些
URL
请求只需要渲染和展示指定视图而无需业务逻辑
现在针对以上三种情况,我们逐一举例演示如何进行快捷配置。
首先需要说明的一点是,本文使用演示项目基于Spring boot
+ Spring MVC
。Spring MVC
配置采用如下注解方式:
@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 初始化配置 ViewControllerRegistry registry
* 视图控制器的快捷配置方式
* @param registry
*/
@Override
public void addViewControllers(ViewControllerRegistry registry)
{
...
}
}
在以上配置中,方法addViewControllers
是对视图控制器进行快捷配置。
接下来,是三种情况快捷配置的例子讲解。
1. 直接返回HTTP
代码给指定请求
@Override
public void addViewControllers(ViewControllerRegistry registry)
{
// 请求匹配地址 /absent* 时,响应 HTTP代码403给浏览器端
registry.addStatusController("/absent*", HttpStatus.FORBIDDEN);
}
该例子适用的需求是 : 如果用户访问所有匹配/absent*
的地址,我们都向客户端返回HTTP
状态码403
。
也就是说,如果用户访问服务地址http://xxx/absent
/http://xxx/absent.html
等等页面,它会在浏览器页面上看到会是HTTP ERROR 403
。这种情况下,连Spring MVC
最经典的Whitelable Error Page
页面都不会出现。
注意,该例子中的需求并非真实需求,而是出于演示目的的一个假想需求,不要在该例子需求的合理性/真实性上较真。
如下图所示 :
2. 页面跳转
@Override
public void addViewControllers(ViewControllerRegistry registry)
{
// 请求匹配地址 /home* 时,浏览器统一跳转到 /
registry.addRedirectViewController("/home*","/");
}
该例子适用的需求是 : 如果用户访问所有匹配/home*
的地址,我们都将他重定向到/
。
也就是说,如果用户访问服务地址http://xxx/home
/http://xxx/home.html
等等页面,浏览器会自动跳转到http://xxx/
。
该例子所演示的页面跳转其实算是一种较为常见的场景,并且如果不使用快捷配置,我们必须在某个控制器类中实现类似如下控制器方法:
@RequestMapping("/home*")
public String redirectToHome() {
return "redirect:/";
}
相比之下,快捷方式设置页面跳转还是简单了许多。
3. 直接视图渲染
@Override
public void addViewControllers(ViewControllerRegistry registry)
{
// 请求匹配地址 /fixed* 时,统一使用视图 fixed_content 进行渲染,
// 并且使用指定视图渲染前,不需要进行业务处理
registry.addViewController("/fixed*").setViewName("fixed_content");
}
该例子适用的需求是 : 用户请求的/fixed*
资源某些页面可以直接通过渲染视图fixed_content
即可呈现,而无需任何其他的业务处理。
也就是说,如果用户访问服务地址http://xxx/fixed
/http://xxx/fixed.html
等等页面,服务端不会执行除了渲染视图fixed_content
之外的其它业务逻辑,而仅仅是渲染视图fixed_content
并将结果返回给客户端。
相对于以上快捷配置,控制器方法实现直接视图渲染的做法如下 :
@RequestMapping("/fixed*")
public String justView(){
// 注意 : 这里不需要任何业务逻辑,而只需要返回一个需要渲染的视图的名字
return "fixed_content";
}