2010-11-01 26 views
3

编辑的问题将JSF 2复合组件...在运行时从后台bean

你好,

我想加载从后台bean我复合元件的.xhtml文件,并将其添加到动态的页面。 .xhtml文件的名称来自一个变量。

例:

public MyBean(){ 

    String componentFile = "myCompositeComponent.xhtml" 

    public String addComponentToPage(){ 

      //how do that?... 

      return null; 
    } 

} 

谢谢!

+2

关键是,这个问题并没有什么意义。 [复合组件](http://download.oracle.com/javaee/6/tutorial/doc/giqzr.html)仅适用于XHTML,不适用于Java代码。 “CCPageLoader”的代码看起来完全不清楚,所以不可能猜测/理解你实际上的含义。在解决术语和/或提供一些代码以便更好地理解问题之前,这个问题将一直没有答案。 – BalusC 2010-11-14 13:00:23

+0

嗨BalusC,我想要做的:加载复合组件的xhtml文件,并将其添加到页面。这需要通过页面的后台bean来完成。感谢帮助。 – Fabio 2010-11-15 07:54:34

+0

[如何以编程方式或动态创建JSF 2中的复合组件](http://stackoverflow.com/questions/5370184/how-to-programmatically-or-dynamically-create-a-composite-component-in -jsf-2) – sleske 2013-11-08 15:57:10

回答

5

无法可能。复合组件是基于模板的,只能在视图中使用。你最好的选择是准确地重复你最初写在模型中复合组件中的JSF代码。更好的办法是创建一个完整的@FacesComponent类,它延伸UIComponent,完成@FacesRenderer。诚然,这是一件乏味且不透明的工作,但这样你最终会得到一个组件,它可以通过单一代码行在视图和模型中重复使用。

另一种替代方法是将所有可能的组件放置在视图中并使用rendered属性。

<my:component1 rendered="#{bean.myComponentType == 'component1'}" /> 
<my:component2 rendered="#{bean.myComponentType == 'component2'}" /> 
<my:component3 rendered="#{bean.myComponentType == 'component3'}" /> 
... 

如果需要,将其包裹在Facelets标记文件中,以便它可以隐藏并在多个位置重用。

+0

非常感谢!所以我可以理解,JSF中的复合组件与其他语言/框架(如.ascx文件(.net)或.mxml(Flex)中的“复合组件”实际上是不同的......我阅读了文章和文档,但是这方面还不够清楚。 – Fabio 2010-11-16 11:53:13

+0

你是否检查过这个:http://forums.java.net/node/701640用户'lexi'研究/描述了一些方法。尽管他遇到了困难,但他表示他提出了一个可行的解决方案(请参阅第二篇最后一篇文章),但不幸的是这个解决方案有点神秘。最后的消息描述了Ed Burns也提出的另一个更简单的选择。但是,根据相同的帖子,它不起作用。对这些方法有什么想法? – 2010-11-23 14:53:59

+0

@Tuukka:有趣。但这很糟糕,并且不是由JSF API提供的(因此JSF-impl特定)。 – BalusC 2010-11-23 15:06:51

0

我不明白你为什么要添加一个支持bean的复合组件。我想你想在事件发生时动态显示它,但为此还有AJAX reRender。

例如,你可以做到以下几点:

<h:panelGroup id="composite" rendered="#{myBean.renderComponent}"> 
    <my:compositecomponent/> 
</h:panelGroup> 

renderComponent属性存储boolean值。您可以将该值和reRender composite切换为例如Richfaces的<a4j:commandLink>

希望帮助,丹尼尔

+0

对不起,我可以做到这一点,但我不知道组件的名称,该名称来自一个字符串变量... – Fabio 2010-11-15 07:53:27

+0

我认为你想要做的事反对基本的设计概念。我想你应该考虑另一种解决问题的方法。 – 2010-11-15 20:10:12

+2

很容易想出你想要这样做的情况(从Java代码中调用复合组件)。例如,考虑一个将构建长/复杂DOM结构的组件。通常情况下,您会将其作为复合组件实现,但在某些情况下,它们不仅具有足够的灵活性,而且还可以扩展UIComponent并使用ResponseWriter。但是,在UIComponent中执行复杂的逻辑并调用复合组件(模板)来实际构建(大部分)UI将会更好。当您切换到Java代码时,您遇到UIComponents:/ – 2010-11-23 14:31:46