如何使用default-servlet-handler

kay*_*ahr 7 java spring spring-mvc

我想配置Spring MVC来提供与静态文件混合的动态文件,比如这个(URL => File):

/iAmDynamic.html   => /WEB-INF/views/iAmDynamic.html.ftl
/iAmAlsoDynamic.js => /WEB-INF/views/iAmAlsoDynamic.js.ftl
/iAmStatiHtml      => /iAmStatic.html
Run Code Online (Sandbox Code Playgroud)

DispatchServlet被映射到/,基于注解的MVC配置被使能和我有这样(简体)一个视图控制器:

@Controller
public class ViewController
{
    @RequestMapping("*.html")
    public String handleHtml(final HttpServletRequest request)
    {
         return request.getServletPath();
    }

    @RequestMapping("*.js")
    public String handleJavaScript(final HttpServletRequest request)
    {
        return request.getServletPath();
    }
}
Run Code Online (Sandbox Code Playgroud)

spring配置如下所示:

<context:component-scan base-package="myPackage" />

<mvc:default-servlet-handler />

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  <property name="templateLoaderPath" value="/WEB-INF/views/" />
</bean>

<bean id="viewResolver"
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
  <property name="cache" value="true" />
  <property name="prefix" value="" />
  <property name="suffix" value=".ftl" />
</bean>
Run Code Online (Sandbox Code Playgroud)

不幸的是它不起作用.当它<mvc:default-servlet-handler />处于活动状态时,我只能访问该iAmStatic.html文件.当我禁用default-servlet-handler时,只有动态的东西才有效.但是我想要同时使用这个,而这正是这个默认的servlet处理程序应该做什么,不是吗?这里的错误在哪里?

gut*_*tch 0

我认为您返回的视图名称ViewController无效。我希望request.getServletPath()为所有 URL 返回一个空白字符串,因为 servlet 的路径可能是/,并且 Java 文档说getServletPath()为该路径返回一个空白字符串。因此,FreeMarker 视图解析器可能会忽略视图名称,因为它不知道要显示什么。

然而,无论如何,使用控制器类@RequestMapping可能不是完成此任务的理想方法。Spring 包含一个ContentNegotiatingViewResolver,它根据内容类型自动确定正确的视图。ContentNegotiatingViewResolver 的概述解释了如何设置它。