栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

AJAX(原型/ java)在执行期间获取部分状态更新

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

AJAX(原型/ java)在执行期间获取部分状态更新

如果您要运行和控制一个长时间运行的流程,最好让它自己运行

Thread
而不是运行请求
Thread
Thread
在会话范围内存储对此的引用,以便客户端可以使用ajaxical请求(使用相同的会话!)向服务器端请求当前进度(并自动地使会话保持活动状态,以使其不会超时)

这是这种servlet的基本示例:

package mypackage;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class RunLongProcessServlet extends HttpServlet {    protected void doGet(HttpServletRequest request, HttpServletResponse response)        throws ServletException, IOException    {        if ("XMLHttpRequest".equals(request.getHeader("x-requested-with"))) { LongProcess longProcess = (LongProcess) request.getSession().getAttribute("longProcess"); response.setContentType("application/json"); response.getWriter().write(String.valueOf(longProcess.getProgress()));        } else { request.getRequestDispatcher("runLongProcess.jsp").forward(request, response);        }    }    protected void doPost(HttpServletRequest request, HttpServletResponse response)        throws ServletException, IOException    {        LongProcess longProcess = new LongProcess();        longProcess.setDaemon(true);        longProcess.start();        request.getSession().setAttribute("longProcess", longProcess);        request.getRequestDispatcher("runLongProcess.jsp").forward(request, response);    }}class LongProcess extends Thread {    private int progress;    public void run() {        while (progress < 100) { try { sleep(1000); } catch (InterruptedException ignore) {} progress++;        }    }    public int getProgress() {        return progress;    }}

..其映射如下:

<servlet>    <servlet-name>runLongProcess</servlet-name>    <servlet-class>mypackage.RunLongProcessServlet</servlet-class></servlet><servlet-mapping>    <servlet-name>runLongProcess</servlet-name>    <url-pattern>/runLongProcess</url-pattern></servlet-mapping>

这是JSP的一个基本示例(带有一点点的jQuery和我推荐的ajaxical JS框架):

<!doctype html><html lang="en">    <head>        <title>Show progress of long running process with help of Thread and Ajax.</title>        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>        <script type="text/javascript"> $(document).ready(init); function init() {     if (${not empty longProcess}) {         $.progress = 0;         checkProgress();     } } function checkProgress() {     $.getJSON('runLongProcess', function(progress) {         $('#progress').text(progress);         $.progress = parseInt(progress);     });     if ($.progress < 100) {         setTimeout(checkProgress, 1000);     } }        </script>    </head>    <body>        <form action="runLongProcess" method="post"> <p>Run long process: <input type="submit"></p> <p>Current status: <span id="progress">0</span>%</p>        </form>    </body></html>

在http:// localhost:8080 / yourcontext /
runLongProcess中
打开它,然后单击按钮。

如果这是一个非常非常长的运行过程,则可以通过将ajax请求间隔

setTimeout()
增加到5秒(5000毫秒)左右来提高“效率”,这样服务器就不会感觉得到DDOS了;)

希望这可以帮助。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/446287.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号