Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未为编程创建的UI元素执行JSF 2.0支持bean方法_Java_Jsf 2 - Fatal编程技术网

Java 未为编程创建的UI元素执行JSF 2.0支持bean方法

Java 未为编程创建的UI元素执行JSF 2.0支持bean方法,java,jsf-2,Java,Jsf 2,我正在使用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">

我正在使用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>

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

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


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

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


不可能!我真不敢相信解决办法这么简单!你是怎么知道的?这有什么记录吗?失败是无声的,没有异常,日志中没有错误!非常感谢您的回答。我阅读了JSF自己的源代码。毕竟这只是一个完整的Java代码。不可能!我真不敢相信解决办法这么简单!你是怎么知道的?这有什么记录吗?失败是无声的,没有异常,日志中没有错误!非常感谢您的回答。我阅读了JSF自己的源代码。毕竟,这只是一个完整的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;
    }
}
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; }
}
editForm.setId("form");
// ...
value.setId("value");
// ...
save.setId("save");