2010-03-14 32 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