2010-03-14 34 views
0

我有這個消費web服務的jsp客戶端。客戶端的問題在於,無論何時調用webservice並檢索結果,它都會將結果附加到前一個調用的結果並顯示它。但是,如果我重新部署戰爭文件,結果顯示罰款。 (僅限第一次)jsp客戶端不斷附加結果並顯示它

這是沒有導入語句的代碼。

<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調用Web服務? – 2010-03-14 01:11:09

+0

嗨,我發佈的代碼。是的,我正在使用jsp來使用基於SOAP的WS。 – Deepak 2010-03-14 01:18:11

回答

1

第一:

<% (all raw java code) %> 

這是不好的做法。它屬於一個真正的Java類。 JSP是一種視圖技術,它爲HTML/CSS/JS提供模板,並能夠控制頁面流,並使用taglibs與後端Java代碼交互,並使用EL訪問後端數據。這個特殊的代碼需要直接在extends HttpServlet的類中完成。

回到您的問題:儘管您在JSP頁面(其中只有一個實例期間在webapp的一生中聲明瞭靜態變量!!),您可以在每個請求中重新實例化它們。除了明顯的線程安全問題之外,儘管存在靜態變量,但問題的根本原因不在發佈的代碼中。這看起來很可疑的唯一事情是以下行:

output = port.getRanks(file); 

不將該getRanks()方法做一些與FileParser類的靜態變量?當我查看JSP的編碼風格/方法時,這個機會很大。也許該方法每次將值附加到靜態變量而不重新實例化(或者更好,無需在方法塊中聲明threadlocal)然後返回它?這將解釋你面臨的問題。

+0

@BalusC - 我能夠糾正它。問題是我初始化Fileparser類中的所有變量,它從來沒有被調用,因爲我從來沒有使用Fileparser的對象。我將初始化部分移至getRanks()方法內部,現在它工作得很好。儘管感謝您的意見。 – Deepak 2010-03-16 13:55:07