【问题标题】:Spring MVC 1 to 1 mapping of a URL to .HTML without exposing pathSpring MVC 1 对 1 URL 到 .HTML 的映射而不暴露路径
【发布时间】:2015-03-31 21:52:13
【问题描述】:

我在不提供任何 JSP 的 Web 服务上使用 Spring 4.1.5 和 Boot 1.2。我不想添加 JSP servlet,但我希望它提供单个金丝雀页面,该页面以更漂亮的 html 类型格式显示将在/manage/health 端点提供的信息。

我在webapp/canary/canary.html 中有一个文件,我想从 url 提供这个文件:www.mywebservice.com:9343/canary,完全一样,不是 canary.html

我试过这样做:

@Configuration
public class CanaryConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/canary")
                .addResourceLocations("/canary/canary.html");
    }
}

但这不起作用。

它期望处理程序提供一个文件名。所以换句话说,位置应该是这样的:/canary/

处理程序会是这样的:/canary/**

这样,www.mywebservice.com:9343/canary/canary.html 的 URL 就可以发挥作用了。

但是,我希望 URL 将 www.mywebservice.com:9343/canary 解析为 webapp/canary/canary.html,而无需键入 html。

这在 jsp servlet 中真的很容易,因为您可以设置后缀等...

我查看了ResourceResolver,但我不知道如何将其链接到我当前的配置中。

看起来像我想要的:

提供将传入请求解析为实际资源并获取客户端在请求资源时应使用的公共 URL 路径的机制。

见:ResourceResolver Documentation

任何帮助都会非常有益。

另外我很清楚我可以把html放在resources/static和其他几个自动配置的地方。这总是需要输入 .html ,在这种情况下这不是我想要的,所以它不起作用。谢谢!

【问题讨论】:

    标签: java spring spring-mvc servlets spring-boot


    【解决方案1】:

    您可以使用视图控制器来执行此操作。这是它的一个示例。希望这会有所帮助。

        public class AppConfig extends WebMvcConfigurerAdapter {
    
            @Override
            public void addViewControllers(ViewControllerRegistry registry) {
                registry.addViewController("/canary").setViewName("/canary/canary.html");
            }
    }
    

    注意:如果您使用的是 tomcat,您可能需要配置 jsp servlet 以服务器 html 文件。

    Related post here

    【讨论】:

    • 所以我已经尝试过那个确切的东西,但我想你需要让它成为 registry.addViewController("/canary/").setViewName("/canary/canary.html");,注意金丝雀之后的额外 / ......这很愚蠢,但谢谢。
    • 另外,我们故意不使用 servlet,此更改是为了从 web 服务中删除 JSP servlet。
    【解决方案2】:

    为方便起见,选择的答案与以下相同:

    @Controller
    public class CanaryController {
    
        @RequestMapping(value="/canary", method=RequestMethod.GET)
        public String getCanary() {
            return "/canary/canary.html";
        }
    }
    

    只要canary(或任何文件/文件夹)在您的webapp 文件夹中,上述代码就可以工作。

    当我尝试这个时,我试图在我的 YAML (.yml) 文件中将后缀设置为 .html,但它不起作用我认为如果它不是 RestController,它需要返回到一个 servlet。我误解了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-18
      • 1970-01-01
      • 2018-03-01
      • 2015-01-25
      • 2018-06-19
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多