<a4j:commandbutton>未显示在其操作方法上创建的<h:message> </h:message> </a4j:commandbutton>

时间:2013-12-17 16:11:59

标签: java ajax jsf message

我已inputtext启用了<a4j:commandbutton>旁边有id=subjectButton的{​​{1}}。当我填写inputtext并单击按钮时,第一个上方会显示disabled inputtext,显示添加的内容。对于enabled inputtext上的每个内容,其上方会显示一个新的禁用内容。

当我点击subjectButton时,如果它已经填满,上面的情况就会发生,但是如果它是空的,我希望它旁边出现一个<h:message>,说不可能插入一个空的学科。仅当我单击按钮时才会显示该消息。在下面的代码中我试图这样做,看:

 <a4j:outputPanel id="subjectPanel">
    <br />
    <h:outputText value="Subjects:"/>
    <br />
    <a4j:repeat value="#{insertDocController.moreSubjects}" var="bean">     
    <h:inputText id="inputSubject" value="#{bean.subject}" disabled="true"/>
      <a4j:commandButton type="submit" action="#{insertDocController.removeSubject(bean.subject)}" 
         value="Remove" render="subjectPanel" execute="@this" />

    </a4j:repeat>
    <br />
    <h:inputText id="inputSub" value="#{insertDocController.currentSubject}"/>


    <a4j:commandButton id="subjectButton" value="Insert"
                     action="#{insertDocController.addSubject}" 
                     render="subjectPanel inpuSubject subjectMessage"
                     execute="@this inputSub">
    </a4j:commandButton> 
      <h:message for="inputSub" id="subjectMessage" style="color:red"  />
    <br />
    </a4j:outputPanel>

这是addSubject()从subjectButton调用action属性的方法。消息在此处设置:

public void addSubject() {    
        if( (this.currentSubject == null) || (this.currentSubject.equals("")) )  {

            FacesContext ctx = FacesContext.getCurrentInstance();
            FacesMessage msg = new FacesMessage("Empty input!"); 
            ctx.addMessage("subjectMessage",msg);
            System.out.println("MSG  : " + msg.getSummary().toString());
        } else {
            SubjectBean subBean = new SubjectBean();
            subBean.setSubject(this.currentSubject);
            this.docController.getDocumentBean().getSubjectList().add(subBean); 
            this.currentSubject = "";
        }
    }   

当我单击按钮并且inputtext为空时,调用addSubject()并设置消息,因为我在addSubject()内进行了测试 - (它也在上面的代码中显示):< / p>

System.out.println("MSG  : " + msg.getSummary().toString());

并在控制台上打印消息。

有什么问题?

谢谢!

2 个答案:

答案 0 :(得分:1)

您能否确保将正确的客户端ID传递给ctx.addMessage()?要验证,请打开Firebug的HTML面板(或浏览器的等效文件),找到<h:inputText id="inputSub">并记下JSF设置的真实 ID;尝试将 ID传递给ctx.addMessage()

如果这不起作用,请在按下按钮时检查Firebug的网络面板以及服务器发送的响应。 <h:message>是否正确呈现?

与此无关,您正在重新呈现整个<a4j:outputPanel>,因此在<a4j:commandButton render="subjectPanel inpuSubject subjectMessage">中,其他ID可能是多余的。

答案 1 :(得分:1)

FacesContext.addMessage需要组件的clientId,而不是消息ID。

试试这个:

ctx.addMessage("inputSub",msg);//inputSub as clientId
//clientId depends on the final generated id of the inputField
//it might be subjectPanel:inputSub or formId:inputSub