java 向复合组件添加操作方法
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/7806831/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Adding action methods to a composite component
提问by sfrj
I am learning about composite components with JSF 2.0 and i want my component to be able to trigger methods from backing beans, so i created a simple example, but something is wrong.
我正在学习 JSF 2.0 的复合组件,并且我希望我的组件能够从支持 bean 中触发方法,所以我创建了一个简单的示例,但是出了点问题。
This is the component i created:
这是我创建的组件:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:composite="http://java.sun.com/jsf/composite">
<composite:interface>
<composite:attribute name="attribute1"/>
<composite:attribute name="attribute2"/>
<composite:attribute name="actionBtnText"/>
<composite:attribute name="actionMethod" method-signature="java.lang.String action()"/>
</composite:interface>
<composite:implementation>
<h:form>
<h:inputText value="#{cc.attrs.attribute1}"/>
<br/>
<h:inputText value="#{cc.attrs.attribute2}"/>
<br/>
<h:commandButton action="#{cc.attrs.actionMethod}" value="#{cc.attrs.actionBtnText}"/>
</h:form>
</composite:implementation>
</html>
This is how i use it in a JSF page
这就是我在 JSF 页面中使用它的方式
<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:custom="http://java.sun.com/jsf/composite/custom">
...
<h:body>
<custom:demoCustomComponent attribute1="#{demoBB.value1 }" attribute2="#{demoBB.value2 }" actionBtnText="Button text!" actionBtn="#{demoBB.act}"/>
</h:body>
And this is the backing bean that gives support to the page where the component is
这是支持组件所在页面的支持 bean
@Named("demoBB")
@RequestScoped
public class DemoBB {
private String value1;
private String value2;
public String getValue1() {
return value1;
}
public String act() {
System.out.println("Input 1: " + value1 + "\nInput 2: " + value2);
return null;
}
//Getters and setters
public void setValue1(String value1) {
this.value1 = value1;
}
public String getValue2() {
return value2;
}
public void setValue2(String value2) {
this.value2 = value2;
}
}
The component seems to render fine, but when i press the button i get an exception that says:
该组件似乎渲染得很好,但是当我按下按钮时,我收到一个异常消息:
javax.faces.FacesException: Unable to resolve composite component from using page using EL expression '#{cc.attrs.actionMethod}'
javax.faces.FacesException:无法通过使用 EL 表达式“#{cc.attrs.actionMethod}”的页面解析复合组件
Did i make any mistake in the interface or implementation of the component? Why doesn't work?
我是否在组件的接口或实现中犯了任何错误?为什么不起作用?
回答by BalusC
You definied the action method using attribute name actionBtn
:
您使用属性名称定义了操作方法actionBtn
:
<custom:demoCustomComponent ... actionBtn="#{demoBB.act}"/>
but you're expecting it to be the attribute name actionMethod
:
但您希望它是属性名称actionMethod
:
<composite:attribute name="actionMethod" method-signature="java.lang.String action()"/>
Align it. They should be the same.
对齐它。他们应该是一样的。