2012-02-29 19 views
10

Spring 3.1 MVC Viewのレンダリングされた出力をStringに取得する必要があります(PDFコンバータへの送信、またはMIMEメールなど)。私は、次のコードを使用している:Spring 3.1 MVCビューのレンダリングされた出力を取得する

これは、コントローラ

@Autowired 
    TilesViewResolver viewResolver; 

そして、次のヘルパーメソッドに注入されていますTed Youngと彼の0123に

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

クレジット私のコードの元になっています。

私の質問はこれを行う良い方法がありますか?私のコードはうまくいきますが、今はプロダクションに近づいています。改善の余地があるなら、試してみたいと思いました。すべて

+4

nopです。 –

+0

あなたはこれを質問として尋ねました...私はそれを答えとして見ました...まさに私が探していたものです...私はjsonの応答の一部としてHTMLを送信するだけでいいので絶対に役に立ちました...あなたの肩を上げて...あなたは揺れます! – CodeBurner

答えて

1

ありがとうございます、一緒ビューとコントローラをクラビングで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> 
関連する問題