使用Spring MVC获取freemarker中的服务器名称和方案?

时间:2011-07-26 17:01:04

标签: spring-mvc freemarker

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

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

<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>

1 个答案:

答案 0 :(得分:3)

我认为您无法通过rc.request访问请求,因为RequestContext#getRequest受到保护,即无法从FreeMarker / reflection访问。

免责声明:我根本不是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 bean配置中,您可以使用自定义视图解析程序类,并通过${RawRequest}访问模板中的原始请求,例如

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

这种方法适用于Spring Framework 3.0.5。