2012-02-29 15 views
10

Potrzebuję uzyskać renderowane wyjście widoku Spring 3.1 MVC na ciąg (w celu wysłania do konwertera plików PDF lub wiadomości MIME itp.) I Używam następujący kod:Uzyskiwanie renderowanego wyjścia Spring 3.1 MVC View

To jest wstrzykiwany do sterownika

@Autowired 
    TilesViewResolver viewResolver; 

a następującej metody pomocnika:

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

zgłosił Ted Young i jego HTML2PDFViewResolver, z której oparty jest mój kod.

Moje pytanie jest lepszym sposobem na zrobienie tego? Kod, który mam działa dobrze, ale teraz zbliżam się do Produkcji i pomyślałem, że jeśli jest miejsce na ulepszenie, chciałbym spróbować.

Dzięki wszystkim

+4

nop, wygląda dobrze. –

+0

zadałeś to pytanie ... Postrzegałem to jako odpowiedź ... dokładnie to, czego szukałem ... absolutnie przydatne dla mnie, ponieważ potrzebowałem tylko html, aby wysłać go jako część mojej odpowiedzi jsona ... Kciuki w górę, człowiek ... Rocka! – CodeBurner

Odpowiedz

1

łamiesz wzorca MVC przez clubbing razem widok i kontroler. Lepszym rozwiązaniem jest zdefiniowanie widoku i zarejestrowanie go w ContentNegotiatingViewResolver. Na podstawie żądanego typu zawartości program tłumaczący delegowałby żądanie do widoku.

np.

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