显示从Servlet到JSF页面的消息

时间:2014-04-02 11:11:45

标签: servlets jsf-2 facelets

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

保存到数据库正在发生,但它没有显示任何消息,请建议我哪里出错了。

2 个答案:

答案 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 "";
}

这可能不是一个优雅的解决方案,但却是我找到的唯一一个......