[英]JSF 2 : How handle exceptions in controller?
我想做一个可以正常工作的注册表:
<h:form id="register_form">
<h:panelGrid columns="3">
<h:outputLabel for="email" value="E-mail:" />
<h:inputText id="email" value="#{userc.userb.user.email}">
<f:ajax event="blur" render="m_email" />
</h:inputText>
<h:message id="m_email" for="email" ajaxRendered="false" />
<h:outputLabel for="password" value="Passoword" />
<h:inputSecret id="password" value="#{userc.userb.user.password}">
<f:validator validatorId="confirmPasswordValidator" />
<f:attribute name="confirm" value="#{confirmPassword.submittedValue}" />
</h:inputSecret>
<h:message id="m_password" for="password" />
<h:commandButton value="Registerr" action="#{userc.register}">
<f:ajax execute="@form" render="@form" />
</h:commandButton>
<h:messages globalOnly="true" layout="table" />
</h:panelGrid>
</h:form>
这是我的控制器:
public void register(){
FacesMessage message;
try {
userb.encryptPassword();
userEAO.create(userb.getUser());
message = new FacesMessage("Register successfully!");
FacesContext.getCurrentInstance().addMessage(null, message);
} catch (Exception e) {
// 1062 : duplicate entry
if (e.getMessage().contains("Duplicate")){
message = new FacesMessage("User already registered, please try another email");
FacesContext.getCurrentInstance().addMessage(null, message);
}else{
message = new FacesMessage("An error occured, try again please");
FacesContext.getCurrentInstance().addMessage(null, message);
}
}
}
因此,例如,如果某个用户尝试注册两次,我会返回此消息,说这是重复的,但我想知道这是否是最佳方法。
如何处理这些异常?
这些验证应该由您的业务逻辑层对象处理,在这种情况下,它看起来像是userEAO
对象。 您可以决定是否应该以异常的形式处理此错误消息(恕我直言不会使用)。
就我而言,我更喜欢使用基本上包含整数代码和保存操作结果的消息的Message
类。 对于我的情况,我通常返回 0 或更多表示操作成功,并使用否定代码声明错误。 这是一个非常基本的例子:
public class Message {
private int code;
private String message;
//constructor...
//getters and setters...
}
public class UserBL {
public Message create(User user) {
//do some fancy validations
if (!verifyDuplicatedUser(user)) {
return new Message(-1000, "Duplicated user");
}
//and the operations...
saveUser(user);
return new Message(0, "Register successfully!");
}
}
现在您的控制器将执行它必须真正做的事情(这意味着,没有繁重的业务逻辑验证):
public void register() {
FacesMessage fmessage;
userb.encryptPassword();
Message message = userEAO.create(userb.getUser());
fmessage = new FacesMessage(message.getMessage());
FacesContext.getCurrentInstance().addMessage(null, fmessage);
}
这种方法甚至可以在您应该验证一组数据时为您提供帮助,例如验证 Excel 工作表的结果并且您必须显示错误列表(因为多次显示单个错误非常烦人!)。
您可以改进创建消息的方式,例如从包含系统消息的表中检索它们,或使用属性文件来处理国际化(当然,这取决于您的功能要求)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.