почему оператор xmlhttp.onreadystatechange заставляет эту программу работать только один раз? - PullRequest
1 голос
/ 05 января 2012

я делаю простой потребитель веб-службы REST, используя HTML и javascript. вот код:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script language="javascript">
    var xmlhttp;

    function getdetails() {
        var empno = document.getElementById("empno");
        var url = "http://localhost:8080/TestWS1/rest/hello/" + empno.value;

        xmlhttp = new XMLHttpRequest(); //@slaks: i put it here

        xmlhttp.open('GET',url,true);
        xmlhttp.send(null);

        xmlhttp.onreadystatechange = function() {

               var empname =  document.getElementById("empname");
               var age =  document.getElementById("age");
               if (xmlhttp.readyState == 4) {
                    //alert(xmlhttp.status);
                  if ( xmlhttp.status == 200) {
                       var det = eval( "(" +  xmlhttp.responseText + ")");
                       if (det.age > 0 ) {
                          empname.value = det.name;
                          age.value = det.age;
                       }
                       else {
                           empname.value = "";
                           age.value ="";
                           alert("Invalid Employee ID");
                       }
                 }
                 else
                       alert("Error ->" + xmlhttp.responseText);
              }
        }
    }
  </script>
  </head>
  <body>
   <h1>Call Employee Service </h1>
   <table>
   <tr>
       <td>Enter Employee ID :  </td>
       <td><input type="text" id="empno" size="10"/>  <input type="button" value="Get Details" onclick="getdetails()"/>
   </tr>
   <tr>
       <td>Enter Name :  </td>
       <td><input type="text" readonly="true" id="empname" size="20"/> </td>
   </tr>

   <tr>
       <td>Employee Age : </td>
       <td><input type="text" readonly="true" id="age" size="10"/> </td>
   </tr>
   </table>
  </body>
</html>

этот код отображает имя и возраст сотрудника только из веб-службы REST в текстовом поле HTML при нажатии кнопки getDetail. параметр - номер сотрудника (empNo).

Основная проблема в том, почему этот код работает только один раз?

например, если я поместил 1 в текстовое поле empNo и нажал кнопку getDetail, только в первый раз, он будет отображать имя и возраст сотрудника на основе номера сотрудника, который был введен ранее. но для второго или третьего я нажимаю кнопку getDetail, она больше не работает. Я пытался дать предупреждение, чтобы помочь мне отладить этот код, но в результате xmlhttp.onreadystatechange = function () работает только один раз при первом нажатии кнопки getDetail.

кто-нибудь знает, как решить эту проблему ?? действительно застрял здесь .. большое спасибо за помощь ..

К вашему сведению: вот мой код веб-службы:

package com.webservices.TestWS1;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

//@Path("/hello")
@Path("/hello/{empno}")
public class Hello {        
    @GET   // this method process GET request from client
    @Produces("application/json")   // sends JSON
    public String getJson( @PathParam("empno") int empno) {  // empno represents the empno sent from client   
        switch(empno) {
          case 1 :
              return "{'name':'George Koch', 'age':58}";
          case 2:
              return "{'name':'Peter Norton', 'age':50}";
          default:
              return "{'name':'unknown', 'age':-1}";
      } // end of switch
   } // end of
}

Ответы [ 3 ]

2 голосов
/ 05 января 2012

Вы не можете повторно использовать XMLHttpRequest с.
Вам необходимо создать новый XMLHttpRequest для каждого запроса.

Избавиться от функции init().

1 голос
/ 05 января 2012

Поместите это между тегом script

function getdetails() {
        xmlhttp = new XMLHttpRequest();
        var empno = document.getElementById("empno");
        var url = "http://localhost:8080/TestWS1/rest/hello/" + empno.value;
        xmlhttp.open('GET',url,true);
        xmlhttp.send(null);
        xmlhttp.onreadystatechange = function() {

               var empname =  document.getElementById("empname");
               var age =  document.getElementById("age");
               if (xmlhttp.readyState == 4) {
                    //alert(xmlhttp.status);
                  if ( xmlhttp.status == 200) {
                       var det = eval( "(" +  xmlhttp.responseText + ")");
                       if (det.age > 0 ) {
                          empname.value = det.name;
                          age.value = det.age;
                       }
                       else {
                           empname.value = "";
                           age.value ="";
                           alert("Invalid Employee ID");
                       }
                 }
                 else
                       alert("Error ->" + xmlhttp.responseText);
              }
        }
    }
0 голосов
/ 25 мая 2015

Немного опоздал с этим ответом, но к кому это может относиться ...

Требуется назначить функцию обратного вызова, прежде чем отправлять запрос.Так и должно быть вот так

     var url = "http://localhost:8080/TestWS1/rest/hello/" + empno.value;
        xmlhttp.open('GET',url,true);
        xmlhttp.onreadystatechange = function() { 
          ... some code here
          }
        xmlhttp.send(null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...