标签: composite-component

JSF中readOnly/edition模式的最佳实践?

任何人都可以建议一种方法来执行编辑/只读模式?我正在使用PF,我这样做了:

<composite:interface>
        <composite:attribute name="size"/>
        <composite:attribute name="value"/>
        <composite:attribute name="editable"/>
    </composite:interface>

    <composite:implementation>

        <p:inputText value="#{cc.attrs.value}"  size="#{cc.attrs.size}" rendered="#{cc.attrs.editable}"/>

        <h:outputText value="#{cc.attrs.value}" rendered="#{!cc.attrs.editable}"/>

    </composite:implementation>
Run Code Online (Sandbox Code Playgroud)

只是根据布尔值显示inputText或outPutText.但显然PF的inputText中存在一个错误,因为我收到了一个targetClass null异常.如果我在组件外使用inputText它可以工作,但我想用comp来封装这种行为.还有其他建议吗?

jsf primefaces composite-component

1
推荐指数
1
解决办法
8056
查看次数

验证器方法在JSF自定义组合组件中不起作用

JSF自定义复合组件input.xhtml

<cc:interface>
    <cc:attribute name="validator"/>
</cc:interface>

<cc:implementation>
    <h:inputText validator="#{cc.attrs.validator}"/>
</cc:implementation>
Run Code Online (Sandbox Code Playgroud)

*.xhtml

<l:input value = ... validator="#{testValidator.validator}"/>
Run Code Online (Sandbox Code Playgroud)

java代码

@ManagedBean

公共类TestValidator {

    public void validator(FacesContext context, UIComponent component, Object value) throws ValidatorException {
         System.out.println("Call validator");
    }
}
Run Code Online (Sandbox Code Playgroud)

PropertyNotFoundException:

validator="#{testValidator.validator}": The class 'TestValidator' does not have the property 'validator'.
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题呢?我最后的方式:

validation methods jsf composite-component

1
推荐指数
1
解决办法
3956
查看次数

当呈现的属性被包装时,不会在复合组件上调用encodeAll()

当我做:

<h:form>
    <ui:repeat ...>
        <ui:fragment rendered="#{xyz.type eq 1}"
           <h:inputText value="#{xyz}"/>
        </ui:frament>

        <ui:fragment rendered="#{xyz.type eq 2}"
           <my:component value="#{xyz}"/>
        </ui:frament>
    <ui:repeat />
</h:form>
Run Code Online (Sandbox Code Playgroud)

encodeAll()不会被调用my:component,并且随后不会显示现有值。

如果我执行以下操作

    <ui:repeat ...>
        <ui:fragment rendered="#{xyz.type eq 1}"
           <h:inputText value="#{xyz}"/>
        </ui:frament>

        <ui:fragment rendered="#{xyz.type eq 2}"
           <h:form>
               <my:component value="#{xyz}"/>
           </h:form>
        </ui:frament>
    <ui:repeat />
Run Code Online (Sandbox Code Playgroud)

后一个例子当然是无用的,因为我想要动态输入。现有(默认)组件如 datepicker、inputtext、...功能正常,只有我的组件不显示现有值(encodeAll 未调用)。

我还尝试了 h:datatable 组件而不是 ui:repeat (但不确定为什么),结果相同。

INFO: Initializing Mojarra 2.1.6 (SNAPSHOT 20111206) for context '/webclient'
INFO: Running on PrimeFaces 3.5
INFO: Running on PrimeFaces Extensions 0.6.3
Run Code Online (Sandbox Code Playgroud)

java jsf composite-component jsf-2

1
推荐指数
1
解决办法
377
查看次数

通过ajax重新渲染复合组件

我构建了一个复合组件,看起来像这样:

<composite:interface>
  <composite:attribute name="id" required="false" />
  <composite:attribute name="label" required="true" />
</composite:interface>

<composite:implementation>
  <h:panelGroup id="#{cc.attrs.id}">
    <fieldset class="fieldset"><legend>${cc.attrs.label}</legend></fieldset>
  </h:panelGroup>  
</composite:implementation>
Run Code Online (Sandbox Code Playgroud)

竞争者正确显示当前标签.

<xyz:comp id="idMyComponent" label="#{someBean.text}"/>

...
<a4j:ajax ... render="idMyComponent" />
...
Run Code Online (Sandbox Code Playgroud)

现在当采取行动时,没有任何事情发生.但是,当我在组件中的ID中添加Postfix时,它可以正常工作(见下文).

...
<composite:implementation>
      <h:panelGroup id="#{cc.attrs.id}Label">
...
Run Code Online (Sandbox Code Playgroud)

并使用后缀定义渲染中的ID:

<xyz:comp id="idMyComponent" label="#{someBean.text}"/>

...
<a4j:ajax ... render="idMyComponentLabel" />
...
Run Code Online (Sandbox Code Playgroud)

有些人可以向我解释为什么只有当我在ID中添加后缀时它才有效h:panelGroup

ajax composite-component jsf-2

1
推荐指数
1
解决办法
2768
查看次数

复合组件中主体定义的标记

我正在创建一个复合组件以在我的应用程序中使用它。我需要为每个复合组件定义它自己的主体。几年前我使用JSP时,我在一些标签文件中指定了自定义主体,例如titlebar.tag,未来主体是由下面的标签声明的:

    <jsp:doBody />
