我正在尝试使用h:message在每个InputText前面放置一条自定义消息。
我的问题是我找不到设置消息的方法。
这是HTML:
<h:inputText id="_inputValue" binding="#{bean.inputtext}"/>
<h:message for="_inputValue" binding="#{bean.message}"/>
<h:commandButton value="validate" actionListener="#{bean.action}"/>
在Managed Bean中,我尝试了不同的方法,但仍然没有显示消息:
获取HtmlInput组件并设置其ValidatorMessage,
public void action(ActionEvent event)
{
inputtext.setValidatorMessage("ERROR");
}
然后我也尝试使用其clientID设置消息。
public void action(ActionEvent event)
{
//Get message id
String messageId = message.getClientId();
//Get context
FacesContext context = FacesContext.getCurrentInstance();
//Create message
FacesMessage fmessage = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Message:", "this is an error message !");
//Add message
context.addMessage(messageId, fmessage);
}
在这个阶段,令我惊讶的是,没有一种简单的方法可以在验证bean之后在Java的h:message中设置一条消息。
我正在使用JSF 2.2
解决方案:
收到评论后,找到了以下解决方案,
<h:inputText id="_inputValue" binding="#{bean.inputtext}" validator="validatorName"/>
<h:message for="_inputValue" binding="#{bean.message}"/>
<h:commandButton value="validate" actionListener="#{bean.action}"/>
然后,验证器将创建一个FacesMessage并将其用于throw声明中。抛出新的ValidatorException(message)。由于jsp消息组件通过for = _inputText链接到输入文本,因此将显示验证程序消息。
@FacesValidator("validatorName")
public class MyValidator implements Validator
{
//[JOB OVERRIDE]
@Override public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException
{
FacesMessage message = new FacesMessage("type of validation that failed.", "detailed cause of failure.");
message.setSeverity(FacesMessage.SEVERITY_ERROR);
throw new ValidatorException(message);
}
}
警告:
请注意,验证器不是Bean且未在CDI中注册,这就是为什么我们使用Validator =“ validatorName”而不是validateator =“#{validatorName}”的原因。
如果将验证器转换为Bean,则删除@FacetValidator并替换为@Named(“ validatorName”),然后在jsp页面中使用validateator =“ {validatorName}”。