10 votes

Obtenir la sortie rendue d'une vue Spring 3.1 MVC

Je dois obtenir la sortie rendue de la vue Spring 3.1 MVC dans une chaîne (pour l'envoyer à un convertisseur PDF, ou à un e-mail MIME, etc ...) et j'ai utilisé le code suivant :

Ceci est injecté dans le contrôleur

    @Autowired
    TilesViewResolver viewResolver;

Et la méthode d'aide suivante :

    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 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 newModel = new HashMap(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();
    }

Crédit à Ted Young et son HTML2PDFViewResolver sur lequel est basé mon code.

Ma question est : y a-t-il une meilleure façon de faire cela ? Le code que j'ai fonctionne bien mais maintenant que je me rapproche de la production, je me suis dit que s'il y a une place pour l'amélioration, j'aimerais l'essayer.

Merci à tous

1voto

praveenj Points 310

Vous enfreignez le modèle MVC en regroupant la vue et le contrôleur. Une meilleure solution est de définir une vue et de l'enregistrer dans ContentNegotiatingViewResolver. En fonction du type de contenu demandé, le résolveur déléguera la requête à votre vue.

par exemple

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X