我正在开发一个使用JSF 2.0,PrimeFaces和PrettyFaces作为主要框架/库的Web项目。页面具有以下(常见)结构:标题,内容,页脚。
标题
标题始终包含相同的菜单。此菜单是一个自定义组件,它生成一个包含<ul><li>
html链接的递归html <a href="url">
列表,这些都是使用自定义渲染器呈现的。该链接类似于“domain.com/website/datatable.xhtml?ref=2”。其中ref = 2用于从数据库加载正确的内容。我使用prettyfaces将这个请求值存储在一个backbean中。
问题1 :我自己渲染<a href>
链接是否可以,或者我应该更好地从我的UIComponent添加HTMLCommandLink并在encodeBegin / End中呈现它?
问题2 :我认为传递这样的变量并不是真正的JSF 2.0风格,如何以更好的方式做到这一点?
内容: 内容包含动态数据。它可以是(primefaces)数据表,使用来自数据库的动态数据构建。它也可以是一个文本页面,也是从数据库加载的。或者一系列图表。你明白了,它很有活力。内容基于标题菜单中按下的链接。如果内容是datatable类型,那么我将ref = 2变量放到DataTableBean(通过prettyfaces),然后从数据库加载正确的数据表。如果内容是图表类型,我会将它放在ChartBean上。
问题3 :这是正常的设置吗?理想情况下,我想通过Ajax更新我的内容。
我希望很清楚:)
答案 0 :(得分:1)
可以自己输出链接,commandLink是不可能的(它使用javascript进行回发,它不是你想要的);
参数都在param隐式对象中。您可以通过@ManagedProperty注释插入它们,如下所示:
@ManagedProperty("#{param.ref}")
String ref
// .. getters, setters (obligatory!)
您还可以使用(如果您使用的是JSF 2)f:viewParam标记(一个很好的描述http://blogs.oracle.com/rlubke/entry/jsf_2_0_bookmarability_view),您将获得验证和转换的奖励。
我理解它的方式,你的设置相当复杂。使用手写的自定义组件进行菜单是一个巨大的过度杀伤(至少从提供的描述来判断),复合组件可能会这样做。 JSF没有特殊的方法在视图之间进行ajax调用或将视图嵌入到另一个中,所以 - 除非你使用iframe - 你唯一的选择是将所有可能的内容包含在一个视图中,包含在面板中,然后渲染它们根据要求:
<h:panelGroup rendered='#{backingBean.ref == 2}'>
... content 2 ...
</h:panelGroup>
等等。小心,这对资源来说是重。
你也可以在javascript中编写自己的ajax解决方案。这将要求所有内容都是完全独立的视图,具有自己的形式。此外,他们所有的回发都必须通过ajax,因此主页面不会重新加载。