我正试图在servlet的xhtml页面中显示成功消息,但没有运气,这是我的代码 在servlet中我有
FacesContextFactory contextFactory = (FacesContextFactory)FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
LifecycleFactory lifecycleFactory = (LifecycleFactory)FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
Lifecycle lifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
FacesContext facesContext = contextFactory.getFacesContext(request.getSession().getServletContext(), request, response, lifecycle);
facesContext.addMessage( "user:displaymessagesave", new FacesMessage("user saved successfully" ));
在xhtml页面里面我已经为显示消息表单id = user
写了标签<h:message class="success" for="displaymessagesave" id="displaymessagesave" />
保存到数据库正在发生,但它没有显示任何消息,请建议我哪里出错了。
答案 0 :(得分:0)
不要为“for”组件提供相同的消息ID。如果您只是想要一个消息持有者,而不是将它附加到价值持有人而不是您应该使用该标签。
<h:messages class="success" id="displaymessagesave" />
答案 1 :(得分:0)
无法从FacesServlet
以外的servlet访问FacesContext。
最近我遇到了同样的问题,我在servlet上做的是把消息放在Session中:
List<String> msgs=(List<String>)request.getSession().getAttribute(KEY);
if (msgs==null)
{
msgs=new ArrayList<String>();
}
msgs.add("My new message");
request.getSession().setAttribute(KEY, msgs);
然后,在xhtml视图中,我添加了一个调用,将这些消息放在FacesContext和growl
元素上:
<h:outputText value="#{managed.prepareMessages()}"/>
<p:growl id="growl" showDetail="false" life="4000" />
最后,prepareMessages
方法从会话中获取它们并将消息添加到FacesContext
:
public String prepareMessages()
{
List<String> msgs = (List<String>)FacesContext.getCurrentInstance()
.getExternalContext().getSessionMap().get(KEY);
if (msgs!=null)
{
for(String msg:msgs)
{
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage(msg));
}
FacesContext.getCurrentInstance().getExternalContext()
.getSessionMap().remove(KEY);
}
return "";
}
这可能不是一个优雅的解决方案,但却是我找到的唯一一个......