如何从托管bean调用javascript函数?

时间:2012-06-16 09:18:38

标签: javascript jsf-2 primefaces

我在托管bean中有条件。我想在条件为真时显示警报。我怎么做的?类似的东西:

    public void catInsert()
        {
            if(abr.searchCategoryByCategoryName(CategoryName)!=null){
    //                msg = "<div style = 'color:red'>CategoryName already exist!</div>";
    //                System.out.println(msg);
//  i want alert here

            }else
            {
            abr.addCategory(CategoryName);
            CategoryName="";
            }
         }

和xhtml页面是;

<table class="nostyle">
                <tr>
                    <td align="right">
                    <h:outputText value="Category Name:"></h:outputText>
                    </td>
                    <td>
                        <h:inputText id="txtcatname" value="#{categoryBean.categoryName}" required="true" requiredMessage="Enter category Name" >
                        </h:inputText>
                    </td>
                    <td ><h:message for="txtcatname" style="color: #df0000"></h:message></td>>            
                </tr>
                <tr>
                    <td></td>
                    <td align="left">
                        <h:commandButton id="submit" type="Submit" value="submit" action="#{categoryBean.catInsert()}" >
                        </h:commandButton>
                    </td>

                </tr>
            </table>

1 个答案:

答案 0 :(得分:2)

你犯了一个概念上的错误。 HTML / JS代码不属于控制器,但属于视图。控制器必须以某种方式通知视图它必须生成所需的HTML / JS代码。

你可以通过设置像这样的布尔属性

来做到这一点
private boolean showCategoryNameAlert;

public void catInsert() {
    if (abr.searchCategoryByCategoryName(categoryName) != null) {
        showCategoryNameAlert = true;
    } else {
        abr.addCategory(categoryName);
    }
}

public boolean isShowCategoryNameAlert() {
    return showCategoryNameAlert;
}

<h:outputScript rendered="#{categoryBean.showCategoryNameAlert}">
    alert("CategoryName already exist!");
</h:outputScript>

顺便说一下,为什么不在输入字段中使用FacesContext#addMessage()<h:messages>或者甚至是普通的JSF Validator?显示JavaScript警报是soo 90's并且在动作方法中执行输入验证是糟糕的设计。