2012-04-02 6 views
4

Ich werde mir ziemlich Ziel machen:Wie gibt man Statusmeldungen in JSF zurück?

Ein Benutzer registriert sich, nach dieser Operation register ich Gratulation sagte einige Nachricht zeigen mag! Herzlich willkommen!, etwas wie das oder eine Nachricht, wenn es ein Problem wie duplicated key in meiner Datenbank gibt.

Ich weiß schon, wie man einige Nachrichten mit RichFaces zeigt, aber ich möchte es einfach halten, RichFaces vermasselt ein wenig mit CSS, also möchte ich es für jetzt vermeiden.

hier So geht es meine Seite und mein Managed Beans:

<h:form id="form_user"> 
     <h:panelGrid columns="3"> 
      <h:outputLabel for="name" value="Name:" /> 
      <h:inputText id="name" value="#{personc.personb.person.name}"> 
       <f:ajax event="blur" listener="#{personValidate.name}" render="m_name" /> 
      </h:inputText> 
      <h:message id="m_name" for="name" /> 

      <!--other fields...--> 

      <h:commandButton value="Register" action="#{personc.register}"> 
       <f:ajax execute="@form" render="@form" /> 
      </h:commandButton> 

     </h:panelGrid> 
    </h:form> 

Person Controller (nach der MVC-Struktur):

@ManagedBean(name="personc") 
@SessionScoped 
public class PersonController implements Serializable { 
    private static final long serialVersionUID = 2000186666864113813L; 

    // attributes 
    @EJB PersonEAO personEAO; 
    private PersonBean personb; 

    public PersonController() { 
     personb = new PersonBean(); 
    } 

    // methods 
    public String register(){ 
     if (personEAO.register(personb.getUser(), personb.getPerson())){ 
      status = "welcome!"; 
      return "success"; 
     }else{ 
      status = "an error occurs"; 
      return "failure"; 
     } 
    } 
     // others methods.. 

Und die PersonEAO Einheit:

@Stateless 
@LocalBean 
public class PersonEAO { 
    @PersistenceContext 
    EntityManager em; 

    public PersonEAO() {} 

    public boolean register(User user, Person person){ 
     try{ 
      em.persist(user); 

      person.setUser(user); 
      em.persist(person); 
     }catch(Exception e){ 
        // would like to treat better the exceptions here 
        // should I keep returning boolean here ? or a string would be better ? 
      return false; 
     } 
     return true; 
    } 

Ich habe einige Fragen:

Wenn ich weiterhin boolean von Operationen mit JPA zurückgeben möchte, möchte ich dem Benutzer eine bessere Nachricht sagen, was passiert ist, wie zum Beispiel duplicate key.

+0

Kleine Bemerkung: '@ LocalBean' in unnötig auf der' PersoneEAO' Bohne. –

Antwort

1

Wie über einen ENUM mit vordefinierten Werten zu schaffen und anstelle von catch(Exception e) mehr speziellere Fang tun und jedes in sie auf der die retrun Parameter der Methode eingestellt mit diesem spezifischen Enumeration Wert

enum Beispiel

public enum REGISTERCODE{ 
    SUCCESS , DUPLICATE, GENERAL_ERROR, SESSION_EXPIRED, MORE, MORE2; 
} 

Änderung Unterschrift in so etwas wie

public REGISTERCODE register(User user, Person person){...return REGISTERCODE.SUCCESS... 

.. Sie auch Schlüssel in der Sprachdatei mit dem pr erstellen efix ResgisterCode_ und dann wieder Nachrichten an Ihre Benutzern auf dieser Basis, wie

localizationClass.getMessageFromBundle("ResgisterCode_"+REGISTERCODE_variable.name()) 

wo REGISTERCODE_variable ist der Rückgabewert aus dem Register Methode

dann in der Anrufer Methode in Ihren personc Bean eine detaillierte Nachricht auf der Rückkehr basierte Aufzählungswert ...

2

Verwenden Sie keine booleschen Flags (oder Enums), um außergewöhnliche Ergebnisse anzuzeigen. Verwenden Sie Ausnahmen dafür. Sie müssen nur einige Logik hinzufügen, welche Art von JPA-Implementierung spezifische Ausnahme der PersistenceException ist, wickeln und dann erneut als Ihre spezifische Geschäftsausnahme, z. eine benutzerdefinierte public class DuplicateKeyException extends PersistenceException.

Zum Beispiel in Ihrer Business-Service-Implementierung

public void register(User user, Person person) throws PersistenceException, DuplicateKeyException { 
    try { 
     em.persist(user); 
     person.setUser(user); 
     em.persist(person); 
    } 
    catch (PersistenceException e) { 
     if (Exceptions.is(e, ConstraintViolationException.class)) { 
      throw new DuplicateKeyException(e); 
     } 
     else { 
      throw e; 
     } 
    } 
} 

mit dieser Methode in der Exceptions Utility-Klasse:

public static <T extends Throwable> boolean is(Throwable exception, Class<T> type) { 
    for (;exception != null; exception = exception.getCause()) { 
     if (type.isInstance(exception)) { 
      return true; 
     } 
    } 

    return false; 
} 

, die Sie dann in Ihrer Controller Seite behandeln:

public String register() { 
    try { 
     personEAO.register(personb.getUser(), personb.getPerson()); 
     Messages.addGlobalInfo("user.register.success"); 
     return "success"; 
    } 
    catch (DuplicateKeyException e) { 
     logger.log(e); // If necessary. 
     Messages.addGlobalError("user.register.error.duplicate"); 
     return "failure"; 
    } 
} 

Die Messages.addGlobalXxx() könnte eine globalehinzufügen 0 auf den Kontext, wie als

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
    FacesMessage.SEVERITY_INFO, someBundle.getString(key), null)); 

OmniFaces folgt hat eine similar class, die Sie in hier helfen können.

Eine solche globale Nachricht wird nur zeigen sich in einem

<h:messages globalOnly="true" /> 
Verwandte Themen