2011-07-26 70 views
0

我使用Freemarker作为Spring MVC应用程序的视图技术。我需要找到服务器的名称和方案,没有任何我尝试似乎工作。在JSP中,有一个隐含的request对象可能会有这个信息,但Freemarker似乎没有等效。我将春季requestContext公开为rc,但rc.request为空。使用Spring MVC获取Freemarker中的服务器名称和方案?

这里是我的视图解析器配置:

<bean id="freemarkerViewResolver" 
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> 
    <property name="cache" value="false" /> 
    <property name="suffix" value=".ftl" /> 
    <property name="order" value="1" /> 
    <property name="exposeRequestAttributes" value="true" /> 
    <property name="requestContextAttribute" value="rc" /> 
    <property name="exposeSpringMacroHelpers" value="true" /> 
</bean> 


<bean id="freemarkerConfig" 
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> 
    <property name="templateLoaderPaths"> 
     <list> 
      <value>${freemarker.templatePath}</value> 
     </list> 
    </property> 
    <property name="defaultEncoding" value="UTF-8" /> 
</bean> 

回答

3

我想是因为RequestContext#getRequest是受保护的,即不是从FreeMarker的/反射访问无法通过rc.request访问请求。免责声明:我不是Spring-MVC的专家,所以下面的方法可能是完全疯狂的,但它应该工作!

您可以使用自定义FreeMarkerViewFreeMarkerViewResolver(例如,

public class CustomFreeMarkerView extends FreeMarkerView { 
    protected SimpleHash buildTemplateModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) { 
     SimpleHash fmModel = super.buildTemplateModel(model, request, response); 
     fmModel.put("RawRequest", request); 
     return fmModel; 
    } 
} 

public class CustomFreeMarkerViewResolver extends AbstractTemplateViewResolver { 
    public CustomFreeMarkerViewResolver() { 
     setViewClass(requiredViewClass()); 
    } 
    @Override 
    protected Class requiredViewClass() { 
     return CustomFreeMarkerView.class; 
    } 
} 

然后在你的freemarkerViewResolver豆的配置,您可以使用您的自定义视图解析器类,并通过${RawRequest}在您的模板访问原始的请求,例如

Scheme: ${RawRequest.scheme} 
Server Name: ${RawRequest.serverName} 

这种方法很适合我用Spring框架3.0.5。

+0

嗯,这应该工作。我想我可以为了完整性而投入“响应”和“会话”。我只是想知道为什么它不这样做? – jiggy

+0

Spring-MVC已经将该请求公开给模板,但是被封装为FreeMarker HttpRequestHashModel,它只提供对servlet请求属性的访问,但不请求像serverName或scheme这样的属性。 – Chaquotay

相关问题