Question

I'm currently using Spring MVC with Freemarker as a view technology (template engine). However including several template files causes output to no longer be nicely formatted. My current HTML output might look like this:

<!-- Newlines before Start-tag -->

<html>
  <head>
    <title>Title</title>
  </head>
<body>
<!-- Intendation is resetted -->
<div id="page" class="container">
  <div class="row">
<div id="content" class="col-xs-12">
  <div class="row">
     ..</div>
 <!-- Muliple close tags on same line -->
 </div></div>
</div>
</body>
</html>

For ease of visual debugging I would like to manually format the output with some HTML/XML formatter. However in Spring I have no control over the output after the model is passed to the view technology (in my case Freemarker). How would I go about this?

My guess is to create a servlet filter and to register it to be executed after template execution. How would I do this in pure Spring Java Config?

Was it helpful?

Solution

Instead of using filter, you could create a custom view class that extends FreeMarkerView and applies custom formatting after the view is rendered. Benefit is that it will only apply to responses that were created from freemarker views (which I assume is what you want).

public class CustomFreeMarkerView extends FreeMarkerView {

    @Override
    protected void processTemplate(Template template, SimpleHash model, HttpServletResponse response) throws IOException, TemplateException {
        StringWriter writer = new StringWriter();
        template.process(model, writer);
        String formattedTemplate = formatTemplate(writer.toString());
        response.getWriter().write(formattedTemplate);

    }

    private String formatTemplate(String renderedTemplate) {
        //do custom formatting of the renderedTemplate here
        return renderedTemplate;
    }
}

Once you apply your formatting in formatTemplate you can wire in your custom view in view resolver:

<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver" autowire="no">
    <property name="viewClass" value="com.example.CustomFreeMarkerView" />
    ...
</bean>

In JavaConfig it would look something like this:

@Bean
public FreeMarkerViewResolver freeMarkerViewResolver() {
    FreeMarkerViewResolver fvr = new FreeMarkerViewResolver();
    fvr.setViewClass(CusotmFreeMarkerView.class);
    ...
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top