@ViewScoped 托管 bean 在回发期间加载多次

2023-11-26

我在 jsf Facelet 上有一个日历、编辑器、文件上传和 dataTable primefaces 控件。

代码如下,

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
                template="./../templates/masterlayout.xhtml"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:p="http://primefaces.prime.com.tr/ui"
                xmlns:f="http://java.sun.com/jsf/core">

    <ui:define name="title">#{lbl.SSTitle}</ui:define>

    <ui:define name="content">
        <h:form>
            <p:panel header="Upload Script">
                <h:outputText value="Welcome #{loginActionBean.login.emp.empName}"/>
                <br />
                <p:calendar value="#{searchScriptActionBean.scheduleDate}" />
                <br />
                <p:fileUpload fileUploadListener="#{searchScriptActionBean.handleFileUpload}"
                              multiple="true" update="filsList" allowTypes="*.txt;*.init" description="Script Files">
                </p:fileUpload>
                <br />
                <p:editor value="#{searchScriptActionBean.htmlText}" />
            </p:panel>
            <p:dataTable id="filsList" value="#{searchScriptActionBean.scriptFiles}" var="file">

                <p:column>
                    <f:facet name="header">
                        <h:outputText value="File Name" />
                    </f:facet>
                    <h:outputText value="#{file.fileName}" />
                </p:column>

                <p:column>
                    <f:facet name="header">
                        <h:outputText value="Size" />
                    </f:facet>
                    <h:outputText value="#{file.size}" />
                </p:column>

                <p:column>
                    <f:facet name="header">
                        <h:outputText value="Operation" />
                    </f:facet>
                    <h:commandLink value="Remove">
                        <p:collector value="#{file}" removeFrom="#{searchScriptActionBean.scriptFiles}" />
                    </h:commandLink>
                </p:column>

            </p:dataTable>
        </h:form>
    </ui:define>
</ui:composition>

和 @ViewScoped Bean 如下,

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ugam.crawler.web.script;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.bean.ViewScoped;
import javax.inject.Named;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

/**
 *
 * @author devendra.mahajan
 */
@Named(value = "searchScriptActionBean")
@ViewScoped
public class SearchScriptActionBean implements Serializable{

    protected String htmlText;
    private Date scheduleDate;
    private List<UploadedFile> scriptFiles = new ArrayList<UploadedFile>();;
    /**
     * Get the value of scheduleDate
     *
     * @return the value of scheduleDate
     */
    public Date getScheduleDate() {
        return scheduleDate;
    }

    /**
     * Set the value of scheduleDate
     *
     * @param scheduleDate new value of scheduleDate
     */
    public void setScheduleDate(Date scheduleDate) {
        this.scheduleDate = scheduleDate;
    }

    /**
     * @return the scriptFiles
     */
    public List<UploadedFile> getScriptFiles() {
        return scriptFiles;
    }

    /**
     * @param scriptFiles the scriptFiles to set
     */
    public void setScriptFiles(List<UploadedFile> scriptFiles) {
        this.scriptFiles = scriptFiles;
    }

    /** Creates a new instance of SearchScriptActionBean */
    public SearchScriptActionBean() {
        System.out.println("In SearchScriptActionBean Constructor");

    }

    public void handleFileUpload(FileUploadEvent event) {
        //add facesmessage to display with growl
        //application code
        UploadedFile file = event.getFile();
        scriptFiles.add(file);


    }


    /**
     * Get the value of htmlText
     *
     * @return the value of htmlText
     */
    public String getHtmlText() {
        return htmlText;
    }

    /**
     * Set the value of htmlText
     *
     * @param htmlText new value of htmlText
     */
    public void setHtmlText(String htmlText) {
        this.htmlText = htmlText;
    }
}

我的问题是 SearchScriptActionBean 在表单加载和上传文件时加载多次。我想保留 bean 的旧值。前任。 scriptFiles(List),添加上传的文件。并且 filsList (dataTable) 没有得到更新。


看起来很像第 1492 期。这是相关性的引用:

这是一个先有鸡还是先有蛋的问题,部分状态保存。该视图被执行到 填充视图before应用了增量状态,因此我们看到了您的行为 描述。

目前,我没有看到解决此用例的明确方法。

如果必须使用视图范围的绑定,解决方法是设置javax.faces.PARTIAL_STATE_SAVING为假。

可能 Primefaces 隐式地将上传的文件与视图绑定,您需要将以下内容添加到web.xml:

<context-param>
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
    <param-value>false</param-value>
</context-param>

尝试一下,看看是否有帮助。如果有效,您可能需要考虑仅针对特定视图关闭。全局关闭部分状态保存将显着增加内存和/或带宽使用,具体取决于状态保存方法。假设视图 ID 为/upload.xhtml, 用这个:

<context-param>
    <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name>
    <param-value>/upload.xhtml</param-value>
</context-param>

您可以通过分号指定多个视图 ID。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@ViewScoped 托管 bean 在回发期间加载多次 的相关文章

