2015-01-03 6 views
0

Я начинаю с JSF 2, PrimeFaces и EJB, и я делаю фоновое приложение. Я успешно перечислил запись базы данных на datatable, и я сделал кнопку команды в передней части каждая запись в datatable, поэтому я могу удалить строку, когда я нажимаю на эту кнопку, но я сделал весь код, но когда я нажимаю кнопку, ничего не произошло. Вот код. и благодарю вас.Удаление строки из p: datatable

Метод в EJB:

@Override 
public void DeleteCitizen(Citizen citizen) { 
    Citizen detachCit = entityManager.merge(citizen); 
    entityManager.remove(detachCit); 
    //entityManager.remove(entityManager.merge(citizen));   
} 

Подложка боб:

@ManagedBean 
@SessionScoped 
public class CitizenCtr { 

    private List<Citizen> citizens = new ArrayList<Citizen>(); 
    private DataModel<Citizen> datamodel = new ListDataModel<Citizen>(); 

    //the Model 
    Citizen cit = new Citizen(); 

    //injection of the proxy 
    @EJB 
    CitizenServicesLocal citizenServiceLocal; 

    public List<Citizen> getCitizenss() { 
     citizens = citizenServiceLocal.ListAllCitizen(); 
     return citizens; 
    } 

    public DataModel<Citizen> getDatamodel() { 
     datamodel.setWrappedData(citizenServiceLocal.ListAllCitizen()); 
     return datamodel; 
    } 

    public void setDatamodel(DataModel<Citizen> datamodel) { 
     this.datamodel = datamodel; 
    } 

    public Citizen getCit() { 
     return cit; 
    } 

    public void setCit(Citizen cit) { 
     this.cit = cit; 
    } 

    // Login operation 
    public String TryLogin() { 

     String goTo = null; 

     Citizen citizenFound = citizenServiceLocal.Login(cit.getEmail(), cit.getPassword()); 

     if (citizenFound != null) { 
      cit = citizenFound; 
      goTo = "/CitizenProfile/Profile?send-redirect=true"; 
      System.out.println("Welcome you are logged In "); 
     } else { 

      System.out.println("please enter valid data ! "); 
      goTo = "/welcome?send-redirect=true"; 
     } 

     return goTo; 
    } 

    //Subscribe operation 
    public String DoSubscribe() { 

     String Goto = null; 
     citizenServiceLocal.Subscribe(cit); 
     Goto = "/welcome?sendredirect=true"; 
     return Goto; 
    } 

    //Update profile operation 
    public String DoUpdateProfile() { 
     String Goto = null; 
     citizenServiceLocal.updateProfile(cit); 
     Goto = "/CitizenProfile/Profile?sendredirect=true"; 
     return Goto; 
    } 

    //Logout operation 
    public String DoLogout() { 
     String Goto = "/welcome?sendredirect=true"; 
     FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); 
     return Goto; 
    } 

    public Citizen GetAllCitizen() { 
     List<Citizen> list; 
     list = citizenServiceLocal.ListAllCitizen(); 

     return (Citizen) list; 
    } 

    // Ban Operation 
    public void BanCitizen() { 
     citizenServiceLocal.DeleteCitizen(cit); 
    } 
} 

И это файл XHTML:

<h2>Citizen Management</h2> 

<p:link action="#{citizenCtr.BanCitizen()}" value="erase" > 
    <p:ajax update="mytable"></p:ajax> 
</p:link> 

