【问题标题】:Getting csv response at client side在客户端获取 csv 响应
【发布时间】:2023-03-03 02:24:02
【问题描述】:

我正在尝试从 JSF 托管 bean 中检索 csv 文件。

我现在就是这样做的,

CsvController: 以文本/csv 内容类型响应输出的 Bean。

samplecsv.xhtml: 包含代码的网页:

#{csvController.generateReport()}

当我在浏览器上浏览此页面时,会打开一个下载对话框,可以下载 csv 文件。

report.xhtml:

下载该 csv 的网页:

d3.csv('http://mysite/samplecsv.xhtml');

有没有办法摆脱 samplecsv.xhtml 并直接从 report.xhtml 中的 bean 中检索 csv 文件? 类似d3.csv('http://mysite/csvController/report') 会很完美

【问题讨论】:

  • 我没用过!问题是我们并不是真正的java专业人士。我们需要一个快速的 Web 应用程序,并通过将 JSF(带有primefaces 和omnifaces)与spring 集成来构建一个(认为这将是世界上最好的)。它在短期内对我们有好处,但我正在考虑完全删除 JSF 并使用纯 spring mvc。牢记这一转变,将 Spring servlet 用于 csv 文件并将其余部分留给 Faces Servlet 是否是个好主意?
  • 这确实是我正在寻找的。现在新的实现将由 CsvServlet 组成,它以报告名称作为参数。我仍然对如何解决报告并确保它正确初始化感到困惑。每个报告都是一个托管 bean,它使用自动装配的 DataSource 和其他服务访问其他 bean。我不想将所有报告注入 CsvServlet。从 Csv 请求中读取报告名称后,如何调用已使用数据源和服务自动初始化的相应报告 bean?
  • 这就是我的想法: 1. CsvServlet:对于每个请求,使用 ReportResolver 以 csv 文件响应 2. ReportResolver:CsvServlet 将报告名称传递给它,并且 ReportResolver 应该能够初始化报告和从报告中获取 csv 字符串。 3. 报告:触发 sql 查询,并通过调用将结果集转换为 csv 字符串的服务返回 csv 字符串作为输出。 (@Autowired 应该仍然适用于所有人)
  • 我知道 CsvController 将是一个响应 csv 文件的 servlet。我还想要的是报告的自动映射。像site/report/report1 这样的请求应该自动为report1 生成csv。我了解对 /report 的请求将由 CsvController 处理。然后我需要对逻辑进行编码以确定请求要求的报告。会有大量的报告,所以我希望能够自动解决报告。也许我应该使用 Java 反射。
  • 好的,所以我必须编写一个自动化系统来正确解析报告,对吧?

标签: jsf csv


【解决方案1】:

您所询问的模式并不是 JSF 工作方式的真正原生模式。见JSF 2: invoking managed bean directly

如果您仍想直接从托管 bean 下载内容,这里有一个示例说明如何执行此操作。无论如何,report.xhtml 中下载链接的 url 应该使用一些 jsf 组件生成,例如<f:commandLink action="#csvController.download()}" /> 请参阅How to provide a file download from a JSF backing bean?

我推荐的方法是创建一个新的 @WebServlet("/csvController") 或 JAX-RS @Path("/csvController") 前端并从这里调用您的业务逻辑。要从 servlet 访问托管 bean,您可以这样做:Possible to inject @ManagedBean as a @ManagedProperty into @WebServlet?

无论如何,我建议你看看: Backing beans (@ManagedBean) or CDI Beans (@Named)? Are @ManagedBeans obsolete in JavaEE6 because of @Named in CDI/Weld?

【讨论】:

  • 感谢您的回复。我们正在使用 spring 和 primefaces 之间的集成:github.com/michail-nikolaev/primefaces-spring-scopes。我们正在尝试慢慢移除 primefaces 部分。我们对所有页面使用 FacesServlet。是否可以将 Spring 的 servlet 用于 csv 文件?
  • 是的。你可以。下面是 2 个使用 Spring 实现下载控制器的示例:codejava.net/frameworks/spring/…codejava.net/frameworks/spring/…。无论如何,我建议您将您的#generateRepòrt 函数移动到 Spring 托管 bean。
  • 好的。然后我将尝试对 csv 使用 SpringServlet,而对应用程序的其余部分使用 FacesServlet。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 2017-04-23
  • 2019-12-18
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多