在JSF中有很多材料区分value属性和binding属性.
我对这两种方法如何彼此不同感兴趣.鉴于:
public class User {
private String name;
private UICommand link;
// Getters and setters omitted.
}
Run Code Online (Sandbox Code Playgroud)
<h:form>
<h:commandLink binding="#{user.link}" value="#{user.name}" />
</h:form>
Run Code Online (Sandbox Code Playgroud)
value指定属性时会发生什么变化.getter运行以返回bean 的name属性值User.该值将打印到HTML输出.
但我无法理解它是如何binding运作的.生成的HTML如何维护与bean link属性的绑定User?
下面是手动美化和注释后生成的输出的相关部分(注意id j_id_jsp_1847466274_1是自动生成的,并且有两个隐藏的输入小部件).我正在使用Sun的JSF RI 1.2版.
<form action="/TestJSF/main.jsf" enctype="application/x-www-form-urlencoded"
id="j_id_jsp_1847466274_1" method="post" name="j_id_jsp_1847466274_1">
<input name="j_id_jsp_1847466274_1" type="hidden" value="j_id_jsp_1847466274_1">
<a href="#" onclick="...">Name</a>
<input autocomplete="off" id="javax.faces.ViewState" name="javax.faces.ViewState"
type="hidden" value="-908991273579182886:-7278326187282654551">
</form>
Run Code Online (Sandbox Code Playgroud)
在哪里binding存放在这里?
我binding在以下问题中阅读了有关属性的组件绑定:
据我所知,它将视图中JSF标记后面的UI组件绑定到UIComponent辅助bean中的属性.但是,我很困惑组件绑定的用途以及何时应该使用它.有人可以用更简单的方式解释它并给出一些实际的例子吗?
这是JSF代码:
<h:inputText binding="#{bean.input}" />
Run Code Online (Sandbox Code Playgroud)
这里是支持bean的一部分用于绑定支持:
private HtmlInputText input;
public void setInput(HtmlInputText input) {
this.input = input;
}
public HtmlInputText getInput() {
return this.input;
}
Run Code Online (Sandbox Code Playgroud)
当我第一次打开页面时一切正常但是当我第二次打开它时(刷新或在另一个选项卡中打开相同的URL或任何其他方式)我得到重复的ID错误.错误消息表明<h:inputText>没有唯一ID.以下是长错误消息的一部分:
java.lang.IllegalArgumentException: Component ID formId:inputId has already been found in the view
+id: inputId type: javax.faces.component.html.HtmlInputText@cafebabe
Run Code Online (Sandbox Code Playgroud)
添加binding属性后出现问题.如果我删除它,一切都会再次正常工作.我如何正确使用binding属性?
想象一个JSF页关于若干组件,如<h:selectOneMenu>,<h:dataTable>,<h:panelGrid>等.每个部件都有一个ID.是否有任何方法或技术可以在调用bean的构造函数时以编程方式获取组件?
我已经在WildFly论坛上问了这个问题,但到目前为止还没有得到任何答案.所以我在这里尝试.
自从我从WildFly 8.1升级到8.2后,我在连接到bean的tabView中遇到了一个commandButton问题.
这是一个简单的JSF页面:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head></h:head>
<h:body>
<h:form>
<p:tabView binding="#{testBean.tabView}">
<p:tab title="Tab">
<p:commandButton value="Inside" action="#{testBean.testInside}"/>
</p:tab>
</p:tabView>
<p:commandButton value="Outside" action="#{testBean.testOutside}"/>
</h:form>
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
和豆:
@Named
@SessionScoped
public class TestBean implements Serializable {
private TabView tabView = new TabView();
public TabView getTabView() {
return tabView;
}
public void setTabView(TabView tabView) {
this.tabView = tabView;
}
public void testInside() {
System.out.println("inside");
}
public void testOutside() {
System.out.println("outside");
}
}
Run Code Online (Sandbox Code Playgroud)
单击"内部"按钮会触发testInside() 两次."外部"按钮(tabView外部)表现正常,只触发一次方法.删除tabView绑定可以消除此问题.我正在使用PrimeFaces 4.0. …