在我的屏幕中,我有一个下拉(选择框),在选择该下拉列表中的任何选项时,我使用javascript/css - display:none和display:block在选择框旁边显示一个或多个文本框.所有这些输入控件都采用相同的jsf格式.每个输入控件都有自己的验证器.问题是假设用户从选择框中选择option1并且没有输入值或输入错误的值 inputbox1,我在Validator中添加了一个自定义FacesMessage并且被正确显示并假设用户第二次选择option2并输入inputbox2的值不正确,然后在验证器中添加另一个FacesMessage.但现在两个消息都显示 - 表示 - inputbox1和inputbox2的消息 - 这是错误的我的假设是,这是因为它们以相同的形式存在,并且它们的实例在FacesContext和UIView中尚未被销毁.我决定以这种方式删除这些消息
Iterator<FacesMessage> msgIterator = FacesContext.getCurrentInstance().getMessages();
while(msgIterator.hasNext())
{
msgIterator.next();
msgIterator.remove();
}
Run Code Online (Sandbox Code Playgroud)
但这有时会产生java.util.NoSuchElementException org.apache.myfaces.shared_impl.renderkit.html.HtmlMessagesRendererBase $ MessagesIterator.next
那2个问题:
1)以这种方式删除FacesMessages有什么问题?我正在使用myfaces-api-1.2.3.jar和myfaces-impl-1.2.3.jar
2)有更好的方法来处理我的场景吗?我只想在每次处理jsf请求时显示相关消息
谢谢
据我所知,这还不够
org.apache.myfaces.context.servlet.FacesContextImpl
Run Code Online (Sandbox Code Playgroud)
(版本:2.0.15,修订版:1364593),有2个消息列表(_orderedMessages和_messages),您的方法只清除_orderedMessages.
要清除_messages这样做:
Iterator<String> itIds = FacesContext.getCurrentInstance().getClientIdsWithMessages();
while (itIds.hasNext()) {
List<FacesMessage> messageList = FacesContext.getCurrentInstance().getMessageList(itIds.next());
if (!messageList.isEmpty()) { // if empty, it will be unmodifiable and throw UnsupportedOperationException...
messageList.clear();
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这是非常脆弱的,因为它依赖于实现细节,但我找不到更好的方法:(
问题不在于我无法从 FacesContext 中删除消息。问题是,每次提交表单时,很少有输入控件(使用 display:none 不会显示这些输入控件),它们保留了一些值 (),因此 Validators 和 Backing Bean 代码为那些不可见的输入控件添加了 FacesMessages FacesContext。现在,每次更改选择选项时,我都会清除其他不必要的表单字段,因此不会添加消息。
| 归档时间: |
|
| 查看次数: |
38865 次 |
| 最近记录: |