2012-07-08 51 views
1

我正在使用JSF的java类为简单的HTML页面创建UI元素,如下所示。然而,方法Bean :: save()和Item.setValue(...)不会被执行。JSF 2.0 backing bean方法没有为程序创建的UI元素执行

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; 
    } 
} 

Item.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; } 
} 

回答

1

所有编程方式创建JSF UIFormUIInputUICommand部件需要具有固定的ID设置,否则JSF会自动生成一个h不会保存,然后JSF将无法从请求参数映射中提取基于这些ID的提交值。

所以,你的具体情况,您需要添加以下行(ID是完全免费为您选择):

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

没办法!我无法相信解决方案如此简单!你是怎么知道的 - 这是否记录在某处?失败是沉默的,没有例外在日志中没有错误!非常感谢您的回答。 – auser 2012-07-09 15:40:26

+0

我阅读JSF自己的源代码。毕竟只有一个和所有的Java代码。 – BalusC 2012-07-09 15:41:08

相关问题