我需要将 Spring 3.1 MVC View 的渲染输出转换为字符串(用于发送到 PDF 转换器或 MIME 电子邮件等),并且我一直在使用以下代码:
这被注入(inject)到 Controller 中
@Autowired
TilesViewResolver viewResolver;
以及以下辅助方法:
private String renderViewToString(ModelMap map, HttpServletRequest request, HttpServletResponse httpServletResponse, final String viewName) {
final StringWriter html = new StringWriter();
View pdfView = new View() {
@Override
public String getContentType() {
return "application/pdf";
}
@Override
public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(response) {
@Override
public PrintWriter getWriter() throws IOException {
return new PrintWriter(html);
}
};
View realView = viewResolver.resolveViewName(viewName, Locale.US);
Map<String, Object> newModel = new HashMap<String, Object>(model);
newModel.put("pdfMode", Boolean.TRUE);
realView.render(newModel, request, wrapper);
}
};
try {
pdfView.render(map, request, httpServletResponse);
} catch (Exception e) {
// Ignored for now
}
return html.toString();
}
归功于 Ted Young和他的HTML2PDFViewResolver我的代码所基于的。
我的问题有没有更好的方法来做到这一点?我的代码运行良好,但现在我已经接近生产,我认为如果有改进的余地,我想尝试一下。
谢谢大家
最佳答案
您通过将 View 和 Controller 组合在一起来打破 MVC 模式。更好的解决方案是定义一个 View 并将其注册到 ContentNegotiatingViewResolver。根据请求的内容类型,解析器会将请求委托(delegate)给您的 View 。
例如
<bean
class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order" value="0" />
<property name="mediaTypes">
<map>
<entry key="pdf" value="application/pdf" />
</map>
</property>
<property name="defaultViews">
<list>
<bean class="com.abc.MyCustomView">
<property name="contentType" value="pdf" />
</bean>
</list>
</property>
</bean>
关于spring - 获取 Spring 3.1 MVC View 的渲染输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9501777/