2012-02-29 10 views
10

Ho bisogno di ottenere l'output di rendering di Spring 3.1 MVC View in una stringa (per l'invio a un convertitore PDF, o a un messaggio MIME, ecc ...) e sono stato con il seguente codice:Ottenere l'output di rendering di una MVC Spring 3.1 View

Questo viene iniettato nel controller

@Autowired 
    TilesViewResolver viewResolver; 

e il seguente metodo di supporto:

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(); 
    } 

credito alla Ted Young e il suo HTML2PDFViewResolver da cui è basato il mio codice.

La mia domanda c'è un modo migliore per farlo? Il codice che ho funziona va bene, ma ora mi sto avvicinando alla produzione e ho pensato che se c'è spazio per miglioramenti mi piacerebbe provarlo.

Grazie a tutti

+4

nop, sembra buono. –

+0

hai chiesto questo come una domanda ... L'ho visto come una risposta ... esattamente quello che stavo cercando ... assolutamente utile per me in quanto avevo solo bisogno dell'HTML per inviarlo come parte della mia risposta JSON ... Pollice su uomo ... Rock! – CodeBurner

risposta

1

si sta rompendo il pattern MVC dalla discoteca insieme la vista e controllore. Una soluzione migliore è definire una vista e registrarla in ContentNegotiatingViewResolver. In base al tipo di contenuto richiesto, il resolver delegherà la richiesta alla propria vista.

ad es.

<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> 
Problemi correlati