任何人都可以建议一种方法来执行编辑/只读模式?我正在使用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自定义复合组件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)
如何解决这个问题呢?我最后的方式:
当我做:
<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) 我构建了一个复合组件,看起来像这样:
<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?
我正在创建一个复合组件以在我的应用程序中使用它。我需要为每个复合组件定义它自己的主体。几年前我使用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)
你能给我一个建议吗?
我有复合组件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
似乎人们能够在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 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 id和targets属性时,myId组件按预期工作,但这使得它不能在同一页面中重复使用,从而消除了创建复合组件的神奇感.
我在这里错过了吗?
jsf ×7
jsf-2 ×5
el ×2
ajax ×1
ajax4jsf ×1
java ×1
maven ×1
methods ×1
primefaces ×1
validation ×1