0

我正在使用(简单)JSF 2 自定义组件。

我的意思是我正在使用 taglib.xml 文件,例如:

<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib id="sentest"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
    version="2.0"
>
    <namespace>http://www.senat.fr/taglib/sentest</namespace>

[...]
    <tag>
        <description>
            <![CDATA[
            À COMPLÉTER
            ]]>
        </description>
        <tag-name>senMandats</tag-name>
    <source>tags/sen/senMandats.xhtml</source>
        <attribute>
            <description>
                <![CDATA[
        Identifiant unique.
        ]]>
            </description>
            <name>id</name>
            <required>true</required>
            <type>java.lang.String</type>
        </attribute>
        <attribute>
            <description>
                <![CDATA[
     Contexte de sélection du Sénateur.
    ]]>
            </description>
            <name>context</name>
            <required>true</required>
        </attribute>
    </tag>
</facelet-taglib>

该组件是使用 ui 组合定义的:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html lang="fr"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:composite="http://java.sun.com/jsf/composite"
    xmlns:p="http://primefaces.org/ui"
    xmlns:sen="http://java.sun.com/jsf/composite/sen"
    xmlns:fn="http://java.sun.com/jsp/jstl/functions"
    xmlns:sf="http://www.senat.fr/taglib/senfunctions"
    xmlns:st="http://www.senat.fr/taglib/sentest"
    xmlns:o="http://omnifaces.org/ui"
    xmlns:of="http://omnifaces.org/functions">
    <h:head/>
    <h:body>
        <ui:composition>
    [...]
        </ui:composition>
    </h:body>
</html>

它工作正常,除了一个非常尴尬的点。

我将动态 el 值传递给那些自定义组件。

例子 :

<st:senMandats id="toto" context="#{selectionContext}"/>

selectionContext bean 在别处定义。

在 st:senMandats 中,我以嵌套的方式使用其他自定义组件。就像是 :

<st:listeMandats mandatContext="#{sensContext}" asen="#{selectionContext.selectedSen}"/>

listeMandat 组件使用 primefaces 数据表来显示上下文中的一些列表。所以,我有这样的代码:

<h:outputLabel value="listeMandats de #{asen.libelleLong}" styleClass="bigTitleMandats" rendered="#{not empty asen}" />
<p:dataTable id="tableMandatsSenatoriaux" value="#{mandatContext.asList}" /* lots of other parameters */>

当我在选择器中选择一个条目时,自定义组件会正确更新。我可以看到 h:outputLabel 的 valueDisplayed 已根据选择正确更新。

当 #{mandatContext.AsList} 被调用时,我正在从应用程序上下文中检索 #{asen} 并在返回请求的列表之前执行一些内部更新。问题来了:如果在渲染 #{asen.libelleLong} 时 #{asen} 似乎没问题,我无法从支持 bean 获取更新的值。

我正在使用以下功能:

@SuppressWarnings("unchecked")
public static <T> T findBean(String name) {
    if ((name == null) || name.isEmpty())
        return null;
    FacesContext fc = FacesContext.getCurrentInstance();
    logger.debug("Retrieving #{" + name + "}");
    return (T) fc.getApplication().evaluateExpressionGet(fc,
            "#{" + name + "}", Object.class);
}

在 AsList 方法中:

JSFUtils.findBean("#{asen}")

总是返回一个旧的,未更新的值。

我应该怎么做才能让我的 bean 可以访问更新的值?我尝试了 mykong 在http://www.mkyong.com/jsf2/access-a-managed-bean-from-event-listener-jsf/中提出的解决方案 4、5 和 6,但仍然没有得到正确的值。

我是否被迫编写从特定类派生的自定义组件类?如果是这样,我是否也被迫编写渲染器?我想避免这种情况,因为我很欣赏将布局放在 xhtml 文件中。

提前致谢。

我在用 :

  • PrimeFaces 3.4.1
  • CODI 1.0.5
  • OpenWebBeans 1.1.6
  • 我的脸 2.1.9
  • Tomcat 7.0.32(编辑:将“额外问题”设置为另一个问题)
4

0 回答 0