如何在JSF中返回状态消息?

Val*_*lva 5 jsf jsf-2

我会让自己很客观:

一个用户注册自己,在这个操作后register我想表示一些消息说恭喜!欢迎!,如果duplicated key在我的数据库中存在某些问题,那样的话或某些消息.

我已经知道如何用RichFaces显示一些消息,但我想保持简单,RichFaces用CSS搞砸了一点,所以我想暂时避免使用它.

所以这里是我的页面和我的托管bean:

    <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>
Run Code Online (Sandbox Code Playgroud)

人控制器(遵循MVC结构):

@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..
Run Code Online (Sandbox Code Playgroud)

而PersonEAO实体:

@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;
    }
Run Code Online (Sandbox Code Playgroud)

我有一些问题 :

如果我应该继续boolean从使用JPA的操作返回,我想向用户说出更好的消息,说明发生了什么duplicate key,例如.

Dan*_*iel 1

如何使用预定义值创建一个枚举,而不是catch(Exception e)执行几个更具体的捕获,并在每个捕获中使用该特定枚举值设置方法的 retrun 参数

枚举示例

public enum REGISTERCODE{
    SUCCESS , DUPLICATE, GENERAL_ERROR, SESSION_EXPIRED, MORE, MORE2; 
}
Run Code Online (Sandbox Code Playgroud)

将签名更改为类似的内容

public REGISTERCODE register(User user, Person person){...return REGISTERCODE.SUCCESS...
Run Code Online (Sandbox Code Playgroud)

另外..您可以在语言文件中使用前缀 ResgisterCode_ 创建密钥,然后基于此将消息返回给您的用户,例如

localizationClass.getMessageFromBundle("ResgisterCode_"+REGISTERCODE_variable.name())
Run Code Online (Sandbox Code Playgroud)

其中REGISTERCODE_variable是 register 方法的返回值

然后在 bean 的调用者方法中personc根据枚举值返回详细消息...