2015-09-12 1 views
0

Я пишу простое приложение JSF, которое должно реализовывать операции CRUD в базе данных. В принципе, это приложение для управления вакансиями, которое позволяет кандидатам подать заявку на работу. Чтобы упростить задачу, предположу, что у меня есть следующие базы данных:h: selectOneMenu не позволяет использовать метод действия bean-объекта

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



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

Я использую упорство и два зерна реализовано: 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 генерирует правильно. Выпадающий список заполнен элементами из таблицы «Города», а значение каждого города - это идентификатор города. Однако вставка не выполняется без ошибки (в базу данных ничего не вставлено).

С другой стороны, если я прокомментирую элемент (удаление выпадающего списка из представления), пользователь будет вставлен в базу данных со значением NULL для CityId.

Я начинающий программист в JSF, это мой первый проект. У меня большой опыт работы в .NET и PHP, и я был бы признателен, если бы вы могли указать мне, что я делаю неправильно с этим подходом, который я принимаю.

Edit (объект пользователя):

@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 

} 
+0

Не могли бы вы вставить в свой вопрос 'User' entity bean исходный код? Атрибут 'value' неверен в h: selectOneMenu, но мне нужен исходный код объекта для определения ответа. – lametaweb

+0

Я добавил объект пользователя. – user496607

+0

Что вы используете для сохранения своих сущностей, JPA/Hibernate? – lametaweb

ответ

1

Создать в вашем CityBean поле для хранения выбранного города/city.id и поставить в <h:selectOneMenu value="#{cityBean.cityList}"> вместо списка. Список должен быть только в selectItems.

+0

Как это реализовать? Должен ли я добавлять частные переменные для имени города, а другой для идентификатора города, сопровождаемого методами get/set? Не могли бы вы показать мне пример кода? – user496607

+0

Только личная переменная для id города, так как у вас есть 'itemValue =" # {c.id} ", поэтому, когда пользователь выбирает город из списка, после отправки вы будете иметь идентификатор города из выбранного города. Это просто эта переменная с getter/setter и ее использование в ''. Здесь вы можете увидеть некоторый пример, хотя это PrimeFaces, идея такая же - список в '' и выбранная переменная в '' (на сайте есть 'p:' вместо ' h: 'из-за рамки). http://www.primefaces.org/showcase/ui/input/oneMenu.xhtml – Geinmachi

1

Вы должны заменить эту строку:

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

с этим:

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

Но вы не следуете Java EE лучшие практики в вашем приложении. Например, вы должны иметь аннотацию OneToOne для отношения User-City в объекте User. Вы должны следовать хорошему базовому руководству JSF/JPA, чтобы получить хорошее представление об основах. Если вы используете Maven, вы можете начать с архетипа JPA JSF &.