我正在使用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>
答案 0 :(得分:3)
我认为您无法通过rc.request
访问请求,因为RequestContext#getRequest
受到保护,即无法从FreeMarker / reflection访问。
免责声明:我根本不是Spring-MVC专家,因此以下方法可能完全是疯了,但它应该有效!
您可以使用自定义FreeMarkerView
和FreeMarkerViewResolver
公开原始请求,例如
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。