【问题标题】:Export dynamic data from a JSP page to CSV in Struts2在 Struts2 中将动态数据从 JSP 页面导出到 CSV
【发布时间】:2016-11-10 01:28:40
【问题描述】:

我正在尝试实现用户以CSV 格式下载文件的功能。我已经完成了下载部分,我能够将JSP 转换为CSV 格式,但我面临的问题是我无法将动态数据从JSP 传输到CSV 文件。下载文件后,我看到了JSP tags 和它的所有其他内容,而我只想看到数据,而不是JSP tagsforms 等。

动作类:

public String viewReport() throws Exception {
    boolean returnReport;

    String filePath = "fileName.jsp";

    File file = new File(filePath);
    inputStream = new FileInputStream(file);

    try {
        returnReport = validateRequest();
        if (returnReport) {
            setIntgList(generateViewIntegrationReportData(getESignUIConfig()));
        } else {
            failureResponse(msgs, 400);
            return null;
        }
    } catch (Exception e) {
        e.printStackTrace();
        msgs.add(new Message(ESignatureIntegrationMessageTypeEnum.MESSAGE_TYPE_ERROR, 
                    UiIntegrationKeyConstants.UI_INTEGRATION_ERROR_CODE_500, UiIntegrationKeyConstants.UI_INTEGRATION_ERROR_TEXT_SERVICE_ERROR));
        failureResponse(msgs, 500);
        return null;
    }

    return UiIntegrationKeyConstants.INTEGRATION_DETAILS_REPORT_REPSONSE;
}

JSP:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib uri="/WEB-INF/integration.tld" prefix="integration" %>

<link rel="stylesheet" type="text/css" href='<integration:file  name="integration.css" type="CSS" prefix="/esign/styles/"/>'/>
<script language="javascript" type="text/javascript" src="<integration:file  name="integration.js" type="JS" prefix="/esign/scripts/integration/"/>">
</script>
<h1><center>Transaction Report Page</center></h1>
<br></br>
<c:forEach items="${intgList}" var="list">
        <tr class="<%=count % 2 != 0 ? "odd" : "even"  %>">
            <td class="dataFieldCell1" align="center"><c:out  value="${list.lob}" /></td>
            <td class="dataFieldCell1" align="center"><c:out value="${list.insuredName}" /></td>
            <td class="dataFieldCell1" align="center"><c:out value="${list.custPhone}" /></td>
             <c:if test="${list.policyNbrLink eq true}">
                <td class="dataFieldCell1" align="center"><a href='#x' style="text-decoration:none" onclick="locateFunc('viewESignPolicyDetails',
                                                                                                                    {'agencyCode':'${list.agencyCode}',
                                                                                                                     'policyNumber':'${list.policyNumber}',
                                                                                                                     'policyState':'${list.policyState}',
                                                                                                                     'esignIdentifier':'${list.esignId}',
                                                                                                                     'esignVendorIdentifier':'${list.esignVendorIdentifier}',
                                                                                                                     'transId':'${list.transId}',
                                                                                                                     'lob':'${list.lob}',
                                                                                                                     'customerName':'${list.insuredName}',
                                                                                                                     'customerPhone':'${list.custPhone}',
                                                                                                                     'customerEmail':'${list.custEmail}',
                                                                                                                     'cretedDate':'${list.createdDate}'}
                                                                                                                    )"><c:out value="${list.policyNumber}"/></a></td>
            </c:if> 
            <c:if test="${list.policyNbrLink eq false}">
                <td class="dataFieldCell1" align="center"><c:out value="${list.policyNumber}"/></td>
            </c:if>
            <td class="dataFieldCell1" align="center"><c:out value="${list.createdDate}" /></td>
            <td class="dataFieldCellWrap" align="center"><c:out value="${list.custEmail}" /></td>
             <td class="dataFieldCell1" align="center"><a href='#x' onclick="locateFunc('viewESignDetails',
                                                                     {'url':'<integration:urlAction actionName="/integration/viewDetailsIntegration"><integration:urlParam key="esignIdentifier" value="${list.esignId}"/></integration:urlAction>',
                                                                     'agencyCode':'${list.agencyCode}',
                                                                     'policyNumber':'${list.policyNumber}',
                                                                     'policyState':'${list.policyState}',
                                                                     'esignIdentifier':'${list.esignId}',
                                                                     'esignVendorIdentifier':'${list.esignVendorIdentifier}',
                                                                     'lob':'${list.lob}',
                                                                     'transId':'${list.transId}',
                                                                     'customerName':'${list.insuredName}',
                                                                     'customerPhone':'${list.custPhone}',
                                                                     'customerEmail':'${list.custEmail}',
                                                                     'cretedDate':'${list.createdDate}'}
                                                                    )"><c:out value="${list.esignNumDocs}"/></a></td> 
        </tr>
        <%count++;%>
    </c:forEach> 

Struts.xml

<action name="*Integration" method="{1}" class="classPath">
        <result name="success" type="tiles">integrationView</result> 
        <result name="integrationDetailsReportResponse" type="stream">
            <param name="contentType">application/octet-stream</param>
            <param name="inputName">inputStream</param>
            <param name="contentDisposition">attachment;filename="integrationReportDetailsView.csv"</param>
            <param name="bufferSize">1024</param>
        </result>   
</action>

有一些类似的问题,但它们令人困惑,我无法将它们与我的需求联系起来,所以请不要重复。

【问题讨论】:

  • 我做了一项研究,Struts.xml 中的配置应该可以处理所有事情,但它没有显示数据。它仅显示原始 jsp 内容。你对此有什么想法吗?
  • 显然,您不能将 jsp 导出到 csv。 (但您可以借助 S2 插件将视图导出为 pdf。)如果您需要 csv,则在服务器上创建它并流回给用户。
  • 请看OpenCSV库。

标签: java jsp csv struts2


【解决方案1】:

也许我理解错了,但你试图做的事情是不可能的。

您将 fileName.jsp 放入 InputStream 并将其下载为 integrationReportDetailsView.csv?当然你无法获取jsp的动态内容,你所做的类似于使用FTP服务器下载文件。

jsp 的动态内容是由服务器在您发出请求时创建的,但您不是调用 jsp,而是调用下载文件的二进制数据并将其作为附件发送的操作。服务器从不处理它,因此不会评估 jsp 标签,也不会创建动态内容。

【讨论】:

  • fileName.jsp 是我正在下载的同一个文件。我不想显示它的绝对路径。因此,要显示动态数据,必须在服务器中处理文件。
【解决方案2】:

我不知道为什么没有人回答这个问题,我认为这个问题并不难。因此,为了获取从JSPCSV 文件格式的动态数据,我们需要将Serialize 我们的Java ObjectCSV 格式。有一些libraries 可以用来实现这个目标。我使用了OpenSCV 并将我的POJO 传递给它。现在,当我单击按钮时,我不仅可以下载文件,还可以将数据从JSP 获取到CSV。我缺少的是 Object 的 Serializing 部分。

This 链接可能对某人有所帮助。

【讨论】:

  • 这不是jsp转csv。
  • JSP 不是 POJO。您能否分享一个如何将处理后的 JSP 传递给 OpenSCV 序列化程序的示例?听起来很有趣,但我想不出办法。
  • 在JSP中通过Spring Expression语言可以正确显示数据。因此,不要在那里显示它,而是使用 Struts2 序列化 POJO 或 java bean 将文件下载为 CSV 文件,或者使用非常简单的措辞使用 OpenCSV 下载一个简单的 java 类。
猜你喜欢
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
相关资源
最近更新 更多