当前位置: 首页 > 面试题库 >

在Spring Portlet MVC架构中提供PDF-Liferay 6.0.6

颛孙晗昱
2023-03-14
问题内容

我正在寻找一种通过Liferay Portal将PDF(直接显示)文件发送到浏览器的方法。找到了许多解决方案-
最受欢迎的解决方案是编写一个完成该任务的Servlet。我已经阅读了JSR 286规范中的Portlet资源服务,请问有人可以详细说明Spring 3.0
Portlet MVC吗?

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

Servlet包括:

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

    }

问题答案:

我在Servlet <-> Portlet映射上找不到任何东西。因此,我使用资源映射通过注释使用Spring Portlet
MVC发送pdf。参考:http :
//developers.sun.com/portalserver/reference/techart/jsr286/jsr286_2.html

在JSP中:

    <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}';" />

在Portlet的Spring ApplicationContext.xml中,包括以下这些:

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

定义一个新的控制器:

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



 类似资料:
  • 我读了一些文章,看了一些视频,但在为这些微服务提供服务方面,没有找到具体的建议。我的理解是,他们应该使用自己的应用程序服务器。 我的问题是它们应该部署在不同的服务器上,还是没关系。 当它们在同一台服务器(计算机)上提供服务时,不会有端口冲突吗?

  • 我在DynamoDB中创建了一个表“user\u info”,其中有一个主哈希键“user\u id”(String),没有范围键。然后,我创建了2个AWS lambda函数来插入和查询项目。我可以将项目插入表中,但查询表时,它会返回: ValidationException:提供的键元素与架构不匹配。 我的查询功能: 我一直得到这个例外: 自从 1) 我只有一个哈希主键。 2)user_id定义

  • 我正在按照本教程将 Graphql 与 Django 集成,当我在本地机器上点击 graphql URL 时,我根据该教程执行了所有操作 http://localhost:8000/graphql 我得到以下错误 断言错误在 /graphql 需要向GraphQLView提供架构。 请求方法:GET请求URL:http://localhost:8000/graphqlDjango版本:1.11.1

  • 我正在尝试使用AWS Lambda函数将csv数据从S3写入DynamoDB。我当前收到以下错误“BatchWriteItem操作:提供的键元素与架构不匹配”。 这个问题有快速解决办法吗? 错误如下所示: 调用BatchWriteItem操作时发生错误(ValidationExc0019):提供的键元素与模式不匹配:ClientError Traceback(最近的调用最后一次): 文件“/var

  • 我使用spring-boot-starter-data-solr,并希望利用Spring Data Solr的schmea cration支持,如文档中所述: 每当刷新应用程序上下文时,自动架构填充都会检查您的域类型,并根据属性配置将新字段填充到索引中。这要求 solr 在无架构模式下运行。 但是,我无法实现这一目标。据我所知,Spring启动器不会在@EnableSolrRepositories

  • 我使用PHP Mailer将交互式PDF发送到电子邮件地址。这可以在本地将脚本从PDF调用到服务器,但在服务器上完成PDF时不起作用。 代码如下: 我是不是错过了什么?$mail的所有值(主机、用户名、密码等)都是正确的——但是当它创建要发送的PDF时,它只是通过