sitelink1 http://www.java-forums.org/advanced-java...-ajax.html 
sitelink2  
sitelink3  
sitelink4 http://1 
extra_vars4 ko 
extra_vars5  
extra_vars6 sitelink1 

Question : flush data from servlet to jsp with ajax

I've a servlet that process a file and reports the number of line which has processed. In the other side, I have a JSP, wit a div. This jsp uses Ajax to call the servlet.

The intended result, is that Ajax receives all the out.print of the Servlet and with javascript update an html table in the jsp.

I've been able to update the table and all that, but only after the servlet finish, all the lines that is printing, are not received in the ajax (or printed in the page) until this servlet finishes.

I understand that Ajax can monitor the status of the servlet, and as I can see, it finishes when status is 4 (completed) and result is 200 (OK). I'm sending from the servlet the out.print("text"), but as I said, the jsp process it when both 4 state and 200 status are received, nothing is received while the servlet is processing.

Can you help me with this please?

These are some code snippets:
Ajax

Java Code:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

var dinformacion = document.getElementById("informacion");

            var isIE;

            function XMLHttp(url) {

                return XMLHttp(url, null);

            }

            function XMLHttp(url, callback, callbackprocess) {

                var req = init();

                req.onreadystatechange = processRequest;

                function init() {

                    if (window.XMLHttpRequest) {

                        return new XMLHttpRequest();

                    } else {

                        if (window.ActiveXObject) {

                            isIE = true;

                            return new ActiveXObject("Microsoft.XMLHTTP");

                        }

                    }

                }

                function processRequest() {

                    //dinformacion.innerHTML = req.readyState + "/" + req.status;

                 

                    if ((req.readyState == 4) && (req.status == 200) && (callback)) {

                        var a = req;

                        callback(req.responseText);

                    }

                    else {

                        //HERE IT FAILS ALL THE TIME

                        callbackprocess(req.responseText);

                    }

                }

                this.doGet = function () {

                    req.open("GET", url, true);

                    req.send(null);

                };

                this.doPost = function (body) {

                    req.open("POST", url, true);

                    req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

                    req.send(body);

                };

            }

            function getElementY(element) {

                var targetTop = 0;

                if (element.offsetParent) {

                    while (element.offsetParent) {

                        targetTop += element.offsetTop;

                        element = element.offsetParent;

                    }

                } else {

                    if (element.y) {

                        targetTop += element.y;

                    }

                }

                return targetTop;

            }

 

 

         

            var req = new XMLHttp("../servlet/ConsultaServlet",onServerResponse,onServerProcess);

            req.doPost();

             

            function onServerResponse(responseXML){

                responseXML = trim(responseXML);

                alert(responseXML);

            }

            var dproc = document.getElementById("process");

             

            function onServerProcess(responseXML){

                responseXML = trim(responseXML);

                dproc.innerHTML = responseXML;

                 

            }

And my servlet snippet:

Java Code:

1

2

3

4

5

6

7

...

for(int i=1;i<20;i++){

                 

                out.print(i);

                out.flush();

            }  

...

 

 

 

 

Answer : Reply t flush data from servlet to jsp with ajax

I think you yourself gave the answer to it....
 

I understand that Ajax can monitor the status of the servlet, and as I can see, it finishes when status is 4 (completed) and result is 200 (OK). I'm sending from the servlet the out.print("text"), but as I said, the jsp process it when both 4 state and 200 status are received, nothing is received while the servlet is processing.

You don't receive the XmlHttpRequest object and so the responseText until the servlet you're calling via AJAX completes its execution! You might get a better view of it if u put a Thread.sleep(2000)....i.e., a delay of 2secs in your "for" loop
 

Java Code:

1

2

3

4

5

6

for(int i=1;i<20;i++){

                 

                out.print(i);

                out.flush();

                                Thread.sleep(2000);

            }

So, you cannot get any responseText while the servlet is processing. To achieve something like this, people tend to use a 'server push' method. You might like to see topics like 'Comet' also called Reverse Ajax, pushlets to get responses from the servlet to the client and u can use them your own way to achieve your goal!

good luck!! :)