获取Spring 3.1 MVC视图的渲染输出

获取Spring 3.1 MVC视图的渲染输出,spring,spring-mvc,Spring,Spring Mvc,我需要将Spring 3.1 MVC视图的渲染输出转换成字符串(用于发送到PDF转换器或MIME电子邮件等),我一直在使用以下代码: 这被注入控制器 @Autowired TilesViewResolver viewResolver; 以及以下帮助器方法: private String renderViewToString(ModelMap map, HttpServletRequest request, HttpServletResponse httpServletR

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

这被注入控制器

    @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();
    }
私有字符串renderViewToString(ModelMap映射、HttpServletRequest请求、HttpServletResponse、HttpServletResponse、最终字符串视图名){
final StringWriter html=新StringWriter();
视图pdfView=新视图(){
@凌驾
公共字符串getContentType(){
返回“application/pdf”;
}
@凌驾
公共void呈现(映射模型、HttpServletRequest请求、HttpServletResponse响应)引发异常{
HttpServletResponseWrapper=新的HttpServletResponseWrapper(响应){
@凌驾
公共PrintWriter getWriter()引发IOException{
返回新的PrintWriter(html);
}
};
View realView=viewResolver.resolveViewName(viewName,Locale.US);
Map newModel=新HashMap(model);
newModel.put(“pdfMode”,Boolean.TRUE);
render(newModel、request、wrapper);
}
};
试一试{
render(映射、请求、httpServletResponse);
}捕获(例外e){
//暂时忽略
}
返回html.toString();
}
我的代码基于的贷方和贷方

我的问题是有没有更好的方法?我的代码运行良好,但现在我已经接近生产,我认为如果有改进的空间,我想尝试一下


多亏了所有的

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

e、 g


您将此作为一个问题提出。。。我把它看作是一个答案。。。正是我想要的。。。对我来说绝对有用,因为我只需要html将其作为json响应的一部分发送。。。竖起大拇指的人。。。你太棒了!
    <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>