jsp客户端会不断追加结果并显示它

时间:2010-03-14 01:06:16

标签: jsp

我有这个使用web服务的jsp客户端。客户端的问题是无论何时调用Web服务并检索结果,它都会将结果附加到上一个调用的结果并显示它。但是,如果我重新部署战争文件,结果似乎很好。 (虽然这是第一次)

这是没有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>

谢谢, 迪帕克。

1 个答案:

答案 0 :(得分:1)

首先:

<% (all raw java code) %>

这是不好的做法。它属于真正的Java类。 JSP是一种视图技术,为HTML / CSS / JS和能力控制页面流提供模板,并使用taglib与后端Java代码交互,并使用EL访问后端数据。这个特殊代码需要直接在extends HttpServlet

的类中完成

回到你的问题:虽然你在JSP页面中声明了静态变量(在webapp的生命周期中只有一个实例),但是你要在每次请求时重新实例化它们。除了明显的线程安全问题之外,问题的根本原因不在于发布的代码,尽管存在静态变量。唯一看起来可疑的是以下几行:

output = port.getRanks(file);

getRanks()方法不能对FileParser类的静态变量执行某些操作吗?当我查看JSP的编码风格/方法时,机会很大。也许该方法每次都将值附加到静态变量而不重新实例化(或更好,不仅仅在方法块中声明threadlocal)然后返回它?这可以解释你所面临的问题。