环境:
我正在使用 JSF2.2、Bootsfaces 0.9.1、Primefaces 6.0、JEE7 和 Hibernate 5.2 以及 MySQL 5.7 DB。
我拥有的:
我有一个包含一组图像的模型。该集合包含我的自定义 Image 类的实例,该类保存图像的值,如标题、描述和文件名。
图像存储在文件系统上,我使用 MySQL DB 来存储模型。我尝试在我的网络应用程序的视图上显示图像,一切正常。我还显示了一些来自 bootsfaces 的带有 b:carousel 标签的图像,一切都按照我的预期进行。
我尝试做的事情:
我尝试的下一步是用于显示一组不同尺寸的图像。以下代码是我尝试实现这一点的尝试:
<b:carousel id="carousel" style="width: 800px; height: 400px;">
<ui:repeat value="#{modelDetailBean.modelImages}" var="img">
<b:carouselItem>
<b:image value="#{modelDetailBean.getImage(img)}"/>
</b:carouselItem>
</ui:repeat>
</b:carousel>
我发现我的轮播中没有显示任何图像。然后我添加了至少 1 个修复来查看它是否正常工作,并认识到该组的所有图像都存在于轮播中,但是轮播没有正确考虑它们。
我的主要问题:
是否可以使用 ui:repeat 标签来填充轮播?
如果它是可能的:我怎样才能做到这一点?我在这里做错了什么?
如果不是:我必须使用哪些替代方案来使用 JSF 来实现这一点,而无需使用大量 javascript 等?
基本上,b:carousel
组件需要静态项目,但是ui:repeat
动态渲染它们。解决方案是改变一代b:carouselItems
到早期的 JSF 生命周期阶段。
JSF 分阶段执行其生命周期,负责呈现响应的生命周期是最后一个(下面的链接对此进行了很好的解释)。这里的关键点是您仍然可以使用 JSTL,它是一个标记处理程序而不是一个组件,并且在视图构建时执行。所以,基本上,更换你的ui:repeat
by c:forEach
应该可以解决你的问题:
<b:carousel id="carousel" style="width: 800px; height: 400px;">
<c:forEach items="#{modelDetailBean.modelImages}" var="img">
<b:carouselItem>
<b:image value="#{modelDetailBean.getImage(img)}"/>
</b:carouselItem>
</c:forEach>
</b:carousel>
这个技巧曾经给开发者带来了麻烦PARTIAL_STATE_SAVING在较旧的 Mojarra JSF 版本(2.1.18 及之前的版本)中,但现在不再了。无论如何,请始终记住 JSTL 在评估组件之前的行为。从下面的链接:
仅使用 JSTL 标记来控制 JSF 组件树构建的流程。使用
用于控制 HTML 输出生成流程的 JSF UI 组件。不要
将迭代 JSF 组件的 var 绑定到 JSTL 标记属性。做
不依赖 JSTL 标记属性中的 JSF 事件。
或者,忘记了b:carousel
组件,您可以使用 JSF 作为纯粹的 HTML 生成器,并使用纯 Bootstrap 生成显示轮播所需的 HTML,如自己做的部分docs http://showcase.bootsfaces.net/bootstrap/carousel.jsf.
也可以看看:
- JSF2 Facelets 中的 JSTL...有意义吗? https://stackoverflow.com/questions/3342984/jstl-in-jsf2-facelets-makes-sense
- 视图构建时间是多少? https://stackoverflow.com/questions/31890433/whats-the-view-build-time
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)