2014-04-03 4 views
0

저는이 작은 프로젝트에서 서블릿을 시작 했으므로 부드럽게 작성하십시오. 내가 사용하는 백그라운드에서 몇 가지 JS와 정적 HTML을 가지고 :서블릿이 잘못된 응답을 반환합니다.

var xmlhttpRequest = new XMLHttpRequest(); 
xmlhttpRequest.onreadystatechange = function(){ 
      if (xmlhttpRequest.readyState==4){ 
       if (xmlhttpRequest.status == 200){ 
        var rString = xmlhttpRequest.responseText; 
        alert(rString); 
       } 
      } 
    } 

와 JS 서블릿 호출 : 좋은

xmlhttpRequest.open("POST", "ServletBase", true); 
xmlhttpRequest.send(this.someString); 

모든; 서블릿에서 processResponse에 내가 요청 문자열을 얻을 무효화 및 자바 클래스 호출 ACB 해당 문자열을 전달 : 이제

response.setContentType("text/html;charset=UTF-8"); 
int requestLength = request.getContentLength(); 
PrintWriter pWriter = response.getWriter(); 
if(requestLength>1){ 
    String inputString = /* i get the string */; 
    this.ACB.processPageCommand(inputString,pWriter); 
}else{pWriter.write("NULL");} 

의 ACB 클래스는 연결된 ArduinoBoard으로 inputString을 처리하고 통신하는 작업이다 COM3에 있으며 SerialPortEventListener을 구현합니다.

this.pWriter.write(responseString); 

이 문제는 JS에서 내가 잘못된 데이터를 수신되는 : 이런 일 후, 나는 다시 (String로서 때로는 단순한 문자열, 때로는 JSON 객체) 물건을 작성하는 ACB의 pWriter를 사용 . 예를 들어, ACB에서 32 번 핀을 HIGH로 설정하고 JSON {"pin":"32","state":"1"}을 다시 작성하려고합니다. 나는 빈 응답을 받는다 (보드상의 핀은 올바르게 설정되어있다). 같은 핀을 LOW로 설정하면 {"pin":"32","state":"0"}을 얻어야하지만 이제는 첫 번째 응답이 {"pin":"32","state":"1"} (보드의 핀이 올바르게 설정 됨)이됩니다.

바로 전에 내가 이고 responseString이 무엇인지 알아야합니다. ArduinoBoard가 좋은 데이터를 반환하고 처리가 잘되었음을 의미하지만 JS에서는 '이전 데이터'를 얻습니다.

나는 그것이 사소한 것이 겠지만 서블릿 지식에 대한 나의 부족으로 인해 주위를 둘러 볼 수는 없다. 또한, 긴 게시물에 대한 미안 : D

답변

0

브라우저가 응답을 캐싱 중입니다. 서블릿에 데이터를 리턴하는 no-cache 헤더를 설정하십시오.

response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"); 
response.setHeader("Pragma","no-cache"); 

IE가 Ajax를 통해받은 응답을 캐시하려고 시도하기 때문에 대부분의 브라우저에서는 문제가 해결되지만 IE에서는 해결되지 않을 수 있습니다. 이 문제를 해결하려면 타임 스탬프 나 난수 인 Ajax POST에 매개 변수를 추가해야합니다. IE를 속여서 제대로 작동하도록이 매개 변수를 보내면됩니다 (이것이 고유 한 요청임을 분명히함으로써). 서블릿 끝에서 매개 변수를 읽을 필요는 없습니다.

+0

내가 setHeader을 시도하고 통과 않았다 각 POST에 고유 번호가 있지만 동일한 문제점이 발생합니다. 이제 나는 그것이 POST 처리의 본질과 관련이 있다는 것을 믿습니다.일부 POST는 외부 하드웨어 (ArduinoBoard)에서 처리 할 필요가 없으며 정상적으로 돌아가지만 프로그램이 외부 하드웨어에서 SerialPortEventListener를 사용하여 확인을 기다리는 일부 명령이 있습니다. 이 클래스에서는 PrintWriter를 전역 변수로 사용하고 보드에서 일부 데이터를 반환 할 때만 JS에 다시 쓸 수 있습니다. 서블릿이 그렇게 오래 기다리지 않을 수 있습니까? – larsonvonh

+0

그게 무슨 일이 일어날 수 있습니다 : 코드는 외부 하드웨어가 데이터를 보낼 때 응답 문자열을 생성하고 다음에 명령을 보낼 때 서블릿은 응답 문자열이 synchronized void serialEvent에서 생성되기 때문에 이전 응답을 반환합니다 SerialPortEventListener의 SerialPortEvent oEvent); PrintWriter는이 클래스에서 전역 적입니다. – larsonvonh

+0

내가 충분히 높은 평판을 가지고 있지 않기 때문에 나는 당신의 제안을 업 그레 이드 할 수 없다. 그러나 나는 캐싱에 대해 생각하게 해준 것에 감사한다 : D – larsonvonh

0

그래, 난 (하지 않았다 테스트가 모든 요청에) 지금은 메이크업-DO 솔루션이 있습니다

나는 외부 하드웨어 처리를 필요로하는 요청을 보내면

, 나는 보통의 PrintWriter 이후 빈 응답을 얻을. 쓰기 (응답 문자열)는 SerialPortEventListenersynchronized void serialEvent(SerialPortEvent oEvent)에 있습니다. JS 측에서는 예상 가능한 반환 데이터를 확인하고, 의미있는 응답을 얻을 때까지 빈 요청 (즉, 의미있는 요청을 보내기 전에)을 보내기 시작합니다. 즉 emtpy 이후의 다음 응답입니다. .

나는 대답으로이 플래그 내가해야한다면 내가 모든 명령과 요청 - 응답 조합에서 테스트하지 않았기 때문에, 알고 있지만하지 않는 시간에 .....

관련 문제