JSF 2-如何向复合组件接口添加Ajax侦听器方法?

JSF 2-如何向复合组件接口添加Ajax侦听器方法?,第1张

JSF 2-如何向复合组件接口添加Ajax侦听器方法?

如果您 可以 摆脱

AjaxBehaviorEvent
争论,

public void genericAjaxEventLogger() {    // ...}

那么你可以使用

<cc:attribute name="ajaxEventListener" method-signature="void listener()" />

如果参数是强制性的(用于日志记录?),则需要重新指定属性,如下所示

<cc:attribute name="ajaxEventListener" method-signature="void listener(javax.faces.event.AjaxBehaviorEvent)" />

但是,这在这里无法正常工作

<f:ajax listener="#{cc.attrs.ajaxEventListener}" />

在GF 3.1 + Mojarra 2.1.1上:

SEVERE: javax.faces.FacesException: wrong number of arguments    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:89)    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409)    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1534)    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:326)    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:227)    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:170)    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822)    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719)    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013)    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)    at com.sun.grizzly.ContextTask.run(ContextTask.java:71)    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)    at java.lang.Thread.run(Unknown Source)Caused by: java.lang.IllegalArgumentException: wrong number of arguments    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)    at java.lang.reflect.Method.invoke(Unknown Source)    at com.sun.el.parser.AstValue.invoke(AstValue.java:234)    at com.sun.el.MethodexpressionImpl.invoke(MethodexpressionImpl.java:297)    at com.sun.faces.facelets.el.ContextualCompositeMethodexpression.invoke(ContextualCompositeMethodexpression.java:177)    at com.sun.faces.facelets.tag.TagAttributeImpl$AttributeLookupMethodexpression.invoke(TagAttributeImpl.java:450)    at com.sun.faces.facelets.tag.jsf.core.AjaxBehaviorListenerImpl.processAjaxBehavior(AjaxHandler.java:447)    at javax.faces.event.AjaxBehaviorEvent.processListener(AjaxBehaviorEvent.java:113)    at javax.faces.component.behavior.Behaviorbase.broadcast(Behaviorbase.java:102)    at javax.faces.component.UIComponentbase.broadcast(UIComponentbase.java:760)    at javax.faces.component.UICommand.broadcast(UICommand.java:300)    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)    ... 28 more

我不确定这是否是错误。为此,我需要花费更多时间来确定它。但是,通过创建一个支持组件可以解决该问题

Methodexpression
,该组件从属性获取并使用正确数量的参数进行调用。这是一个完整的启动示例:

<ui:component     xmlns:f="http://java.sun.com/jsf/core"    xmlns:h="http://java.sun.com/jsf/html"    xmlns:cc="http://java.sun.com/jsf/composite"    xmlns:ui="http://java.sun.com/jsf/facelets">    <cc:interface componentType="testCC">        <cc:attribute name="ajaxEventListener" method-signature="void listener(javax.faces.event.AjaxBehaviorEvent)" />    </cc:interface>    <cc:implementation>        <h:commandButton value="Submit"> <f:ajax listener="#{cc.ajaxEventListener}" />        </h:commandButton>    </cc:implementation></ui:component>

package com.example;import javax.el.Methodexpression;import javax.faces.component.FacesComponent;import javax.faces.component.UINamingContainer;import javax.faces.context.FacesContext;import javax.faces.event.AjaxBehaviorEvent;@FacesComponent(value="testCC")public class TestCC extends UINamingContainer {    public void ajaxEventListener(AjaxBehaviorEvent event) {        FacesContext context = FacesContext.getCurrentInstance();        Methodexpression ajaxEventListener = (Methodexpression) getAttributes().get("ajaxEventListener");        ajaxEventListener.invoke(context.getELContext(), new Object[] { event });    }}

无论如何,我相信支持组件为实现您已经想到的功能要求的新方法打开了大门;)



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5016369.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存