Получение визуализированного вывода Spring 3.1 MVC View - PullRequest
10 голосов
/ 29 февраля 2012

Мне нужно получить обработанный вывод Spring 3.1 MVC View in String (для отправки в 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();
    }

Кредит Тед Янг и его HTML2PDFViewResolver, на котором основан мой код.

Мой вопрос: есть ли лучший способ сделать это?Код, который у меня работает, работает нормально, но сейчас я приближаюсь к Production, и я подумал, что если есть возможности для улучшения, я хотел бы попробовать его.

Спасибо всем

1 Ответ

1 голос
/ 13 августа 2014

Вы нарушаете схему MVC, объединяя вид и контроллер.Лучшее решение - определить представление и зарегистрировать его в ContentNegotiatingViewResolver.На основе запрошенного типа контента распознаватель делегирует запрос вашему представлению.

например

    <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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...