首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取Spring3.1MVC视图的渲染输出

获取Spring3.1MVC视图的渲染输出
EN

Stack Overflow用户
提问于 2012-02-29 23:21:01
回答 1查看 2.5K关注 0票数 10

我需要将Spring3.1MVC视图的渲染输出转换成字符串(用于发送到PDF转换器,或MIME电子邮件等)我一直在使用下面的代码:

它被注入到控制器中

代码语言:javascript
复制
    @Autowired
    TilesViewResolver viewResolver;

和下面的helper方法:

代码语言:javascript
复制
    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,我的代码就是基于这些and编写的。

我的问题是,有没有更好的方法呢?我的代码运行得很好,但现在我正在接近生产,我想如果有改进的空间,我想尝试一下。

感谢所有人

EN

回答 1

Stack Overflow用户

发布于 2014-08-14 02:32:17

通过将视图和控制器组合在一起,您正在打破MVC模式。更好的解决方案是定义一个视图并将其注册到ContentNegotiatingViewResolver。根据请求的内容类型,解析器会将请求委托给您的视图。

例如:

代码语言:javascript
复制
    <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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9501777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档