如何從JSF 2中的bean有條件地調用JavaScript?有條件地從bean調用JavaScript
我有一個使用PrimeFaces上傳用戶文件到特定文件夾的類,但是如果用戶試圖上傳一個與已經存在的文件同名的文件,我希望JavaScript在這種情況下打開一個請求用戶是否要覆蓋舊文件或取消操作。如果不存在具有該名稱的文件,則不調用JavaScript。
我知道如何測試一個文件夾中有一個特定的文件,這只是我需要知道如何有條件地調用JavaScript。
我很感激任何意見。
我看過variopus資源在線,但仍然無法讓應用程序正常工作。基本上,這是我做了什麼,在包括XHTML頁面我對文件上傳下面的代碼:
<p:fileUpload id="fileUpload" fileUploadListener="#{filters.upload}"
allowTypes="#{filters.uploadTypes}" invalidFileMessage="#{filters.uploadBadType}"
sizeLimit="#{filters.uploadSize}" invalidSizeMessag="#{filters.uploadBadSize}"
update="fileUpload fileTable uploadMessage" description="Select Text File"
disabled="#{filters.disableFileUploadButton}"/>
<!--- Then further in the same file is this: -->
<p:remoteCommand name="remoteCommandOverwrite" actionListender="#{filters.execOverwrite}"/>
父XHTML頁面,其中包括上面我有foolowing的JavaScript:
<script type="text/javascript">
function popupConfirm() {
var overwrite = confirm('Warning: This will overwrite the existing file - Do you confirm this?');
if (overwrite) remoteCommandOverwrite([{name: overwrite, value: true}]);
}
</script>
在我的豆我有三個方法如下代碼:
public void upload(FileUploadEvent event) {
FacesMessage msg = new FacesMessage("Success! ", event.getFile().getFileName() + " is uploaded.");
FacesContext.getCurrentInstance().addMessage(null, msg);
overwrite = false;
// Do what you want with the file
try {
copyFile(event.getFile().getFileName(), event.getFile().getInputstream());
} catch (IOException e) {
e.printStackTrace();
}
}
public void copyFile(String fileName, InputStream in) {
// Initialization etc.
File file = new File(uploadFull + fileName);
if (file.exists()) {
RequestContext.getCurrentInstance().execute("popupConfirm()");
// Then test to see if overwrite is true or false, and act accordingly
}
// Then I am supposed to get the value of overwrite here:
public void execOverwrite() {
System.out.println("### execOverwrite() ###");
FacesContext context = FacesContext.getCurrentInstance();
Map<String, String> map = context.getExternalContext().getRequestParameterMap();
String soverwrite = (String) map.get("overwrite");
if (soverwrite.equals("true")) {
overwrite = true;
System.out.println("overwrite: true");
}
}
我所試圖做的是首先要有條件地調用JavaScript函數popupConfirm()。點擊「上傳」按鈕,如果密碼是真的,這是我想要的。然後這應該叫
這工作,並帶來了確認()框,但永遠不會被調用,所以我的bean中的方法execOverwrite()也永遠不會被調用,我不能拿起返回值和將它傳遞給方法copyFile()內的代碼。出了什麼問題?
我把這個問題擱置了一個星期,剛回到它。我得到它的工作,並可以將值傳回給bean,但不知何故,我需要從調用JavaScript的地方恢復執行。
要sumarize,我的JavaScript包含以下代碼:
<script type="text/javascript">
function popupConfirm() {
var overwrite = confirm('Warning: This will overwrite the existing file - Do you confirm this?');
if (overwrite) remoteCommandOverwrite([{name: 'overwrite', value: 'true'}]);
}
</script>
而在XHTML代碼我有:
<p:fileUpload id="fileUpload" fileUploadListener="#{filters.upload}" ...../>
<!-- Other code -->
<p:remoteCommand name="remoteCommandOverwrite" actionListener="#{filters.execOverwrite}"/>
然後在單擊單擊選擇文件按鈕後,該文件的上傳按鈕,執行上面列出的JavaScript中的代碼:
RequestContext.getCurrentInstance().execute("popupConfirm()");
然後點擊在該對話框的「確定」,在同一個bean這種方法稱爲:
public void execOverwrite() {
FacesContext context = FacesContext.getCurrentInstance();
Map<String, String> map = context.getExternalContext().getRequestParameterMap();
String soverwrite = map.get("overwrite");
if (soverwrite.equals("true")) {
overwrite = true; }
}
}
該標誌「覆蓋」最終會被測試,看它是否是真實的。
使用各種打印語句我檢查這是否有效。但是,在遇到以下語句後,代碼不會繼續執行:RequestContext.getCurrentInstance()。執行( 「popupConfirm()」);不管我是否在對話框中輸入「確定」或「取消」,這正是我想要的。它看起來好像需要某種類型的回調,並且會很欣賞一些想法。
我有與Primefaces 5.1和JSF 2.2.6相同的問題。 。你有解決方案嗎? – Marin 2014-11-26 15:51:11