Jsf 如何使用自定义facelets taglib将事件对象作为参数传递给动态侦听器?
我正在重构我的代码,以使用自定义facelets标记库来“干燥”我的代码 一切正常,但当我需要参数化ajax侦听器操作时,出现了一个异常:Jsf 如何使用自定义facelets taglib将事件对象作为参数传递给动态侦听器?,jsf,primefaces,facelets,taglib,Jsf,Primefaces,Facelets,Taglib,我正在重构我的代码,以使用自定义facelets标记库来“干燥”我的代码 一切正常,但当我需要参数化ajax侦听器操作时,出现了一个异常: Target Unreachable, identifier 'backingBean' resolved to null: javax.el.PropertyNotFoundException: Target Unreachable, identifier 'backingBean' resolved to null 这是我的密码: index.xht
Target Unreachable, identifier 'backingBean' resolved to null: javax.el.PropertyNotFoundException: Target Unreachable, identifier 'backingBean' resolved to null
这是我的密码:
index.xhtml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<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:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:test="http://ericsantanna.com/faceletsTest/jsf/facelets"
>
<h:head>
<h:outputStylesheet name="tema.css" library="css" />
</h:head>
<h:body>
<h:form id="testForm">
<test:faceletsTest
id="testPickList"
values="#{controller.pickListData}"
backingBean="${controller}"
transferHandle="handleTranferEvent"
/>
</h:form>
</h:body>
</html>
<ui:composition
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<p:pickList
id="#{id}"
value="#{values}"
var="s"
itemValue="#{s}"
itemLabel="#{s}">
<p:ajax event="transfer" listener="#{backingBean[transferHandle]}" />
</p:pickList>
</ui:composition>
package com.ericsantanna.faceletEventTest;
import java.util.Arrays;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import org.jboss.logging.Logger;
import org.primefaces.event.TransferEvent;
import org.primefaces.model.DualListModel;
/**
* @author Eric Sant'Anna
*
*/
@RequestScoped
@ManagedBean
public class Controller {
private DualListModel<String> pickListData = new DualListModel<String>();
@PostConstruct
public void init() {
pickListData.getSource().addAll(Arrays.asList("A", "B", "C"));
}
// Show message if uncommented:
// public void handleTranferEvent() {
// Logger.getLogger(getClass()).info("Sem argumentos...");
// }
public void handleTranferEvent(TransferEvent event) {
Logger.getLogger(getClass()).info("Você escolheu: " + formatItems(event.getItems()));
}
public String formatItems(List<?> list) {
String result = "";
for(Object s : list) result += s;
return result;
}
public DualListModel<String> getPickListData() {
return pickListData;
}
public void setPickListData(DualListModel<String> pickListData) {
this.pickListData = pickListData;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0">
<namespace>http://ericsantanna.com/faceletsTest/jsf/facelets</namespace>
<tag>
<tag-name>faceletsTest</tag-name>
<source>tags/test/faceletsTest.xhtml</source>
</tag>
</facelet-taglib>
faceletsTest.xhtml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<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:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:test="http://ericsantanna.com/faceletsTest/jsf/facelets"
>
<h:head>
<h:outputStylesheet name="tema.css" library="css" />
</h:head>
<h:body>
<h:form id="testForm">
<test:faceletsTest
id="testPickList"
values="#{controller.pickListData}"
backingBean="${controller}"
transferHandle="handleTranferEvent"
/>
</h:form>
</h:body>
</html>
<ui:composition
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<p:pickList
id="#{id}"
value="#{values}"
var="s"
itemValue="#{s}"
itemLabel="#{s}">
<p:ajax event="transfer" listener="#{backingBean[transferHandle]}" />
</p:pickList>
</ui:composition>
package com.ericsantanna.faceletEventTest;
import java.util.Arrays;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import org.jboss.logging.Logger;
import org.primefaces.event.TransferEvent;
import org.primefaces.model.DualListModel;
/**
* @author Eric Sant'Anna
*
*/
@RequestScoped
@ManagedBean
public class Controller {
private DualListModel<String> pickListData = new DualListModel<String>();
@PostConstruct
public void init() {
pickListData.getSource().addAll(Arrays.asList("A", "B", "C"));
}
// Show message if uncommented:
// public void handleTranferEvent() {
// Logger.getLogger(getClass()).info("Sem argumentos...");
// }
public void handleTranferEvent(TransferEvent event) {
Logger.getLogger(getClass()).info("Você escolheu: " + formatItems(event.getItems()));
}
public String formatItems(List<?> list) {
String result = "";
for(Object s : list) result += s;
return result;
}
public DualListModel<String> getPickListData() {
return pickListData;
}
public void setPickListData(DualListModel<String> pickListData) {
this.pickListData = pickListData;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0">
<namespace>http://ericsantanna.com/faceletsTest/jsf/facelets</namespace>
<tag>
<tag-name>faceletsTest</tag-name>
<source>tags/test/faceletsTest.xhtml</source>
</tag>
</facelet-taglib>
Controller.java:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<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:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:test="http://ericsantanna.com/faceletsTest/jsf/facelets"
>
<h:head>
<h:outputStylesheet name="tema.css" library="css" />
</h:head>
<h:body>
<h:form id="testForm">
<test:faceletsTest
id="testPickList"
values="#{controller.pickListData}"
backingBean="${controller}"
transferHandle="handleTranferEvent"
/>
</h:form>
</h:body>
</html>
<ui:composition
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<p:pickList
id="#{id}"
value="#{values}"
var="s"
itemValue="#{s}"
itemLabel="#{s}">
<p:ajax event="transfer" listener="#{backingBean[transferHandle]}" />
</p:pickList>
</ui:composition>
package com.ericsantanna.faceletEventTest;
import java.util.Arrays;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import org.jboss.logging.Logger;
import org.primefaces.event.TransferEvent;
import org.primefaces.model.DualListModel;
/**
* @author Eric Sant'Anna
*
*/
@RequestScoped
@ManagedBean
public class Controller {
private DualListModel<String> pickListData = new DualListModel<String>();
@PostConstruct
public void init() {
pickListData.getSource().addAll(Arrays.asList("A", "B", "C"));
}
// Show message if uncommented:
// public void handleTranferEvent() {
// Logger.getLogger(getClass()).info("Sem argumentos...");
// }
public void handleTranferEvent(TransferEvent event) {
Logger.getLogger(getClass()).info("Você escolheu: " + formatItems(event.getItems()));
}
public String formatItems(List<?> list) {
String result = "";
for(Object s : list) result += s;
return result;
}
public DualListModel<String> getPickListData() {
return pickListData;
}
public void setPickListData(DualListModel<String> pickListData) {
this.pickListData = pickListData;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0">
<namespace>http://ericsantanna.com/faceletsTest/jsf/facelets</namespace>
<tag>
<tag-name>faceletsTest</tag-name>
<source>tags/test/faceletsTest.xhtml</source>
</tag>
</facelet-taglib>
package com.ericsantana.faceleteventest;
导入java.util.array;
导入java.util.List;
导入javax.annotation.PostConstruct;
导入javax.faces.bean.ManagedBean;
导入javax.faces.bean.RequestScope;
导入org.jboss.logging.Logger;
导入org.primefaces.event.transfervent;
导入org.primefaces.model.DualListModel;
/**
*@作者埃里克·桑塔纳
*
*/
@请求范围
@ManagedBean
公共类控制器{
私有DualListModel pickListData=新的DualListModel();
@施工后
公共void init(){
pickListData.getSource().addAll(Arrays.asList(“A”、“B”、“C”));
}
//如果未注释,则显示消息:
//公共无效handleTranferEvent(){
//getLogger.getLogger(getClass()).info(“Sem arguments…”);
// }
公共无效handleTranferEvent(TransferEvent事件){
getLogger.getLogger(getClass()).info(“Vocêescolheu:+formatItems(event.getItems()));
}
公共字符串格式项(列表){
字符串结果=”;
对于(对象s:列表)结果+=s;
返回结果;
}
public DualListModel getPickListData(){
返回pickListData;
}
public void setPickListData(DualListModel pickListData){
this.pickListData=pickListData;
}
}
faceletsTest.taglib.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<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:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:test="http://ericsantanna.com/faceletsTest/jsf/facelets"
>
<h:head>
<h:outputStylesheet name="tema.css" library="css" />
</h:head>
<h:body>
<h:form id="testForm">
<test:faceletsTest
id="testPickList"
values="#{controller.pickListData}"
backingBean="${controller}"
transferHandle="handleTranferEvent"
/>
</h:form>
</h:body>
</html>
<ui:composition
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<p:pickList
id="#{id}"
value="#{values}"
var="s"
itemValue="#{s}"
itemLabel="#{s}">
<p:ajax event="transfer" listener="#{backingBean[transferHandle]}" />
</p:pickList>
</ui:composition>
package com.ericsantanna.faceletEventTest;
import java.util.Arrays;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import org.jboss.logging.Logger;
import org.primefaces.event.TransferEvent;
import org.primefaces.model.DualListModel;
/**
* @author Eric Sant'Anna
*
*/
@RequestScoped
@ManagedBean
public class Controller {
private DualListModel<String> pickListData = new DualListModel<String>();
@PostConstruct
public void init() {
pickListData.getSource().addAll(Arrays.asList("A", "B", "C"));
}
// Show message if uncommented:
// public void handleTranferEvent() {
// Logger.getLogger(getClass()).info("Sem argumentos...");
// }
public void handleTranferEvent(TransferEvent event) {
Logger.getLogger(getClass()).info("Você escolheu: " + formatItems(event.getItems()));
}
public String formatItems(List<?> list) {
String result = "";
for(Object s : list) result += s;
return result;
}
public DualListModel<String> getPickListData() {
return pickListData;
}
public void setPickListData(DualListModel<String> pickListData) {
this.pickListData = pickListData;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0">
<namespace>http://ericsantanna.com/faceletsTest/jsf/facelets</namespace>
<tag>
<tag-name>faceletsTest</tag-name>
<source>tags/test/faceletsTest.xhtml</source>
</tag>
</facelet-taglib>
http://ericsantanna.com/faceletsTest/jsf/facelets
Facelestest
tags/test/faceletsTest.xhtml
为什么p:ajax没有将transfervent添加到操作中?
如何解决这个问题?这个问题的原因与这里已经回答的相同@BalusC谢谢,这解决了我的问题。Omnifaces真的很方便!