随机推荐

  • 清除 chrome webdriver 上的日期输入失败

    我在使用 selenium 从 firefoxdriver 切换到 chromedriver 时遇到了问题 它在 FF 中工作正常 但现在当我尝试清除日期输入字段时出现此错误 Caused by org openqa selenium In
  • 如何使用c#在datagridview中动态添加列

    如何使用c 在datagridview中动态添加列 例如 DataGridViewColumn col new DataGridViewTextBoxColumn col HeaderText Hi there int colIndex g
  • Angular 2 中指令评估的控制顺序

    我想在 Angular 2 中创建一个属性指令 它的主机上需要有一个单击处理程序 需要在评估元素上的其他指令之前添加单击处理程序 因为它控制对某些功能的访问 在 Angular 1 中 您可以在创建指令时使用优先级选项来执行此操作 Angu
  • ASP.NET MVC:@section 的目的是什么? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 对于 ASP NET MVC 应用程序 我看到这篇博客文章 作者 ScottGu 补充道
  • 安卓解密错误

    我正在尝试在 Android 应用程序中加密和解密字符串 但不断收到 InvalidKeyException 错误 这是我的代码 生成密钥方法 public void generateKeys Calendar cal Calendar g
  • Android,检测其他应用程序何时启动

    我正在尝试开发一个应用程序 阻止用户在没有密码的情况下访问指定的应用程序 场景是 用户点击 电子邮件 应用程序 例如 我的应用程序检测到应用程序的启动 我的应用程序确认它是 电子邮件 应用程序 我的应用程序在顶部打开一个视图 要求输入密码
  • 获取所有打开的 WPF 窗口

    我正在尝试获取所有打开的窗口 我尝试使用System Windows Application Current Windows但我在行中得到空指针异常foreach卢普群岛有人知道出了什么问题吗 public Window getWindow
  • C++14 标准中哪里说非 constexpr 函数不能在 constexpr 函数的定义中使用?

    例如 下面的代码不会编译 除非incr 被宣布constexpr int incr int n return n constexpr int foo int n 0 incr n return n 查看 C 14 中的 7 1 5 3 我们
  • 来自现有 SQLite 数据库的 Core Data 数据架构

    是否可以从现有的 SQLite 数据库文件生成 xcdatamodel CoreData 数据模型 我开发了一个 SQLite 数据库并针对它编写了一个 Java API 现在 我需要为同一个数据库 文件 编写等效的 iOS API 我不想
  • 安装 Eclipse IDE 时出错

    我正在尝试安装 eclipse IDE Java for Developers 但在安装过程中遇到以下错误 我的系统驱动器有足够的空间 过去我已经安装和卸载了 eclipse IDE 那么这会给我重新安装带来任何问题吗 10 50 59 E
  • 管道作业 - 向上游传递参数?

    TL DR 显然 在 Jenkins 管道作业中 您可以轻松地将参数传递给下游 我想知道的是你能否通过它们upstream 使用案例 我们有三份工作 job one job two and job three 这些通常单独运行 因为只需要一
  • iPhone - 以编程方式删除状态栏

    我制作了一个应用程序来实现 iPhone 的相机 当用户完成选择图像后 状态栏会重新出现 如何确保状态栏保持隐藏状态 这是我的代码 IBAction pickImage id sender UIImagePickerController p
  • Firebase 存储安全规则

    我刚刚开始使用 Firebase 并且能够读取 写入 编辑 删除数据库 在我的应用程序中 我仅向用户显示数据 如果他 她有权访问数据 我通过创建一个用户节点和另一个节点 称为服务 并引用该用户子节点中的服务来做到这一点 我以前从未使用过 F
  • 如何在express router中使用body-parser?

    我有一个具有对象的 post api 但我无法在控制台中打印它的抛出未定义我以为我缺少主体解析器 但在添加主体解析器后我看到错误body parser deprecated bodyParser use individual json ur
  • 当 SQL 数据库添加新行而不进行轮询时,C# Azure 函数触发

    有没有一种方法可以在每次将新数据库行添加到 SQL azure 数据库时调用 Azure 函数 理想情况下没有任何基于计时器的轮询 我知道这可以在 blob 存储上完成 但没有找到在 Azure 函数上执行此操作的方法 提前致谢 Funct
  • 未命名命名空间访问规则

    我正在查看部分7 3 1 1在 C 03 标准中 期望找到未命名命名空间中定义的项的访问规则的一些描述 对于未命名的命名空间 规则似乎有点不同 因为您无法完全限定对其中的项目的访问权限 我知道至少在同一个翻译单元中 人们可以访问未命名名称空
  • 无法在带有 glassfish 服务器的 ubuntu 上使用 intelliJ 在调试模式下运行 Web 应用程序

    在 ubuntu 12 04 上的 intelliJ 12 0 和 glassfish 3 1 2 2 中 我尝试在调试模式下启动我的 Web 应用程序 但收到以下错误消息 Error starting domain domain1 The
  • 在 Ruby/Rails 中读取远程 MP3 文件的 ID3 标签?

    使用 Ruby 如何解析远程 mp3 文件的 ID3 标签而不将整个文件下载到磁盘 这个问题已经被问到Java and 银光 但没有红宝石 Edit 查看 Java 答案 似乎可以 HTTP 支持 仅下载文件的尾部 即标签所在的位置 这可以
  • Apache Camel MDC 从 Body 添加字段

    我正在使用 apache Camel 并希望使用 MDC 将某些键添加到我的日志中 我通过官方Camel MDC 日志记录文档这非常棒 我可以毫不费力地记录我的routeId 我还需要添加来自骆驼身体的字段 最坏的情况是我可以在所有路由中手
  • @ViewScoped 托管 bean 在回发期间加载多次

    我在 jsf Facelet 上有一个日历 编辑器 文件上传和 dataTable primefaces 控件 代码如下