【问题标题】:Returning list of images on JSF page返回 JSF 页面上的图像列表
【发布时间】:2011-04-01 22:40:15
【问题描述】:

我有一个用户可以从中选择的项目的下拉列表(视图是 JSF)。在用户从下拉列表中选择一个项目后,我希望图像出现在同一个 JSF 页面上(即用户从下拉列表中选择单词“Cat”,并出现一组不同的猫图像)

如何在 JSF 中编写代码?

注意*我使用的是带有 facelets 的 JSF 2.0,而不是 JSP。

【问题讨论】:

  • 您将图像存储在哪里?您是否有类似 Image 类的东西来存储图像 URL 并告诉您这是一张猫的图片?
  • 好问题。我将图像直接存储在服务器上(glassfish v3)。在阅读了更多文章后,我发现我不应该将图像存储在数据库(mysql)中。截至目前,我将它放在用户可以从我的下拉列表中选择一个选项的位置,并且我可以在我的类中设置该值。我只是不知道下一步该怎么处理这个值。

标签: java jsf facelets jsf-2


【解决方案1】:

BalusC 的回答(一如既往:) 是正确的,但正如您所注意到的,在 selectOneMenu 中会有一个 URL 列表。这正是我问你如何存储图像的原因。我通常这样做的方式:(据我所知,这是标准的做法,如果我错了,希望有人会纠正我)你将图像存储在服务器上的某个地方,并在你的数据库中存储它的位置。这就是为什么我建议创建一个 MyImage 类(将映射到数据库表),您将在其中存储图像的名称以及在服务器上获取其位置的方法(例如,您可以使用像猫这样的命名空间来完成它将有一个String namespace = "cats" 和一个String imageName 以及一个返回像String getImageLocation() {return "@987654321@"+namespace+"/"+imageName;} 这样的url 的方法,记住让它看起来像一个getter 是很重要的,这样JSF 才能使用它)。然后,您所要做的就是从您的数据库中获取给定命名空间的 MyImages 列表,并在 dataTable 中呈现图像,如下所示:

<h:dataTable value="#{myBeanWithAListOfImages.images}" var="img">
    <h:column>
        <h:graphicImage value="img.imageLocation"/>
    </h:column>
</h:dataTable>

其中 images 是 List&lt;MyImage&gt;。这应该可以工作并将图像打印在一个列中。

【讨论】:

  • 这是有道理的。我会试一试。仅供参考,我宁愿不呈现数据表。我对 UI 真的很挑剔,如果你熟悉的话,我一直在寻找返回的图像列表,类似于 Netflix 的电影图像:)。 (即根据您要查找的电影类型,netflix 返回电影图像行,并在每个选项下方都有一个播放按钮)
  • 我知道你的意思,可能(我认为 MacOS/iPhoneOS 有类似的图片列表),但不幸的是,使用 JSF 编码并不容易。您可以像 BalusC 所说的那样使用 ,但它只会向您显示一个水平列表(我猜您想查看〜3张图像并具有上一个/下一个按钮或类似的东西?)。好吧,我想您可以对其进行编码,但是正如我所说,我认为目前还没有预制控件(我知道我在 Flex 中做过类似的事情,这很容易,但是当涉及到编码“闪亮”的东西)。
  • 是的,今天在我的代码上花了几个小时之后,我认为 dataTable 可能是合适的。我在使用带有 f:ajax 的 dataTable 时遇到了问题。你能举个例子吗? -C
【解决方案2】:

在下拉列表中提供包含图片 URL 的列表,并使用 h:graphicImage 在所选 URL 上显示图片。然后,使用f:ajax 在更改下拉菜单时重新渲染图像。

这是一个启动示例:

<h:form>
    <h:selectOneMenu value="#{bean.imageURL}">
        <f:selectItems value="#{bean.imageURLs}" />
        <f:ajax event="change" render="image" />
    </h:selectOneMenu>
    <h:graphicImage id="image" value="#{bean.imageURL}" /> 
</h:form>

豆子:

private List<String> imageURLs; // +getter
private String imageURL; // +getter +setter

【讨论】:

  • 感谢您的回复。这似乎合乎逻辑。我听说过使用 Ajax 的建议。我很感激反馈。 -卡尔文
  • 我唯一不清楚的是字符串将如何呈现在页面上。从您的代码中,用户会看到“http://...”字符串列表作为选择吗?
  • &lt;h:graphicImage&gt; 呈现 HTML &lt;img&gt; 元素。 value 成为它的 src 属性。所以从逻辑上讲,您可以将这些图像放在公共 Web 内容中,也就是您的 JSF/XHTML 文件所在的位置。在浏览器中打开页面,右键单击并选择查看源代码。一切都会变得清晰。
  • 这个逻辑是否适用于多个图像? (即我从下拉列表中选择“猫”返回多张猫的图像)?
  • 真的,只需将&lt;h:graphicImage&gt; 放入&lt;ui:repeat&gt;&lt;h:dataTable&gt; 并在更改时重新渲染它。请改用Map&lt;String, List&lt;String&gt;&gt; 来保存图像。
猜你喜欢
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 2010-10-28
  • 1970-01-01
  • 2015-03-05
相关资源
最近更新 更多