<p:dataTable id="mytable" 
      value="#{citizenCtr.datamodel}" 
      var="citizen"> 

    <f:facet name="header"> List of Citizens </f:facet> 
    <p:column> 
     <f:facet name="header"> 
      <h:outputText value="CIN"></h:outputText> 
     </f:facet> 
     <h:outputText value="#{citizen.CIN}"></h:outputText> 
    </p:column> 

    <p:column> 
     <f:facet name="header"> 
      <h:outputText value="Name"></h:outputText> 
     </f:facet> 
     <h:outputText value="#{citizen.firstName}"></h:outputText> 
    </p:column> 

    <p:column> 
     <f:facet name="header"> 
      <h:outputText value="LastName"></h:outputText> 
     </f:facet> 
     <h:outputText value="#{citizen.scondName}"></h:outputText> 
    </p:column> 

    <p:column> 
     <f:facet name="header"> 
      <h:outputText value="Addess"></h:outputText> 
     </f:facet> 
     <h:outputText value="#{citizen.email}"></h:outputText> 
    </p:column> 

    <p:column> 
     <f:facet name="header"> 
      <h:outputText value="Email"></h:outputText> 
     </f:facet> 
     <h:outputText value="#{citizen.password}"></h:outputText> 
    </p:column> 

    <p:column> 
     <f:facet name="header"> 
      <h:outputText value="Password"></h:outputText> 
     </f:facet> 
     <h:outputText value="#{citizen.adresse}"></h:outputText> 

    </p:column> 

    <p:column> 
     <p:commandButton action="#{citizenCtr.BanCitizen()}" 
          value="Ban" 
          ajax="true" 
          update="mytable" 
          process="@this"> 
     </p:commandButton> 
    </p:column> 
</p:dataTable> 
+0

Здесь '<р: CommandButton действия = "{citizenCtr.BanCitizen) (} #" значение = Аякс = "истина" обновление = "туЬаЫй" процесс "Пан"= "@ это" > ',' process = "@ this" является ближайшим (или, может быть, единственным) виновником. Либо просто удалите его, если хотите, чтобы форма была полностью обработана, либо указали требуемые компоненты с помощью 'process', которые необходимы для обработки в дополнение к' @ this', когда вы нажимаете кнопку ' '. Дело в том, что, поскольку для параметра 'ajax' установлено значение' true' (оно фактически является значением по умолчанию, поэтому вы можете безопасно удалить его для краткости) и 'process' to' @ this', появляется только командная кнопка. – Tiny

+0

в методе 'BanCitizen()' попытайтесь удалить выбранную строку сначала из вашего списка 'datamodel', а затем выполните другие действия. – Scorpion

+0

@Tiny, я попытался, как вы сказали, но он не работает: (( – Haytham

ответ

1

трудно следовать вашей логике, но вы вызываете DeleteCitizen(Citizen) с использованием значения this.cit, который неясен, где он был установлен.

Если вы используете EL 2.2 (Servlet 3.0), вы можете сделать это:

В JSF:

<p:commandButton action="#{citizenCtr.banCitizen(citizen)}" value="Ban" ajax="true" update="mytable" process="@this"> 

В контроллере

public void banCitizen(Citizen citizenToDelete) { 
    citizenServiceLocal.deleteCitizen(citizenToDelete); 
} 

Примечания к улучшению:

  1. Следуйте за именованием con вмешательствах. Имена методов начинаются с строчных букв.

  2. Getters можно вызывать несколько раз для каждого запроса. Необходимость несколько раз запрашивать БД для всех граждан по каждому запросу будет отнимать много времени. Например, сохраните список граждан как свойство контролера; геттер должен просто вернуть это значение. Когда выполняется действие, которое изменяет содержимое списка (v.g. banCitizen(Citizen)), тогда это действие должно заботиться об обновлении значений атрибута.

  3. Проверьте журналы, чтобы узнать, есть ли сообщения об ошибках.

+0

спасибо за ваши советы :))) i попробовал это, как вы сказали мне, но это не делает wok: ((( – Haytham

+0

затем проверяет журналы и регистрирует, что происходит (называется метод контроллера? есть ли какое-либо исключение)? – SJuan76

+0

Нет никаких исключений :( – Haytham

0

Зачем нужно действовать на commandButton? Попробуйте ActionListener ...

<p:commandButton actionListener="#{citizenCtr.banCitizen(citizen)}" value="Ban" ajax="true" update="mytable" process="@this"> 
Смежные вопросы