Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring mvc 使用SpringMVC在freemarker中获取服务器名称和方案?_Spring Mvc_Freemarker - Fatal编程技术网

Spring mvc 使用SpringMVC在freemarker中获取服务器名称和方案?

Spring mvc 使用SpringMVC在freemarker中获取服务器名称和方案?,spring-mvc,freemarker,Spring Mvc,Freemarker,我正在使用Freemarker作为SpringMVC应用程序的视图技术。我需要找到服务器名称和方案,但我尝试的似乎都不起作用。在JSP中,有一个隐式的请求对象将包含此信息,但Freemarker似乎没有相应的对象。我将SpringrequestContext公开为rc,但rc.request为空 以下是我的视图解析器配置: <bean id="freemarkerViewResolver" class="org.springframework.web.servlet.view.fr

我正在使用Freemarker作为SpringMVC应用程序的视图技术。我需要找到服务器名称和方案,但我尝试的似乎都不起作用。在JSP中,有一个隐式的
请求
对象将包含此信息,但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>

${freemarker.templatePath}

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

免责声明:我根本不是SpringMVC专家,所以下面的方法可能是完全疯狂的,但它应该可以工作

您可以使用自定义的
FreeMarkerView
freemarkervewresolver
公开原始请求,例如

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;
    } 
}
Scheme: ${RawRequest.scheme}
Server Name: ${RawRequest.serverName}

这种方法在Spring Framework 3.0.5中非常有效。

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

免责声明:我根本不是SpringMVC专家,所以下面的方法可能是完全疯狂的,但它应该可以工作

您可以使用自定义的
FreeMarkerView
freemarkervewresolver
公开原始请求,例如

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;
    } 
}
Scheme: ${RawRequest.scheme}
Server Name: ${RawRequest.serverName}

这种方法在SpringFramework3.0.5中适用。

Hm,应该可以。我想我可以加入
响应
会话
,以确保完整性。我只是想知道为什么它还没有这样做?Spring MVC已经向模板公开了请求,但包装为FreeMarker HttpRequestHashModel,它只提供对servlet请求属性的访问,而不提供像serverName或scheme.Hm这样的请求属性,应该可以。我想我可以加入
响应
会话
,以确保完整性。我只是想知道为什么它还没有这样做?Spring MVC已经将请求公开给模板,但包装为FreeMarker HttpRequestHashModel,它只提供对servlet请求属性的访问,而不提供对请求属性(如serverName或scheme)的访问。