繁体   English   中英

JSP-如何仅在Action完成执行后才调用Servlet?

[英]JSP - How to call Servlet only after Action finishes executing?

好的,我有一个JSP,一个Servlet和一个Action类。 JSP有一个“下载”按钮,单击该按钮可以调用两个函数-“ build()”和“ download()”。 “ build()”函数执行一个动作。 该操作将在服务器上创建并生成文件。 “ download()”用于使用servlet从服务器获取文件,以便用户下载。

  Action.java
    -----------
    buildFile() { 
    //build file/writes in the file
    }

    Servlet.java
    -----------
    doget(){
    //gets the file from the server
    }

    JSP
    ---
    <script type="text/javascript">
    function build() {
    //calls buildFile();
    //form.submit();
}

function download() {
window.open('/Servlet');
}
</script>

<input type="button" class="button" value="Download" onclick="build();download();"/>

现在的问题是,每当我单击“下载”时,在build()之后立即将download()称为。 因此,如果文件中的数据较少,则构建过程将完成,并且用户可以下载文件。 但是,如果要写入文件的数据很大,则在“ build()”之后仍会立即将download()称为IMMEDIATELY,并且用户只能在其下载的文件中获得部分数据(因为该文件仍在后台构建)。 我想做一些事情,使download()等待Action(buildFile())完成执行。 同样,如果没有form.submit(),则由于某种原因不会调用该动作。 这就是为什么我不能使用“ document.ready”或“ window.onLoad”的原因。 因此,请提出其他建议。 我也尝试过这个:

function build() {
        //calls buildFile();
        //form.submit();
download();
    }

    function download() {
    window.open('/Servlet');
    }
<input type="button" class="button" value="Download" onclick="build();"/>

但这不起作用。

与其直接调用两个javascript方法build()和download(),不如使用直接的HTML表单提交到同时生成和下载文件的servlet。

 <form action='/Servlet' method='post' target='_blank'>
   <input type='hidden' name='param_needed_to_build_file' value='something' />
   <input type="submit" class="button" value="Download" />
 </form>

target ='_ blank'使它打开一个新窗口。 如果需要,也可以使用method ='get'。 如果需要,您仍然可以使用javascript在另一个窗口中弹出servlet,但是构建和下载都应在servlet中。

在您的Servlet中,实现doGet和/或doPost方法来调用Java函数build()和download(),这两个函数都将在您的Servlet中。 或者,您可以将build()方法放在servlet中引用和利用的另一个类中。

实际上,通常的做法是构建文件,然后将其直接写到响应对象中,而不是先写到文件系统中,然后再读取它(除非您出于某种原因以后要保存文件)。

我找到了解决方案。 我只调用build(),然后在操作类的build方法的结尾,我就在servlet中调用了doget()方法。

 Action.java
    -----------
    buildFile() { 
    //build file/writes in the file
      Servlet servlet = new Servlet();
      servlet.doget();
    }

    Servlet.java
    -----------
    doget(){
    //gets the file from the server
    }  

<input type="button" class="button" value="Download" onclick="build();"/>

这将构建我的文件,无论花费多长时间,然后都会向用户弹出下载框。

您的按钮说明了一切。 您希望用户按下“下载”按钮并获取文件。 但是必须先构造文件才能提取文件。

这告诉您需要做两件事; 构建,然后下载。

onclick="buildAndDownload();"

function buildAndDownload(){
    // build file
    // start the download
 }

您甚至可以将这两个动作的逻辑分为两个单独的方法。

下载功能所需要的是一种查询服务器文件是否准备就绪的方法。

function download (){
     while(! fileIsReady()){
           Thread.sleep(500);
       }
       // Start the download
}

当然,如果您知道文件始终在x毫秒后就可以下载了,并且不想构建更多的服务器端功能,则可以调用“ Thread.sleep(1500);”。 等待1.5秒,然后再开始下载。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM