PrimeFaces 5.1 +可编辑的数据表+ fileUpload列

Anismek

我正在使用可编辑的文件<p:dataTable>,每个文件都<p:column>包含一个<p:cellEditor>我用一种特殊的方式<p:column>来表示用于存储文件名(由用户上传)的模型项的属性(我们称其为chemin)。对应<p:cellEditor>如下:

  • <f:facet>包含<p:fileUpload><h:outputLink>
  • <f:facet>含有<h:outputLink>

我想实现以下内容:当用户单击<p:rowEditor>(铅笔图标)时,(1)<p:fileUpload>显示出来,(2)用户然后选择并上传文件,(3)当用户验证更新时(通过单击检查)标记),该列将显示指向新上传文件的链接,这意味着当前模型项将相应更新:chemin属性将包含新上传文件的名称。

下面的代码正确实现了步骤(1)至(2),但是步骤(3)不起作用。

版本.xhtml

<h:form id="RUDForm" enctype="multipart/form-data">
    <p:dataTable
        id="versionDT"
        var="version"
        value="#{versionController.rechercherToutVersion()}"
        editable="true"
        paginator="true"
        rows="3"
        dir="rtl"
        style="width: 100%"
        emptyMessage="#{messages.listeVide}">

        <p:ajax event="rowEdit" listener="#{versionController.updateVersion(version)}" update=":RUDForm:versionDT" />

        ...

        <p:column headerText="#{messages.chemin}">
            <p:cellEditor>
                <f:facet name="output">
                    <h:outputLink
                        id = "versionCheminLink"
                        value="#{versionController.relativeUploadUrl(version.chemin)}"
                        target="_blank"
                        rendered = "#{version.chemin != null}"
                    >
                        <h:outputText styleClass="title-text" value="#{version.chemin}"/>

                    </h:outputLink>
                </f:facet>
                <f:facet name="input">
                    <p:panelGrid
                        id="uploadUpdatePG"
                        dir="rtl"
                    >
                        <p:row>
                            <p:column>
                                <p:fileUpload
                                    id = "versionChemin"
                                    fileUploadListener="#{versionController.fileUploadListenerUpdate}"
                                    mode="advanced"
                                    dragDropSupport="false"
                                    update=":RUDForm:versionDT:uploadUpdatePG"
                                    fileLimit="1"
                                    label="#{messages.unChoix}"
                                    uploadLabel="#{messages.upload}"
                                    cancelLabel="#{messages.annuler}"
                                    invalidSizeMessage = "#{messages.invalidSizeMessage}"
                                    invalidFileMessage = "#{messages.invalidFileMessage}"
                                    sizeLimit="1000000"
                                >
                                    <f:attribute name="version" value="#{version}" />
                                </p:fileUpload>
                            </p:column>
                        </p:row>
                        <p:row>
                            <p:column>
                                <h:outputLink
                                    id = "versionCheminLinkReminder"
                                    value="#{versionController.relativeUploadUrl(version.chemin)}"
                                    target="_blank"
                                    rendered = "#{version.chemin != null}"
                                >
                                    <h:outputText styleClass="title-text" value="#{version.chemin}"/>

                                </h:outputLink>
                            </p:column>
                        </p:row>
                    </p:panelGrid>
                </f:facet>
            </p:cellEditor>
            <p:message for="versionChemin"/>
        </p:column>

        ...

        <p:column style="width:6%">
            <p:rowEditor />
        </p:column>

    </p:dataTable>
</h:form>

版本控制器.java

@ManagedBean
@ViewScoped
public class VersionController extends GenericPageController implements Serializable
{

    ...

    @ManagedProperty(value="#{versionServiceImpl}")
    private VersionService versionService;
    public VersionService getVersionService() {
        return versionService;
    }
    public void setVersionService(VersionService versionService) {
        this.versionService = versionService;
    }

    private UploadedFile file;
    public UploadedFile getFile() {
        return file;
    }
    public void setFile(UploadedFile file) {
        this.file = file;
    }

    ...

    public void updateVersion(Version version)
    {
        if (getVersionService().updateVersion(version))
        {
            addInfoByKey("msgUpdateOk");
        }
        else
        {
            addErrorByKey("msgUpdateKo");
        }
    }

    ...

    public void fileUploadListenerUpdate(FileUploadEvent event)
    {
        setFile(event.getFile());
        uploadVersionUpdate((Version)event.getComponent().getAttributes().get("version"));
    }

    public void uploadVersionUpdate(Version version)
    {
        if ((getFile() != null) && (getFile().getSize() != 0))
        {
            version.setChemin(new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + addZeros(new Random().nextInt(10),3) + getFile().getFileName());
            upload(getFile(),version.getChemin());
            addInfoByKey("RUDForm:uploadUpdatePG","uploadOk");
        }
        else
        {
            addErrorByKey("RUDForm:uploadUpdatePG","uploadKo");
        }
    }
}

