JSF 2 - 복합 구성 요소 인터페이스에 Ajax 수신기 메서드를 추가하려면 어떻게 해야 합니까?
JSF 2 복합 구성 요소를 사용하여 일부 Ajax 동작을 사용합니다.추가하고 싶습니다.listener
에 대한 방법.<f:ajax>
내 복합 구성 요소 안에 태그가 있지만,listener
방법은 다음과 같이 제공되어야 합니다.<composite:attribute>
에서<composite:interface>
.
그<f:ajax>
복합 구성 요소 내부의 태그는 현재 다음과 같이 청취자에게 하드 코딩되어 있습니다.
<f:ajax
event="valueChange"
execute="@this"
listener="#{controller.genericAjaxEventLogger}"
render="#{cc.attrs.ajaxRenderTargets}" />
빈의 수신기 메서드에는 다음과 같은 서명이 있습니다.
public void genericAjaxEventLogger(AjaxBehaviorEvent event)
throws AbortProcessingException {
// implementation code...
}
페이지가 자체 이벤트 메서드를 제공할 수 있도록 복합 구성 요소가 이와 같았으면 합니다. 하지만 인터페이스에 대한 올바른 구문을 찾을 수 없습니다.
<f:ajax
event="valueChange"
execute="@this"
listener="#{cc.attrs.ajaxEventListener}"
render="#{cc.attrs.ajaxRenderTargets}" />
어떻게 해야 하나요?
솔루션 업데이트:
저는 Balus C가 제안한 접근 방식을 취했고 그것은 잘 작동합니다.관련 코드 조각은 다음과 같습니다.
복합 구성 요소의 인터페이스 선언
<composite:interface>
<composite:attribute
name="myattributeUpdatedEventListener"
method-signature="void listener()"
required="true" />
...
</composite:interface>
내 복합 구성 요소에 사용된 Ajax 태그
<f:ajax
event="valueChange"
execute="@this"
listener="#{cc.attrs.myattributeUpdatedEventListener}"
render="#{cc.attrs.ajaxRenderTargets}" />
내 페이지에서 복합 구성요소를 사용하는 위치
<h:form>
<compcomp:myCompositeComponent
myattributeUpdatedEventListener="#{myBackingBean.updatedEventListenerXYZ}" />
</h:form>
그리고 내 배킹빈에 있는 방법은
public void updatedEventListenerXYZ() {
// do something here...
}
만약 당신이 그것을 제거할 수 있다면.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 + Mojara 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 });
}
}
그럼에도 불구하고, 저는 지원 구성요소가 어쨌든 여러분이 염두에 둔 기능적 요구사항을 달성할 수 있는 새로운 방법의 문을 열어준다고 믿습니다;)
다음은 구현 내에서 인터페이스를 사용하여 속성을 설정하고 참조하는 방법에 대한 예입니다.호출할 메서드의 메서드 서명을 정의해야 합니다.이렇게 하면 #{cc.attrs.ajaxEventListener} 식에 값 식이 아닌 메서드 값이 포함되어 있음을 복합 구성 요소 처리기에 알립니다.
<cc:interface name="composite-comp"
<cc:attribute required="true" name="ajaxEventListener"
method-signature="void f1(javax.faces.event.AjaxBehaviorEvent)" />
<cc:attribute required="true" name="ajaxRenderTargets" />
</cc:interface>
<cc:implementation>
.
.
.
<f:ajax event="valueChange" execute="@this"
listener="#{cc.attrs.ajaxEventListener}"
render="#{cc.attrs.ajaxRenderTargets}" />
</cc:implementation>
언급URL : https://stackoverflow.com/questions/6453842/jsf-2-how-can-i-add-an-ajax-listener-method-to-composite-component-interface
'programing' 카테고리의 다른 글
jQuery.active 함수 (0) | 2023.09.03 |
---|---|
Spring Boot용 외부 라이브러리 폴더 (0) | 2023.09.03 |
REGEXP_REplace with MySQL 또는 MariaDB가 와일드카드 일치를 사용하여 빈 문자열을 바꾸지 않음 (0) | 2023.09.03 |
Swift에서 어레이의 모든 멤버를 동일한 값으로 초기화하는 방법은 무엇입니까? (0) | 2023.09.03 |
로그아웃 시 활동 기록 스택을 삭제하여 "뒤로" 단추가 로그인한 활동만 열 수 없도록 합니다. (0) | 2023.09.03 |