Skip to content

视图控制器

这是一种用于定义 ParameterizableViewController 的快捷方式,调用时会立即转发到视图。当在视图生成响应之前没有 Java 控制器逻辑需要运行时,您可以将其用于静态情况。

以下示例将对 / 的请求转发到名为 home 的视图:

java
@Configuration
public class WebConfiguration implements WebMvcConfigurer {

	@Override
	public void addViewControllers(ViewControllerRegistry registry) {
		registry.addViewController("/").setViewName("home");
	}
}
kotlin
@Configuration
class WebConfiguration : WebMvcConfigurer {

	override fun addViewControllers(registry: ViewControllerRegistry) {
		registry.addViewController("/").setViewName("home")
	}
}
xml
<mvc:view-controller path="/" view-name="home"/>

如果 @RequestMapping 方法已映射到任何 HTTP 方法的 URL,则不能使用视图控制器来处理相同的 URL。这是因为通过 URL 与注解控制器匹配被视为足够强的端点所有权指示,因此可以向客户端发送 405 (METHOD_NOT_ALLOWED)、415 (UNSUPPORTED_MEDIA_TYPE) 或类似的响应以帮助调试。出于这个原因,建议避免将 URL 处理分散在注解控制器和视图控制器之间。


补充教学

1. 适用场景

  • 首页跳转:如将根路径 / 映射到 index.html
  • 静态页面路由:对于没有任何业务逻辑的“关于我们”、“声明”等页面,不需要专门写一个 @Controller
  • 状态码映射:可以用来快速定义错误页面跳转。

2. 状态码设置

除了设置视图名称,你还可以设置响应的状态码。例如:

java
registry.addViewController("/old-url").setStatusCode(HttpStatus.MOVED_PERMANENTLY).setViewName("redirect:/new-url");

3. 注意事项

视图控制器本质上是配置了一个处理请求的 Handler。如果你的应用是一个纯 REST API(前后端分离),通常不太需要使用视图控制器,因为路由通常由前端框架(如 Vue/React)接管。

Based on Spring Framework.