我想从控制器获取已处理 JSP 的 HTML 内容。我正在为视图使用 Tiles 实现。
在我的场景中,我想从 jsp 生成 HTML 并将其作为 JSONP 发送。
所以我需要从控制器中获取生成的 html。
我想从控制器获取已处理 JSP 的 HTML 内容。我正在为视图使用 Tiles 实现。
在我的场景中,我想从 jsp 生成 HTML 并将其作为 JSONP 发送。
所以我需要从控制器中获取生成的 html。
干得好!
这对我来说很完美:
@Service
public class CustomViewProcessor
{
private static Logger m_log = LoggerFactory.getLogger(CustomViewProcessor.class);
@Autowired
@Qualifier("tilesViewResolver")
private ViewResolver viewResolver;
@Autowired
@Qualifier("commonInterceptor")
CommonInterceptor commonInterceptor;
public String renderView(HttpServletRequest request, Model model, String viewName)
{
ModelAndView mav = new ModelAndView();
mav.addAllObjects(model.asMap());
mav.setViewName(viewName);
commonInterceptor.updateRequest(mav, request);
try
{
View view = viewResolver.resolveViewName(mav.getViewName(), request.getLocale());
HttpServletResponse localResponse = new MyHttpServletResponseWrapper(new MockHttpServletResponse());
view.render(mav.getModel(), request, localResponse);
return localResponse.toString();
}
catch (Exception e)
{
return "";
}
}
public boolean doesViewExist(HttpServletRequest request, String viewName)
{
try
{
if (viewResolver.resolveViewName(viewName, request.getLocale()) != null)
{
return true;
}
}
catch (Exception e)
{
m_log.error(e.getMessage(), e);
}
return false;
}
static class MyHttpServletResponseWrapper extends HttpServletResponseWrapper
{
private StringWriter sw = new StringWriter();
public MyHttpServletResponseWrapper(HttpServletResponse response)
{
super(response);
}
public PrintWriter getWriter() throws IOException
{
return new PrintWriter(sw);
}
public ServletOutputStream getOutputStream() throws IOException
{
throw new UnsupportedOperationException();
}
public String toString()
{
return sw.toString();
}
}
}
在填充 JSP 页面模板之前,控制流离开 DispatcherServlet 并移动到 Servlet 容器(例如 Tomcat)。因此 Spring MVC 永远无法看到从 JSP 模板生成的最终 HTML。
如果您想将最终的 HTML 输出通过管道传输到 JSONP 请求中,您将不得不在 Servlet 容器中将其实现为过滤器,它可能支持也可能不支持该行为。
您需要使用 @ResponseBody 注释您的控制器方法。请查看文档以获取更多详细信息