[英]JSF composite:actionSource in nested composite components
根據<composite:interface>
的JSF文檔 :
復合組件的嵌套
該實現必須支持復合組件的嵌套。 具體而言,復合組件的該部分必須有可能充當另一個復合組件的使用頁面。 當復合組件向使用頁面公開行為界面,例如,或其他行為界面時,在嵌套復合組件的情況下,必須能夠“促進”此類界面的公開。 復合組件作者必須確保name屬性的值在嵌套的所有級別上都完全匹配,以使此公開工作正常進行。 不需要實現即可支持嵌套復合組件中名稱的“重新映射”。
它繼續顯示嵌套<composite:actionSource>
的示例,但是,我一直在測試幾乎完全像這樣的示例,但是它不起作用。 這是我的代碼:
內部復合成分:
<!DOCTYPE html>
<html 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:composite="http://java.sun.com/jsf/composite">
<composite:interface>
<composite:attribute name="actionText"
type="java.lang.String" default="nestedastest action" />
<composite:actionSource name="someaction" />
</composite:interface>
<composite:implementation>
<h:commandLink id="someaction">#{cc.attrs.actionText}</h:commandLink>
</composite:implementation>
</html>
外復合組件:
<!DOCTYPE html>
<html 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:composite="http://java.sun.com/jsf/composite"
xmlns:test="http://java.sun.com/jsf/composite/components/test">
<composite:interface name="nestedActionTester"
displayName="A test composite component for nested actions">
<composite:attribute name="actionText"
type="java.lang.String" default="astest action" />
<composite:actionSource name="someaction" />
</composite:interface>
<composite:implementation>
<test:nestedastest actionText="#{cc.attrs.actionText}" />
</composite:implementation>
</html>
小面:
<!DOCTYPE html>
<html 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:test="http://java.sun.com/jsf/composite/components/test">
<h:head />
<h:body>
<ui:composition template="template.xhtml">
<ui:define name="content">
<h:form id="communityMembersForm">
<div>
<test:astest>
<f:actionListener for="someaction"
binding="#{testController.someActionActionListener}" />
</test:astest>
</div>
<div>
<test:nestedastest>
<f:actionListener for="someaction"
binding="#{testController.someActionActionListener}" />
</test:nestedastest>
</div>
</h:form>
</ui:define>
</ui:composition>
</h:body>
</html>
托管Bean:
package test.controller;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import javax.faces.event.ActionListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ManagedBean
@ViewScoped
public class TestController {
private static Logger logger =
LoggerFactory.getLogger( TestController.class );
public ActionListener getSomeActionActionListener() {
return new ActionListener() {
@Override
public void processAction( ActionEvent event )
throws AbortProcessingException {
logger.debug( "someaction occurred..." );
}
};
}
}
我正在使用Mojarra 2.1.13:
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.1.13</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.1.13</version>
<type>jar</type>
<scope>runtime</scope>
</dependency>
在tomcat 6.0.32上:
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>el-api</artifactId>
<version>6.0.32</version>
<type>jar</type>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>servlet-api</artifactId>
<version>6.0.32</version>
<type>jar</type>
<scope>provided</scope>
</dependency>
當我運行此應用程序時, nestedastest action
的鏈接(直接使用內部復合組件的鏈接)將導致操作偵聽器運行並記錄日志消息。 但是,單擊astest action
(外部復合組件)時,什么也不會發生。 鑒於這幾乎與官方JSF javadoc中顯示的示例完全一樣,因此我希望它可以正常工作。 知道為什么不是嗎?
----------編輯---------
我發現如果我這樣修改外部復合組件:
<!DOCTYPE html>
<html 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:composite="http://java.sun.com/jsf/composite"
xmlns:test="http://java.sun.com/jsf/composite/components/test">
<composite:interface name="nestedActionTester"
displayName="A test composite component for nested actions">
<composite:attribute name="actionText"
type="java.lang.String" default="astest action" />
<composite:actionSource name="someaction" targets="inner" />
</composite:interface>
<composite:implementation>
<test:nestedastest id="inner" actionText="#{cc.attrs.actionText}" />
</composite:implementation>
</html>
請注意,我將target屬性添加到actionSource,並將匹配的ID添加到嵌套的復合組件
現在它將適當地鏈接操作。 這確實是有道理的,但是文檔使您相信這是不必要的。 這是文檔中的錯誤嗎? 還是在實現中(我在Mojarra 2.1.13和MyFaces 2.1.10上都嘗試過)? 還是我的理解?
該算法默認嘗試在每個嵌套級別中找到與cc:actionSource名稱定義的組件具有相同ID的組件。 在這種情況下,組件ID僅在內部級別定義。 如果不想一直對每個組件使用相同的ID,則可以使用“ targets”屬性指示正在討論哪個組件的算法,並在所有級別傳遞actionListener。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.