You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring中动态创建addViewController实现URL与模板映射?

自动实现URL到模板文件的映射配置

你可以通过扫描模板目录下的HTML文件,批量自动注册视图控制器,替代手动逐个添加的重复代码,具体实现如下:

核心实现代码

在你的WebMvcConfigurer实现类中,注入ResourcePatternResolver,然后在addViewControllers方法中完成自动扫描与注册:

import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourcePatternResolver;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.Resource;
import java.io.IOException;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Resource
    private ResourcePatternResolver resourcePatternResolver;

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        try {
            // 扫描admin目录下所有子目录中的HTML文件(根据你的模板路径调整)
            Resource[] resources = resourcePatternResolver.getResources("classpath:/templates/admin/**/*.html");
            
            for (Resource resource : resources) {
                // 获取文件相对模板目录的路径,例如:admin/test/test.html
                String relativePath = resource.getURL().getPath().split("templates/")[1];
                
                // 生成URL映射:去掉admin/前缀和.html后缀,例如:/test
                String url = "/" + relativePath.substring("admin/".length(), relativePath.lastIndexOf("."));
                
                // 生成视图名称:去掉.html后缀,例如:admin/test/test
                String viewName = relativePath.substring(0, relativePath.lastIndexOf("."));
                
                // 批量注册视图控制器
                registry.addViewController(url).setViewName(viewName);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

关键说明

  • 扫描路径classpath:/templates/admin/**/*.html:匹配templates/admin下所有子目录的HTML文件,可根据你的实际模板位置调整。
  • 路径拆分逻辑:完全匹配你手动配置的规则——URL对应admin/后的子路径,视图名称对应完整模板路径,和你手动写的registry.addViewController("/test").setViewName("admin/test/test")效果一致。
  • 异常处理:捕获IO异常避免扫描失败导致启动报错,可根据需求调整异常处理逻辑。

内容的提问来源于stack exchange,提问作者user19901531

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:35:31