2010-03-14 4 views
0

웹 서비스를 사용하는 jsp 클라이언트가 있습니다. 클라이언트의 문제는 웹 서비스를 호출하고 결과를 검색 할 때마다 결과를 이전 호출의 결과에 추가하고 표시 할 때마다 발생합니다. 그러나 war 파일을 재배포하면 결과가 정상적으로 나타납니다. (비록 처음으로)jsp 클라이언트가 결과를 계속해서 추가하고 표시합니다.

다음은 import 문이없는 코드입니다.

<html> 
    <body> 
     <%! public static Reader fr; %> 
     <%! public static StringBuffer sb; %> 
     <%! private static final int BLKSIZ = 8192; %> 
     <%! public static String file, output; %> 


     <% 

     FileparserService service = new FileparserService(); 
     Fileparser port = service.getFileparserPort(); 

     sb = new StringBuffer(); 
     char[] b = new char[BLKSIZ]; 
     int n; 

     try { 
      fr = new FileReader(<file>); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 

     while ((n = fr.read(b)) > 0) 
      sb.append(b, 0, n); 

     file = sb.toString(); 

     output = port.getRanks(file); 


     %> 
     The final output is <br/> 
      <%out.print(output); %> 
    </body> 
    <% fr.close(); %> 
</html> 

감사합니다. Deepak.

+0

코드를 게시하십시오 (JSP). 문제를 찾는데 도움이 될 것입니다. 하지만 JSP에서 웹 서비스 호출? –

+0

안녕하세요, 코드를 게시했습니다. 그래, 나는 JSP로 SOAP 기반의 WS를 소비하고있다. – Deepak

답변

1

첫째 :

<% (all raw java code) %> 

이 나쁜 방법입니다. 그것은 실제 Java 클래스에 속합니다. JSP는 HTML/CSS/JS 용 템플리트와 기능 제어 페이지 플로우를 제공하고 태그 라이브러리를 사용하여 백엔드 Java 코드와 상호 작용하고 EL을 사용하여 백엔드 데이터에 액세스하는보기 기술입니다. 이 특정 코드는 extends HttpServlet 클래스에서 직접 수행해야합니다.

문제로 돌아 가기 : JSP 페이지에서 정적 변수를 선언했는데 (이 중 하나만 이고 webApp의 수명 기간 중 하나는입니다!) 모든 요청에 ​​대해 인스턴스를 모두 다시 설정합니다. 명백한 스레드 안전 문제는 제쳐두고 정적 변수에도 불구하고 문제의 근본 원인은 게시 된 코드에 없습니다.

output = port.getRanks(file); 

getRanks() 방법은 FileParser 클래스의 정적 변수로 무언가를하지 않는다 : 의심스러운있는 유일한 방법은 다음 줄입니까? JSP의 코딩 스타일/접근 방식을 살펴보면 큰 기회입니다. 어쩌면 메서드를 다시 인스턴스화하지 않고 매번 정적 변수에 값을 추가하는 것입니다 (또는 메서드 블록 내에서 threadlocal을 선언하고 반환하는 것없이). 그것은 당신이 직면하고있는 문제를 설명 할 것입니다.

+0

@BalusC - 문제를 해결할 수있었습니다. 문제는 내가 결코 Fileparser의 객체를 사용하지 않았기 때문에 결코 호출되지 않은 생성자 안에 Fileparser 클래스의 모든 변수를 초기화했습니다. 초기화 부분을 getRanks() 메소드 내부로 옮겼는데 이제는 정상적으로 작동합니다. 귀하의 의견을 주셔서 감사합니다. – Deepak

관련 문제