我的想法是使用中的<f:attribute>,将要编辑的模型项传递给控制器<p:fileUpload>

上传成功后(在方法uploadUpsionUpdate中,由调用fileUploadListener),使用实际上传的文件名更新模型项的属性chemin

我希望当用户单击复选标记(以验证更新)时,该行将显示chemin的新值上面的代码不是这种情况。

似乎<p:rowEditor>忽略了所做的更改fileUploadListener有没有一种方法可以强制行版本考虑到fileUploadListener所做的更改

PS:文件上传工作正常(配置良好),行版本也工作正常(除chemin属性外)。

快照:

版本之前: 版前请注意旧的化学值:blabla 13 blabla.pdf

单击“版本(铅笔)”图标并选择要上传的新文件后: 单击“版本(铅笔)”图标并选择要上传的新文件后

成功上传新文件后: 成功上传新文件后请注意,chemin属性已更新:blabla 12 blabla.pdf。

验证版本后:单击 对勾图标:验证版本后:单击对勾图标请注意,chemin属性显示旧值:blabla 13 blabla.pdf。

Anismek

解决方案在这里找到!

每次填充dataTable的方法都调用一个服务(后者又调用一个查询数据库的存储库)。解决方案是仅在提供dataTable的列表为null时才进入数据库,从而进行以下转换:

public List<Version> rechercherToutVersion()
{
  return(getVersionService().rechercherToutVersion());
}

进入:

private List<Version> allVersions;

public List<Version> getAllVersions() {
  return allVersions;
}

public void setAllVersions(List<Version> allVersions) {
  this.allVersions = allVersions;
}

...

public List<Version> rechercherToutVersion()
{
  if (getAllVersions() == null)
  {
    setAllVersions(getVersionService().rechercherToutVersion());
  }
  return(getAllVersions());
}

这就解决了我的问题,但是即使从数据库访问的角度来看解决方案更有效,我也必须修改saveVersiondeleteVersion方法。确实,由于并非每次都从数据库获得行,所以当我删除dataTable中的一行时,删除的行仍会显示,并且如果我添加新项目,则该项目不会显示在dataTable中:我必须刷新该页面上会看到修改。

解决此新问题的方法是“手动”从allVersions属性中删除或添加一项,或者仅在每次删除保存后将其重置为null 删除示例:

public void deleteVersion(Version version)
{
  if (getVersionService().deleteVersion(version))
  {
    setAllVersions(null);
    addInfoByKey("msgDeleteOk");
  }
  else
  {
    addErrorByKey("msgDeleteKo");
  }
}

最后,最让我感到沮丧的是:为什么在原始代码版本中,update对于其他属性完美地起作用,但是对于绑定到文件上载的属性却没有?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Primefaces selectManyCheckbox具有可编辑的数据表,将null提交给Converter

来自分类Dev

根据另一列中的选择,primefaces 更改数据表中一列的编辑器

来自分类Dev

Primefaces数据表的p:列未遍历Map

来自分类Dev

数据表中的Primefaces静态和动态列

来自分类Dev

Primefaces数据表(日期列)按日历过滤

来自分类Dev

PrimeFaces数据表中的条件单元格编辑

来自分类Dev

PrimeFaces数据表中的条件单元格编辑

来自分类Dev

在 JSF 或 Primefaces 数据表中编辑哈希图

来自分类Dev

Primefaces数据表-4.0

来自分类Dev

Primefaces数据表-4.0

来自分类Dev

有没有办法从服务器中获取可编辑数据表中的列?

来自分类Dev

Primefaces数据表重复“未找到记录”,同时冻结空记录的列

来自分类Dev

全局过滤器(不是单个列)的JSF Primefaces数据表匹配模式

来自分类Dev

具有动态模型和列的Primefaces 8.0数据表

来自分类Dev

Primefaces数据表重复“无记录”,同时冻结空记录的列

来自分类Dev

在Wildfly上的Primefaces Fileupload

来自分类Dev

在Wildfly上的Primefaces Fileupload

来自分类Dev

Primefaces数据表更新数据表

来自分类Dev

Primefaces数据表重置分页

来自分类Dev

PrimeFaces数据表中的掩蔽数字

来自分类Dev

数据表中的CSS primefaces panelgrid

来自分类Dev

PrimeFaces数据表不起作用

来自分类Dev

过滤后的Primefaces数据表排序

来自分类Dev

Primefaces数据表重置分页

来自分类Dev

Primefaces保存数据表值

来自分类Dev

小区选择数据表PRIMEFACES?

来自分类Dev

PrimeFaces数据表不起作用

来自分类Dev

Primefaces数据表和ViewScoped

来自分类Dev

动态可滚动的 Primefaces 数据表

Related 相关文章

热门标签

归档