我是一名tomcat / servlet新手,在过去的3/4天里一直坚持这一点。任何帮助表示赞赏! 我有一个servlet类,它有一个静态变量name_print。静态函数appInput接受一个字符串并将name_print设置为该字符串。这个类的代码appmonitor.java如下:
包AppMonitor_pack;
导入声明......
private static String name_print;
public app_monitor() {
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static void main(String[] args) {
// TOsDO Auto-generated method stub
}
public static void appInput (String name){
name_print = name;
System.out.println("From appInput " + name_print);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.println("<body> "+ name_print +" </body>");
}
}
我已将此简单项目包含在另一个名为Sockets的项目中。在那里,我有一个Listening套接字,它接收一个名为name的字符串。我调用第一个项目的静态函数appInput并将收到的字符串名称传递给它,以便将name_print设置为这个新值。
Socket.java中的相关行是: app_monitor.appInput(名称);
当我编译并运行它时,我看到值名称被设置为某个输入值“abc”。然后调试器进入另一个项目的appInput函数,并将name_print的值也设置为“abc”。
但是当我刷新运行tomcat服务器的网页时,它永远不会显示新设置的name_print值,但会继续显示appMonitor servlet类第一次加载时设置的旧值“null”。
我试图找出这个问题4天无济于事。任何想法/帮助? 谢谢!
答案 0 :(得分:1)
当我编译并运行它时,我看到值名称被设置为某个输入值“abc”。然后调试器进入另一个项目的appInput函数,并将name_print的值也设置为“abc”。
听起来你是在与Tomcat分开运行它。这意味着你不只是有两个不同的类加载器 - 你有两个完全独立的JVM,恰好在同一台计算机上运行。静态变量不会在这些进程之间共享。
您想要实现的目标并不是很清楚,但如果您希望在一个单独的流程中提供来自一个流程的信息,您将需要使用一些跨流程通信,或者共享更全面的内容而不仅仅是一个静态变量 - 例如将数据写入一个进程中的文件,然后从另一个进程中的文件中读取它。