JSF有两种异常消息:
[1] JSF提供的标准异常信息,如标准的验证器和转换器生成的异常信息等
[2] 自定义的异常信息
与消息相关的类是javax.faces.application.FacesMessage,他封装了单一的、本地化的、人类可以理解的消息,除了消息字符串本身外,FacesMessage还有三个属性:severity(严重性),summary(摘要),detail(详细信息)
serverity被定义成FacesMessage的内部类,有四种类型:Info、Warn、Error、Fatal
FacesContext负责维护FacesMessage的两个逻辑集合,一个和组件相关的消息集合、一个不与组件相关的消息集合,定义了如下的和消息相关的方法
public Iterator<FacesMessage> getMessages();
public Iterator<FacesMessage> getMessages(String clientId);
public Iterator<String> getClientIdsWithMessages();//返回有消息绑定的组件id
public void addMessage(String clientId, javax.faces.application.FacesMessage message);//向FacesContext中加入一条FacesMessage
public FacesMessage.Severity getMaximumSeverity();//返回最严重的问题的严重性
FacesMessage的部分源代码如下:
private FacesMessage.Severity _severity;
private String _summary;
private String _detail;
public FacesMessage()
{
_severity = SEVERITY_INFO;
}
public FacesMessage(String summary)
{
_summary = summary;
_severity = SEVERITY_INFO;
}
public FacesMessage(String summary, String detail)
{
_summary = summary;
_detail = detail;
_severity = SEVERITY_INFO;
}
public FacesMessage(FacesMessage.Severity severity, String summary, String detail)
{
if(severity == null) throw new NullPointerException("severity");
_severity = severity;
_summary = summary;
_detail = detail;
}
和消息相关的两个标签是<h:message>与<h:messages>: <h:message> 有一个必设属性for,标示消息的绑定组件id;showDetail属性默认为false,showSummary属性默认为true <h:messages>渲染所有的排队消息,在globalOnly设为true时只渲染哪些没有组件标识符的消息。 我一般会在项目中新建一个MessageUtil类,处理消息,其代码如下:
public class MessageUtil {
public static void addErrorMessage(FacesContext context, String clientId, String message){
context.addMessage(clientId, new FacesMessage(message));
}
public static void addErrorMessage(FacesContext context, String message) {
addErrorMessage(context, null, message);
}
/**
* Add a global message, the detail is null and the servity is info by default
* @param message message summary
*/
public static void addErrorMessage(String message){
addErrorMessage(FacesContext.getCurrentInstance(), message);
}
/**
* Binding messages to a ui component
* @param clientId The ui component id
* @param message message summary
*/
public static void addErrorMessage(String clientId, String message){
addErrorMessage(FacesContext.getCurrentInstance(), clientId, message);
}
}
如 我们在登录时需要向用户提示“用户名或者密码错误”,可以调用public static void addErrorMessage(String message),然后在页面上使用<h:messages globalOnly=”true”/>来显示这个信息。