gpt4 book ai didi

java - 未对以编程方式创建的 UI 元素执行 JSF 2.0 支持 bean 方法

转载 作者:太空宇宙 更新时间:2023-11-04 08:10:00 24 4
gpt4 key购买 nike

我正在使用 JSF 的 java 类为简单的 HTML 页面创建 UI 元素,如下所示。但是 Bean::save() 和 Item.setValue(...) 方法不会执行。

item.xhtml

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>Test</title>
</h:head>
<h:body>
<h:panelGroup binding="#{bean.htmlPanelGroup}" />
</h:body>
</html>

Bean.java

@ManagedBean(name="bean")
@ViewScoped
public class Bean implements Serializable {
private final Item item = new Item(1L, "hello");

public void save() {
// this method is not executed when the save button created below is clicked.
System.out.println("item.value = " + item.getValue());
}

public Item getItem() { return this.item; }

transient HtmlPanelGroup htmlPanelGroup;

public void setHtmlPanelGroup(HtmlPanelGroup htmlPanelGroup) {
this.htmlPanelGroup = htmlPanelGroup;
}
public HtmlPanelGroup getHtmlPanelGroup() {
if (htmlPanelGroup == null) {
FacesContext facesContext = FacesContext.getCurrentInstance();
htmlPanelGroup = new HtmlPanelGroup();
HtmlForm editForm = new HtmlForm();
HtmlInputText value = new HtmlInputText();
ValueExpression valueExpr = facesContext.getApplication().getExpressionFactory()
.createValueExpression(facesContext.getELContext(), "#{bean.item.value}", String.class);
value.setValueExpression("value", valueExpr);
editForm.getChildren().add(value);
HtmlCommandButton save = new HtmlCommandButton();
save.setValue("save");
MethodExpression methodExpr = facesContext.getApplication().getExpressionFactory()
.createMethodExpression(facesContext.getELContext(), "#{bean.save}", String.class, new Class<?>[]{});
save.setActionExpression(methodExpr);
editForm.getChildren().add(save);
htmlPanelGroup.getChildren().add(editForm);
}
return htmlPanelGroup;
}
}

项目.java

public class Item implements Serializable {
private long id;
private String value;

public Item(long id, String value) {
this.id = id;
this.value = value;
}

public String getValue() { return value; }

public void setValue(String value) { this.value = value; }

public long getId() { return id; }

public void setId(long id) { this.id = id; }
}

最佳答案

所有以编程方式创建的 JSF UIFormUIInputUICommand 组件都需要有一个固定的 ID 集,否则 JSF 将自动生成一个不会保存的 ID 集,然后 JSF 将无法根据这些 ID 从请求参数映射中提取提交的值。

因此,在您的特定情况下,您需要添加以下行(ID 完全由您选择):

editForm.setId("form");
// ...
value.setId("value");
// ...
save.setId("save");

关于java - 未对以编程方式创建的 UI 元素执行 JSF 2.0 支持 bean 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11387509/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com