spring - 获取 Spring 3.1 MVC View 的渲染输出

标签 spring spring-mvc

我需要将 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/

相关文章:

java - 如何为 Async Spring 使用多个 threadPoolExecutor

java - PropertiesFactoryBean 与 @PropertySource

javascript - 无法根据 Thymeleaf 变量执行脚本 &lt;script th :inline ="javascript">

java - 等效于 jms :listener-container 的 Spring 注释

java - Spring mvc 绑定(bind)错误国际化

java - 如何在不影响原始 bean 的 'clients' 的情况下声明另一个 Jackson ObjectMapper?

java - 通过 Spring Data 将 joda DateTime 插入 MongoDB 时出错

java - Spring的值注释在构造函数参数中不起作用

spring - spring boot项目中的多个Web应用程序

spring - @Component Bean 的 @RequestMapping