如何在JSF 2中有条件地从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页面我有愚蠢的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>
在我的bean中,我有以下三种方法的代码:
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()。单击“上传”按钮,如果该编码为真,则调用该按钮,这就是我想要的。然后应该调用
该工作并调出confirm()框,但是从未调用过,因此我的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; }
}
}
最后将测试标志“overwrite”以确定它是否为真。
使用各种打印语句我检查这是否有效。但是,代码在遇到语句后不会继续执行:RequestContext.getCurrentInstance()。execute(“popupConfirm()”);无论我是否在对话框中输入“确定”或“取消”,这就是我想要它做的事情。看起来好像需要某种类型的回调,并且最欣赏一些想法。
答案 0 :(得分:2)
根据您的标记,您正在使用PrimeFaces,因此当浏览器完成处理服务器响应时,有一种简单的方法可以从服务器端事件管理bean方法调用javascript函数。 PrimeFaces为您提供了一个名为RequestContext
的实用程序类。
public void doActionListenerMethod() {
if (!isValid()) {
RequestContext.getCurrentInstance().execute("MyJSObject.doClientSideStuff()");
}
}
当JSF在客户端上完成渲染时,以下将作为Javascript执行字符串参数。