Spring MVC : 快捷配置 ViewControllerRegistry

本文介绍SpringMVC中ViewControllerRegistry的三种快捷配置方法:直接返回HTTP状态码、页面跳转及直接视图渲染,旨在简化常见场景的处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用Spring MVC时,大多数情况下我们都是在开发控制器类和控制器方法,也就是那些使用@Controller/@RequestMapping注解的类及其方法,这些控制器类/方法可以用于实现复杂的控制器逻辑,它们最终在应用运行时会用于处理对应的请求。这也算是Spring MVC请求处理业务逻辑开发的常规和主要手段了。但实际上,有时候我们会遇见一些不需要复杂处理的请求,在这些情况下,即使这种常规手段,也会显得复杂,这时候,我们可以考虑使用Spring MVC ViewControllerRegistry的快捷配置,这样我们可以使用少量的代码轻松解决问题。

Spring MVC ViewControllerRegistry快捷配置支持如下几种需求 :

  1. 针对某些URL请求只需要返回某个HTTP响应码即可
  2. 针对某些URL请求只需要跳转到另外一个URL
  3. 针对某些URL请求只需要渲染和展示指定视图而无需业务逻辑

现在针对以上三种情况,我们逐一举例演示如何进行快捷配置。

首先需要说明的一点是,本文使用演示项目基于Spring boot + Spring MVCSpring 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页面都不会出现。

注意,该例子中的需求并非真实需求,而是出于演示目的的一个假想需求,不要在该例子需求的合理性/真实性上较真。

如下图所示 :

HTTP ERROR 403

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";
 }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值