【发布时间】:2015-07-03 11:13:16
【问题描述】:
我正在处理 PrimeFaces 中的 JSF 绑定参数。
这是我的表格:
<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:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head>
<h1 class="title ui-widget-header ui-corner-all">
<p:spacer width="100" height="10" />
PrimeFaces Test Binding
</h1>
<title><ui:insert name="title">PrimeFaces Test</ui:insert></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</h:head>
<h:body>
<h:form id="form1">
<h:panelGroup binding="#{bindingTestClass.panelGroup}" />
</h:form>
</h:body>
</html>
这就是身体:
@ManagedBean(name="bindingTestClass")
@ViewScoped
public class BindingTestClass implements Serializable{
transient HtmlOutputLabel testValue = null;
transient HtmlSelectOneMenu menu = null;
transient HtmlPanelGroup panelGroup = null;
@PostConstruct
private void makeUp(){
menu = new HtmlSelectOneMenu();
panelGroup = new HtmlPanelGroup();
testValue = new HtmlOutputLabel();
panelGroup.setId("B");
panelGroup.setLayout("block");
panelGroup.setStyleClass("grid-form");
//LINE 0
testValue.setId("A");
testValue.setValue("BasicLabel");
panelGroup.getChildren().add(testValue);
HtmlOutputText linebreak = new HtmlOutputText();
linebreak.setValue("<br/>");
linebreak.setEscape(false);
panelGroup.getChildren().add(linebreak);
menu.setId("F");
// populate the drop down list
UISelectItems items = new UISelectItems();
List comboList = new ArrayList();
comboList.add(new SelectItem("---"));
for(int a = 0; a <10; a++){
comboList.add(new SelectItem( a+1 + " test"));
}
items.setId("ss");
items.setValue(comboList);
menu.getChildren().add(items);
//Add list to combobox
/*this first attempt doesn't work either, only change backend values
menu.addValueChangeListener(new ValueListenerTest());
menu.setOnchange("submit()");
*/
AjaxBehavior ajaxBehavior = (AjaxBehavior) FacesContext.getCurrentInstance().getApplication().createBehavior(AjaxBehavior.BEHAVIOR_ID);
ajaxBehavior.addAjaxBehaviorListener(new CustomAjaxListener());
//ajaxBehavior.setTransient(true);
ajaxBehavior.setUpdate("form1");
menu.addClientBehavior("change",ajaxBehavior);
panelGroup.getChildren().add(menu);
}
//Getters,Setters
public HtmlPanelGroup getPanelGroup() {
return panelGroup;
}
public HtmlOutputLabel getTestValue() {
return testValue;
}
public void setTestValue(HtmlOutputLabel testValue) {
this.testValue = testValue;
}
public void setPanelGroup(HtmlPanelGroup panelGroup) {
this.panelGroup = panelGroup;
}
public HtmlSelectOneMenu getMenu() {
return menu;
}
public void setMenu(HtmlSelectOneMenu menu) {
this.menu = menu;
}
}
事实是,当且仅当我以这种方式将单独的绑定代码放在我的视图中:
<h:outputLabel binding="#{bindingTestClass.testValue}" />
显然,从面板组中取出相应的子项,当我更改 selectOneMenu 值时,侦听器会更改支持 bean 中的值,然后它会更新确实更新“testValue”标签值的表单。
我尝试了不同的尝试,但仍然不明白为什么它不能以这种方式工作,将所有内容放在一个面板组中。
谁能指出我正确的方向?
提前非常感谢!
编辑:上面的代码适用于@RequestScoped 范围,并且显然将所有属性变量置于“私有”修饰符模式。但是@ViewScoped 没有机会?
【问题讨论】:
-
我不经常看到人们以编程方式在 backing-bean 中构建 JSF 组件。我并不是说一定不能这样做,但是如果您以非常规的方式实施事情,您将获得更少的答案。查看您的代码,我无法立即在 Facelets 页面 (ref) 上看到任何无法更轻松实现的内容。
-
我不明白,如果我用 facelet 标签包装它也不起作用,它也不会在主标题之后显示任何内容。我需要以这种方式实现,我得到动态组件列表,在页面加载之前可以决定屏幕上必须显示什么。谢谢 4 合作社。
-
在 SO 中搜索绑定和视图范围。绑定应该使用 requestscoped beans
-
是的,在 requestScoped 中,它可以工作。但是如果想要一个 ViewScoped 怎么办?是的,在发布这篇文章之前我已经搜索了很多,我在这里只是因为我不能独自前进。编辑了更新信息和试用版。感谢您的宝贵合作。
-
奇怪的代码,我从来没有见过有人做这样的事情,你为什么要从 MB 构建你的 html 东西。您想从代码中获得什么作为输出,您的大部分代码都可以在 jsf/xhtml 页面上完成,并且只在 MB 处执行 getter/setter/logic/etc。坦率地说,您让事情变得更加复杂,JSF 旨在通过 primeface/omniface/etc 等插件让生活变得更加轻松。
标签: jsf jsf-2 primefaces binding