Получить имя и схему сервера в freemarker с Spring MVC? - PullRequest
0 голосов
/ 26 июля 2011

Я использую 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 Ответ

3 голосов
/ 30 июля 2011

Я думаю, что вы не можете получить доступ к Запросу через 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.

...