当前位置: 首页 > 面试题库 >

以编程方式添加Ajax行为-“未定义Mojarra”

陈允晨
2023-03-14
问题内容

我有一个使用动态表单的页面,在该页面上以编程方式创建了组件树(这个问题不值得讨论),我需要呈现的某些输入控件需要ajax处理程序。

xhtml片段(包含<ui:include>在另一个片段中)是:

<ui:composition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://xmlns.jcp.org/jsf/passthrough">

    <h:panelGroup id="id_Group1" binding="#{questionaire.group1}" layout="block"/>

</ui:composition>

基于其他SO解答,我有以下Bean代码:

   public HtmlPanelGroup getGroup1() {

        // irrelevant code omitted

        HtmlSelectOneRadio selectUI = new HtmlSelectOneRadio();
        AjaxBehavior valueChangeAction = (AjaxBehavior)FacesUtils.getApplication().createBehavior(AjaxBehavior.BEHAVIOR_ID);

        valueChangeAction.addAjaxBehaviorListener(new ProbeQuestionListener(currentQuestion, "probeDiv" + questionNumber));


        selectUI.addClientBehavior("change", valueChangeAction);
        valueChangeAction.setRender(Collections.singletonList("probeDiv" + questionNumber));

       // further code to customise the control, create the panel group and probe div and wire everything together omitted
    }

这可以正确渲染,我看到:

<input type="radio" onchange="mojarra.ab(this,event,'change',0,'probeDiv2')" value="0" id="answer_1:0" name="answer_1">

但是,单击单选按钮会给我一个JavaScript控制台错误: reference error: mojarra is not defined

现在,如果我修改xhtml以包括“普通” ajax控件,例如

<ui:composition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://xmlns.jcp.org/jsf/passthrough">

    <h:panelGroup id="id_Group1" binding="#{questionaire.group1}" layout="block"/>

    <!-- include a hacky hidden ajax field to force inclusion of the ajax javascript -->
    <h:panelGroup layout="block" id="hiddenAjaxDiv" style="display:none">
        <h:inputText id="hiddenAjax">
            <f:ajax execute="hiddenAjax" render="hiddenAjaxDiv" />
        </h:inputText>
    </h:panelGroup>

</ui:composition>

这项工作正常,萤火虫网络监视器显示单选按钮上的ajax事件已发布到应用程序。

所以,最后,我的问题是:

如何以编程方式强制包含ajax javascript库并免除我当前正在使用的可怕骇客?

注意:我对以“不要使用动态生成的组件”开头的任何答案都不感兴趣-由于多种原因,这不是一个选择。


问题答案:

基本上,您需要这样做:

<h:outputScript library="javax.faces" name="jsf.js" target="head" />

该脚本mojarrajsf包含JSF ajax脚本的标准名称空间中包含定义。

您可以在<h:head>主模板的中显式声明它,如有必要,可以通过<ui:define>/进行声明<ui:include>jsf.js如果视图已隐式要求,它将不会加载文件的重复副本。

您甚至可以以编程方式创建它:

UIComponent jsfjs = new UIOutput();
jsfjs.getAttributes().put("library", "javax.faces");
jsfjs.getAttributes().put("name", "jsf.js");
jsfjs.setRendererType("javax.faces.resource.Script");
FacesContext context = FacesContext.getCurrentInstance();
context.getViewRoot().addComponentResource(context, jsfjs, "head");

同样在这里,jsf.js如果视图已经隐式需要,它将不会加载文件的重复副本。

无关 的具体问题,你应该更喜欢<f:event type="postAddToView">binding,当你需要以编程方式填充组件树:

<h:panelGroup id="id_Group1" layout="block">
    <f:event type="postAddToView" listener="#{questionaire.populateGroup1}" />
</h:panelGroup>

public void populateGroup1(ComponentSystemEvent event) {
    HtmlPanelGorup group1 = (HtmlPanelGroup) event.getComponent();
    // ...
}

这样可以确保在恰好适当的时机填充树,并确保getter不受业务逻辑的影响,并避免#{questionaire}在比请求范围更广的范围内潜在的“重复组件ID”麻烦,并使Bean不受UIComponent属性的影响。当组件作为可序列化bean的属性保存时,转弯避免了潜在的序列化麻烦和内存泄漏。



 类似资料:
  • 我正在尝试在Android上添加Wifi网络,我想知道如何连接到不广播其SSID的Wifi网络(它是否有空SSID或带有\0s的清晰SSID)。 这是我目前用于广播其SSID的Wifi网络的内容:

  • 我正在创建一个UI(以编程方式),它将显示两个主要部分 > 第一部分将显示一个视频播放器 第二部分将展示一个带有更多视频的UITableView 我已经成功地完成了第一部分,它正在工作,它占据了屏幕顶部的一小部分 使用相同的逻辑,我试图在主容器视图中添加一个UITableView,但我只能看到一个空的tableView 我还尝试在调用cellForRowAt时记录消息,但没有打印任何内容,我得出结

  • 问题内容: 我正在尝试为我的应用程序创建一个帐户,在该帐户中我可以与我的帐户建立联系,例如facebook,viber,whatsapp等。我也希望我的帐户在设置的“帐户”部分中可见。有任何想法吗?我已经在Google上搜索了很多,但是找不到正确的答案从哪里开始。请帮忙。我试图创建一个帐户如下。这导致我出错。 问题答案: 您需要设置多个组件才能以编程方式创建一个帐户。你需要: AccountAut

  • 问题 你在写一段代码,最终需要创建一个新的类对象。你考虑将类的定义源代码以字符串的形式发布出去。 并且使用函数比如 exec() 来执行它,但是你想寻找一个更加优雅的解决方案。 解决方案 你可以使用函数 types.new_class() 来初始化新的类对象。 你需要做的只是提供类的名字、父类元组、关键字参数,以及一个用成员变量填充类字典的回调函数。例如: # stock.py # Example

  • 我有一个模型,其中有一个@列(nullable=false)注释HiberNate和所有字段有nullable=false,我想以编程方式添加一些新的注释,如@NotNull和@ApiModelProperty(必需=true)-用于招摇过市。 所以,我希望能够从我的应用程序的模型中解析所有字段,获得现有的注释,并在此基础上添加新的注释。这能做到吗? 更新:问题是每次添加一个新字段,如果它不能为空

  • 我正在使用SpringDoc,并试图以编程方式向OpenApi添加一个模式,但没有成功。 mySchema的描述没有添加到我在生成的YAML文件中看到的模式列表中,如果我试图引用它: