Servlets 显示从Servlet到JSF页面的消息

Servlets 显示从Servlet到JSF页面的消息,servlets,jsf-2,facelets,Servlets,Jsf 2,Facelets,我试图在servlet的xhtml页面中显示成功消息,但运气不好,下面是我的代码 在servlet中,我有 FacesContextFactory contextFactory = (FacesContextFactory)FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY); LifecycleFactory lifecycleFactory = (LifecycleFactory)FactoryFi

我试图在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" />


正在保存到数据库,但未显示任何消息,请指出我的错误所在

不要为消息提供与“for”组件相同的id。如果您只需要messageholder而不将其附加到valueholder,那么应该使用标记

<h:messages class="success" id="displaymessagesave" />

除了
FacesServlet
之外,无法从servlet访问FacesContext

最近我遇到了同样的问题,我所做的是,在我的servlet上,将消息放入会话中:

 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);
最后,
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 "";
}
公共字符串prepareMessages()
{
List msgs=(List)FacesContext.getCurrentInstance()
.getExternalContext().getSessionMap().get(键);
如果(msgs!=null)
{
用于(字符串消息:msgs)
{
FacesContext.getCurrentInstance().addMessage(空,
新面孔信息(msg);
}
FacesContext.getCurrentInstance().getExternalContext()
.getSessionMap().remove(键);
}
返回“”;
}

这可能不是一个优雅的解决方案,但却是我发现的唯一解决方案…

我尝试只使用id,但仍然没有显示任何消息。您是否尝试使用h:messages而不是h:message?您还必须更新h:messages组件才能在UI上查看消息。
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 "";
}