使用 JSF 2.2 动态加载表单

Posted

技术标签:

【中文标题】使用 JSF 2.2 动态加载表单【英文标题】:Dynamic loading of forms with JSF 2.2 【发布时间】:2014-12-25 09:55:42 【问题描述】:

技术背景

我们正在使用 JSF 2.2 和 IBM WAS 8.5.5 开发 J2E 应用程序。

问题

我们开发了一个屏幕来加载不同的表单(12 种不同的表单,包括 Ajax 和其他子表单......)。我们希望能够使用“ui:include”标签在 Ajax 的模态框中动态加载表单。

不幸的是,与动态生成的表单相关联的操作没有被执行。

问题

之前有人遇到过这个问题吗? 你有解决问题的线索吗? 您知道在同一页面中加载动态表单的替代方法吗?

代码

我们构建了一个简单的示例来展示我们遇到的问题。

主页(片段)

<ui:composition template="/WEB-INF/templates/globalLayout.xhtml">
    <ui:param name="context" value="publication"/>
    <ui:define name="content">
        <h:form>
            <h:commandLink  value="EDIT1"
                action="#test.edit()"  layout="block" >
            </h:commandLink>
            <h:commandLink value="EDIT2"
                action="#test.edit2()"  layout="block" >
            </h:commandLink>
            <ui:include src="#test.page"/>
        </h:form>
    </ui:define>
</ui:composition>

子页面 1(片段)

<h:outputText value="Page 1 "></h:outputText>
<h:commandLink  value="EDIT1" action="#test.edit()"  layout="block" >
</h:commandLink>
<h:commandLink value="EDIT2" action="#test.edit2()"  layout="block" >
</h:commandLink>

子页面2(片段)

<h:outputText value="Page 2 "></h:outputText>
<h:commandLink  value="EDIT1" action="#test.edit()"  layout="block" >
</h:commandLink>
<h:commandLink value="EDIT2" action="#test.edit2()"  layout="block" >
</h:commandLink>

托管 Bean

package com.myapp;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean(name = "test")
@ViewScoped
public class TestManagedBean implements Serializable 

/**
 * 
*/
private static final long serialVersionUID = -3750906342500909173L;

    private String page;
    public void edit() 
        page = "page.xhtml";
    

    public void edit2() 
        page = "page2.xhtml";
    

    public String getPage() 
        return page;
    

    public void setPage(String page) 
        this.page = page;
    

注意

使用“ui:fragment”元素是不可用的。对我们来说,生成页面需要将近一分钟,而使用完整的 ajax 大约需要 2.3 秒。 所以下面的例子不适合我们。

<ui:fragment rendered="#index.page eq 'page2'">
    <ui:include src="page2.xhtml"/>
</ui:fragment>

【问题讨论】:

【参考方案1】:

尝试改用&lt;ui:decorate template="#test.page"/&gt;

【讨论】:

以上是关于使用 JSF 2.2 动态加载表单的主要内容,如果未能解决你的问题,请参考以下文章

Primefaces 动态列不适用于延迟加载

如何创建动态 JSF 表单域

jquery+ajax实现动态加载表单

通过 Ajax PHP 动态加载下拉选择

如何在选择时使用 formArray 索引加载动态下拉数据

CoffeeScript 在更改和加载时动态选择表单字段