Run Code Online (Sandbox Code Playgroud)

我在 JSP 文件中使用了它:

<foo:titlebar>
    <jsp:body>
        something
    </jsp:body>
</foo:titlebar>
Run Code Online (Sandbox Code Playgroud)

现在我需要在 cc:implementation 之间的 JSF 复合组件中有类似的东西

<cc:implementation> 
    SOME TAG FOR FUTURE BODY DECLARATION
</cc:implementation>
Run Code Online (Sandbox Code Playgroud)

你能给我一个建议吗?

jsf composite-component jsf-2

1
推荐指数
1
解决办法
623
查看次数

将方法表达式属性传递给嵌套复合组件

我有复合组件DocumentSelector,它包含另一个复合组件modalWindow.

<cc:interface componentType="selector.DocumentSelector">
     <cc:attribute name="showSelector"
              method-signature="void listener(java.util.List)"/>
</cc:interface>

<cc:implementation>

    <div id="#{cc.clientId}">
        <ccs:modalWindow id="modal_window" showListener="#{cc.showSelector}"
                     mode="ajax">

        </ccs:modalWindow>
    </div>
</cc:implementation>
Run Code Online (Sandbox Code Playgroud)

我需要将方法从faces组件传递#{cc.showSelector}给复合modalWindow组件DocumentSelector.但我有PropertyNotFoundException 因为与组件ElResolver相关而不是#{cc}modalWindowDocumentSelector

modalWindow组件:

<cc:interface componentType="statistics.ModalWindow">
    <cc:attribute name="showListener" method-signature="void show()"/>
    <cc:attribute name="hideListener" method-signature="void hide()"/>
</cc:interface>
<cc:implementation>
</cc:implementation> 
Run Code Online (Sandbox Code Playgroud)

我使用Java EE 7,JSF 2.2,WildFly 8.2.0

jsf el composite-component jsf-2

1
推荐指数
1
解决办法
1081
查看次数

在Maven项目中实现JSF Composite Component

似乎人们能够在SWF 2.3.1中实现复合组件,但我无法找到明确的参考方法.我已经遵循JSF复合组件的基本结构,但我的SWF应用程序似乎没有识别taglib命名空间.

有一个工具包/ IDE警告,但更重要的是在浏览器中看到运行时警告,JSF在屏幕上向用户显示以下警告:

Warning: This page calls for XML namespace http://java.sun.com/jsf/composite/myjsf declared with prefix mj but no taglibrary exists for that namespace.
Run Code Online (Sandbox Code Playgroud)

组件定义:

src/main/resources/myjsf/testComponent.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:composite="http://java.sun.com/jsf/composite">

<composite:interface>
    <composite:attribute name="attr" />
</composite:interface>
<composite:implementation>

#{cc.attrs.attr});          

</composite:implementation>
</html>
Run Code Online (Sandbox Code Playgroud)

在给定的xhtml中引用:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:mj="http://java.sun.com/jsf/composite/myjsf">

  <!-- snip -->

  <mj:testComponent attr="x" />

</ui:composition>
Run Code Online (Sandbox Code Playgroud)

jsf maven composite-component

0
推荐指数
1
解决办法
950
查看次数

在JSF 2复合组件中使用id-attribute和目标

我正在尝试为按钮创建JSF 2.1复合组件:

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich"
xmlns:c="http://java.sun.com/jstl/core">

    <composite:interface>
        <composite:attribute name="id" required="true" type="java.lang.String" />
        <composite:attribute name="label" required="true" type="java.lang.String" />
        <composite:attribute name="action" method-signature="java.lang.String action()" targets="#{cc.attrs.id}" />
    </composite:interface>

    <composite:implementation>
        <a4j:commandLink id="#{cc.attrs.id}">
            <span style="linkButton"><h:outputText value="#{cc.attrs.label}" /></span>
        </a4j:commandLink>
    </composite:implementation>
</html>
Run Code Online (Sandbox Code Playgroud)

我对此代码的问题是,在呈现页面时它会给出以下异常:

java.lang.ClassCastException: javax.faces.component.UINamingContainer cannot be cast to javax.faces.component.ActionSource2
at com.sun.faces.application.view.FaceletViewHandlingStrategy$MethodRetargetHandlerManager$ActionRegargetHandler.retarget(FaceletViewHandlingStrategy.java:1536)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.retargetMethodExpressions(FaceletViewHandlingStrategy.java:689)
at com.sun.faces.facelets.tag.jsf.CompositeComponentTagHandler.applyNextHandler(CompositeComponentTagHandler.java:201)
at org.richfaces.view.facelets.html.BehaviorsAddingComponentHandlerWrapper.applyNextHandler(BehaviorsAddingComponentHandlerWrapper.java:53)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:196)
...
Run Code Online (Sandbox Code Playgroud)

当我用一个定义的String 替换#{cc.attrs.id}in idtargets属性时,myId组件按预期工作,但这使得它不能在同一页面中重复使用,从而消除了创建复合组件的神奇感.

我在这里错过了吗?

jsf el ajax4jsf composite-component jsf-2

0
推荐指数
1
解决办法
9142
查看次数

标签 统计

composite-component ×8

jsf ×7

jsf-2 ×5

el ×2

ajax ×1

ajax4jsf ×1

java ×1

maven ×1

methods ×1

primefaces ×1

validation ×1