h:selectOneMenu阻止调用bean动作方法

时间:2015-09-12 17:42:38

标签: jsf selectonemenu

我正在编写一个简单的JSF应用程序,需要在数据库中实现CRUD操作。基本上,它是一个空缺管理应用程序,允许候选人申请工作。为简化问题,假设我有以下数据库:

    Users
------------
     Id
    Name
   Address
   CityId



   Cities
-------------
    Id
   City

我正在使用持久性并实现了两个bean:CityBean和UsersBean。 CityBean看起来如下:

@ManagedBean
@SessionScoped
public class CityBean implements Serializable
{
   private static final long serialVersionUID = 1L;
   private List<City> cityList = new ArrayList<City>();
   public CityBean()
   {
        cityList.addAll(database.getInstance().getCities());
   }
  ///removed for simplicity
}

我的UsersBean看起来如下:

    @ManagedBean
    @SessionScoped
    public class UsersBean implements Serializable
    {
         private static final long serialVersionUID = 1L;
         public User user = new User();
         public String addUser(){
            database.getInstance().addUser(user);
            return "";
         }
    }

最后,我的xhtml页面具有以下结构:

 <h:form>
   <h:outputText value="${texts.name}" />
                <h:inputText id="inputName" value="#{usersBean.user.name}" styleClass="tb5" autocomplete="off">                          
                </h:inputText>

                <h:inputText id="inputSurname" value="#{usersBean.user.surname}" styleClass="tb5" autocomplete="off">           
                </h:inputText>

                <h:selectOneMenu value="#{cityBean.cityList}">
                    <f:selectItems value="#{cityBean.cityList}" var="c" itemValue="#{c.id}" itemLabel="#{c.name}"></f:selectItems>
                </h:selectOneMenu>
                <h:commandButton value="${texts.save}" styleClass="button" action="#{usersBean.addUser}">
            </h:commandButton>

   </h:form>

xhtml页面正确生成。下拉列表中填充了来自城市表的项目,每个城市的值是城市的ID。但是,插入失败没有错误(数据库中没有插入任何内容)。

另一方面,如果我对元素进行注释(从视图中删除下拉列表),则会在数据库中插入一个用户,其中CityId的值为NULL。

我是JSF的新手程序员,这是我的第一个项目。我在.Net和PHP方面有很多经验,如果你能指出我采用这种方法做错了什么,我将不胜感激。

编辑(用户实体):

@Entity
public class Wine implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue
    private long id;
    private String name;
    private String surname;
    private String address;
    private int cityId;

    //Constructor left out (an empty and another with parameters)
    //Get/Set methods left out 

}

2 个答案:

答案 0 :(得分:1)

在您的CityBean字段中创建以存储所选城市/ city.id并输入<h:selectOneMenu value="#{cityBean.cityList}">而不是列表。列表只能在selectItems

答案 1 :(得分:1)

您必须替换此行:

<h:selectOneMenu value="#{cityBean.cityList}">

这一个:

<h:selectOneMenu value="#{usersBean.user.cityId}">

但您没有在应用程序中遵循Java EE最佳实践。例如,您应该在User实体中为User-City关系提供OneToOne批注。您应该遵循JSF / JPA的基础教程,以便更好地理解基础知识。如果你使用Maven,你可以从JSF&amp; JPA原型开始。