2011-12-28 4 views
2

Liferay Portal을 통해 브라우저에 PDF (직접 디스플레이) 파일을 보낼 수있는 방법을 찾고있었습니다. 많은 솔루션을 발견했습니다. 가장 인기있는 솔루션은 Servlet을 작성하여 작업을 수행하는 것입니다. JSR 286 스펙에서 포틀릿 리소스 서비스에 대해 읽었습니다. 누군가 Spring 3.0 포틀릿 MVC에 대해 자세히 설명해 주실 수 있습니까?Spring Portlet MVC Architecture - Liferay 6.0.6

<servlet> 
    <display-name>DownloadServlet</display-name> 
    <servlet-name>DownloadServlet</servlet-name> 
    <servlet-class>com.liferay.portal.pdf.DownloadServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>DownloadServlet</servlet-name> 
    <url-pattern>/DownloadServlet/*</url-pattern> 
</servlet-mapping> 

그리고 서블릿 구성되어 있습니다 : 나는 서블릿 <에 아무것도 찾을 수 없습니다

private void downloadServlet(HttpServletRequest req, 
      HttpServletResponse resp) throws ServletException, IOException { 

     logger.debug(" downloadServlet :: "); 
     BufferedInputStream bis = null; 
     BufferedOutputStream bos = null; 
     ServletOutputStream op = null; 
     try { 
      //Something 
      pdfContentVO=//getpdf VO here 

      String filename = "PDFFILE_"+pdfNumber+".pdf"; 

      op = resp.getOutputStream(); 
      resp.setContentType("application/pdf");  
      resp.setHeader("Content-Disposition", "attachment; filename=" 
        + filename); 
      resp.setContentLength(pdfContentVO.getPdfData().length); 
      System.out.println("pdfcontent"+pdfContentVO.getPdfData()); 
      op.write(pdfContentVO.getPdfData()); 
      op.flush(); 
      op.close(); 


     } catch(final IOException e) { 
      System.out.println ("IOException."); 
      throw e; 
     } finally { 
      if (bis != null) 
      { 

       bis.close(); 
      } 
      if (bos != null) 
      { 
       bos.flush(); 
       bos.close(); 
      } 
     } 

    } 

답변

7

-> 포틀릿 매핑 일을. 그래서 스프링 포틀릿 MVC와 주석을 사용하여 pdf를 보내기 위해 Resource mapping을 사용했습니다. 참조 : JSP에서 http://developers.sun.com/portalserver/reference/techart/jsr286/jsr286_2.html

:

<context:annotation-config /> 
<context:component-scan base-package="com.xxx" /> 

새로운 컨트롤러를 정의 :

포틀릿의 봄 ApplicationContext.xml에서
<portlet:resourceURL var="PDFActionURL"> 
     <portlet:param name="reportType" value="pdf" /> 
     <portlet:param name="pdfNumber" value="${pdfNumber}" /> 
    </portlet:resourceURL> 
    <input type="button" name="viewPDFButton" value="View PDF" onClick="self.location = '${PDFActionURL}';" /> 

,이 포함

import java.io.IOException; 
import java.io.OutputStream; 

import javax.portlet.PortletException; 
import javax.portlet.ResourceRequest; 
import javax.portlet.ResourceResponse; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.portlet.bind.annotation.ResourceMapping; 

import com.xxx.pdf.PDFBO; 
import com.xxx.PDFDTO; 
import com.liferay.portal.kernel.servlet.HttpHeaders; 
import com.liferay.portal.kernel.util.ParamUtil; 

@Controller("pdfController") 
@RequestMapping(value = "view") 
public class PDFController { 
    private final static Logger LOG = LoggerFactory.getLogger(PDFController.class); 

    //This is using Spring 3.0 Annotation Mapping (Spring Portlet MVC Architecture) 
    @ResourceMapping 
    public void serveResource(ResourceRequest resourceRequest, ResourceResponse res) throws PortletException, IOException { 
     LOG.info("In serveResource: ResourceURL"); 
     String returnType = ParamUtil.getString(resourceRequest, "reportType"); 
     String pdfNumber = ParamUtil.getString(resourceRequest, "pdfNumber"); 
     LOG.info("returnType:" + returnType + " pdfNumber:" + pdfNumber); 
     String filename = "FILENAME_"+pdfNumber+".pdf"; 
     // HttpServletRequest request = 
     // PortalUtil.getHttpServletRequest(resourceRequest); 

     if (returnType != null && returnType.equals("pdf")) { 
      try { 
       //GET YOUR PDF HERE 
       //PDFBO pdfBO = new PDFBO(); 
       //PDFDTO pdfContentVO = null; 
       //pdfContentVO = pdfBO.getPDF(pdfNumber); 
       res.setContentType("application/pdf"); 
       res.addProperty(HttpHeaders.CACHE_CONTROL, "max-age=3600, must-revalidate"); 
       res.addProperty(HttpHeaders.CONTENT_DISPOSITION,"filename="+ filename); 
       //Use this to directly download the file 
       //res.addProperty(HttpHeaders.CONTENT_DISPOSITION,"attachment"); 
       OutputStream out = res.getPortletOutputStream(); 
       //out.write(pdfContentVO.getPdfData()); 
       out.write(/*get pdf byte[] Array Here */); 
       out.flush(); 
       out.close(); 
      } catch (Exception e) { 
       LOG.info("Error in " + getClass().getName() + "\n" + e); 
      } 
     } 
    } 
} 

편집 : 이전 버전의 Liferay를 사용하고 있다면, 이것은 위대한 예술입니다 Liferay를 통해 파일 다운로드/서빙 구현하기 - https://www.liferay.com/web/raymond.auge/blog/-/blogs/801426

+0

스프링 컨트롤러에서 요청 매핑 URL을 매핑하는 실제 방법은 portlet : resourceURL 태그의 'id'속성을 사용하고 컨트롤러의 @ResourceMapping 속성 . 메서드에 URL을 매핑해야합니다. 그러나 만약 당신이 직접 비교하고 매핑하는 것을 꺼리지 않는다면, 위의 방법은 잘 동작합니다. –