2012-02-29 35 views
10

Tôi cần để có được kết quả đầu ra của Spring 3.1 MVC View thành một String (để gửi đến một trình chuyển đổi PDF, hoặc email MIME, vv ...) và tôi đã sử dụng đoạn mã sau:Lấy kết quả đầu ra của Spring 3.1 MVC View

này được tiêm vào Controller

@Autowired 
    TilesViewResolver viewResolver; 

và phương pháp helper sau:

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

tín dụng để Ted Young vàôngmà từ đó mã của tôi dựa trên.

Câu hỏi của tôi là có cách nào tốt hơn để thực hiện việc này? Mã tôi đã làm việc tốt nhưng bây giờ tôi đang gần gũi với sản xuất và tôi nghĩ rằng nếu có chỗ cho cải tiến tôi muốn thử nó.

Nhờ tất cả

+4

nop, có vẻ ổn. –

+0

bạn hỏi đây là câu hỏi ... Tôi thấy nó như một câu trả lời ... chính xác những gì tôi đang tìm kiếm ... hoàn toàn hữu ích với tôi vì tôi chỉ cần html để gửi nó như một phần của phản ứng json của tôi ... Thumbs up man ... Bạn đá! – CodeBurner

Trả lời

1

Bạn đang phá vỡ mẫu MVC bằng cách kết hợp với nhau chế độ xem và bộ điều khiển. Một giải pháp tốt hơn là định nghĩa một khung nhìn và đăng ký nó với ContentNegotiatingViewResolver. Dựa trên loại nội dung yêu cầu người giải quyết sẽ ủy quyền yêu cầu cho chế độ xem của bạn.

ví dụ:

<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> 
Các vấn đề liên quan