bertie bertie - 5 days ago 4
Java Question

How to manually render Spring MVC view to html?

Is it possible to render my view into html in my controller mapping method, so that i can return the rendered html as a part of my json object ?

Example of my usual controller method :

@RequestMapping(value={"/accounts/{accountId}"}, method=RequestMethod.GET)
public String viewAcc(final HttpServletRequest req,
final HttpServletResponse resp, final Model model,
@PathVariable("accountId") final String docId) {

// do usual processing ...

// return only a STRING value,
// which will be used by spring MVC to resolve into myview.jsp or myview.ftl
// and populate the model to the template to result in html
return "myview";
}


What i expect :

@RequestMapping(value={"/accounts/{accountId}"}, method=RequestMethod.GET)
public String viewAcc(final HttpServletRequest req,
final HttpServletResponse resp, final Model model,
@PathVariable("accountId") final String docId) {

// do usual processing ...

// manually create the view
ModelAndView view = ... ? (how)

// translate the view to the html
// and get the rendered html from the view
String renderedHtml = view.render .. ? (how)

// create a json containing the html
String jsonString = "{ 'html' : " + escapeForJson(renderedHtml) + "}"

try {
out = response.getWriter();
out.write(jsonString);
} catch (IOException e) {
// handle the exception somehow
}

return null;
}


I wonder what is the right way to create the view and render the view into html manually within the controller method.

--------- update ---------

Here's the working example from the accepted answer's guidance :

View resolvedView = thiz.viewResolver.resolveViewName("myViewName", Locale.US);
MockHttpServletResponse mockResp = new MockHttpServletResponse();
resolvedView.render(model.asMap(), req, mockResp);
System.out.println("rendered html : " + mockResp.getContentAsString());

Answer

Try Autowiring the ViewResolver then calling resolveViewName("myview", Locale.US) to get the View.

Then call render( ) on the view passing it a "mock" http response that has a ByteArrayOutputStream for it's output, and get the html from the ByteArrayOutputStream.

--------- update ---------

Here's the working example, copied from the question. (so the code is actually with the answer)

View resolvedView = thiz.viewResolver.resolveViewName("myViewName", Locale.US);
MockHttpServletResponse mockResp = new MockHttpServletResponse();
resolvedView.render(model.asMap(), req, mockResp);
System.out.println("rendered html : " + mockResp.getContentAsString());