gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:45:13 26 4
gpt4 key购买 nike

我在 jsf facelet 上有一个日历、编辑器、fileUpload 和一个 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) 没有得到更新。

最佳答案

看起来很像 issue 1492 .这是相关性的引用:

This is a chicken/egg issue with partial state saving. The view is executed to populate the view before delta state is applied, so we see the behavior you've described.

At this point, I don't see a clear way to resolve this use case.

The workaround, if you must use view-scoped bindings would be setting javax.faces.PARTIAL_STATE_SAVING to false.



可能 Primefaces 将上传的文件与 View 隐式绑定(bind),您需要将以下内容添加到 web.xml :
<context-param>
<param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
<param-value>false</param-value>
</context-param>

试一试,看看是否有帮助。如果它有效,您可能需要考虑仅对特定 View 关闭是否关闭。全局关闭部分状态保存将显着增加内存和/或带宽使用量,具体取决于状态保存方法。假设 View ID 为 /upload.xhtml , 用这个:
<context-param>
<param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name>
<param-value>/upload.xhtml</param-value>
</context-param>

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

关于jsf - @ViewScoped 托管 bean 在回发期间多次加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3256142/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com