我写了一个web-project发布到TOMCAT上,运行很正常。
之后我加了一个按钮"计算器",会打开一个“计算器的程序”。当我关闭这个计算器时,tomcat的服务也关闭了。
这是为什么?
按钮到打开程序流程是这样的!
<intpu type="button" value="计算器">
用script进入servlet   :  window.location.href = "ajax/OpenCounter";
OpenCounter代码如下:
doPost(...){doGet(request,response);}
doGet(...){
  new Counter;    //就会打开一个“计算器的程序”  //user/login_ending.jsp    是这个按钮的页面,也就是原页面。
  request.getRequestDispatch(request.getContextPath()+"user/login_ending.jsp").forward(request,response);   
}
有什么方法可以让我关闭“计算器的程序”时,服务继续吗?

解决方案 »

  1.   

    计算器的代码不是我的!
    我贴出来看看!
    package com.cherry.utils;import java.awt.*;
    import java.awt.event.*;
    import java.lang.*;
    import javax.swing.*;public class Counter extends Frame {
    // 声明三个面板的布局
    GridLayout gl1, gl2, gl3; Panel p0, p1, p2, p3; JTextField tf1; TextField tf2; Button b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14,
    b15, b16, b17, b18, b19, b20, b21, b22, b23, b24, b25, b26; StringBuffer str;// 显示屏所显示的字符串 double x, y;// x和y都是运算数 int z;// Z表示单击了那一个运算符.0表示"+",1表示"-",2表示"*",3表示"/" static double m;// 记忆的数字 public Counter() {
    gl1 = new GridLayout(1, 4, 10, 0);// 实例化三个面板的布局
    gl2 = new GridLayout(4, 1, 0, 15);
    gl3 = new GridLayout(4, 5, 10, 15); tf1 = new JTextField(27);// 显示屏
    tf1.setHorizontalAlignment(JTextField.RIGHT);
    tf1.setEnabled(false);
    tf1.setText("0");
    tf2 = new TextField(10);// 显示记忆的索引值
    tf2.setEditable(false);
    // 实例化所有按钮、设置其前景色并注册监听器
    b0 = new Button("Backspace");
    b0.setForeground(Color.red);
    b0.addActionListener(new Bt());
    b1 = new Button("CE");
    b1.setForeground(Color.red);
    b1.addActionListener(new Bt());
    b2 = new Button("C");
    b2.setForeground(Color.red);
    b2.addActionListener(new Bt());
    b3 = new Button("MC");
    b3.setForeground(Color.red);
    b3.addActionListener(new Bt());
    b4 = new Button("MR");
    b4.setForeground(Color.red);
    b4.addActionListener(new Bt());
    b5 = new Button("MS");
    b5.setForeground(Color.red);
    b5.addActionListener(new Bt());
    b6 = new Button("M+");
    b6.setForeground(Color.red);
    b6.addActionListener(new Bt());
    b7 = new Button("7");
    b7.setForeground(Color.blue);
    b7.addActionListener(new Bt());
    b8 = new Button("8");
    b8.setForeground(Color.blue);
    b8.addActionListener(new Bt());
    b9 = new Button("9");
    b9.setForeground(Color.blue);
    b9.addActionListener(new Bt());
    b10 = new Button("/");
    b10.setForeground(Color.red);
    b10.addActionListener(new Bt());
    b11 = new Button("sqrt");
    b11.setForeground(Color.blue);
    b11.addActionListener(new Bt());
    b12 = new Button("4");
    b12.setForeground(Color.blue);
    b12.addActionListener(new Bt());
    b13 = new Button("5");
    b13.setForeground(Color.blue);
    b13.addActionListener(new Bt());
    b14 = new Button("6");
    b14.setForeground(Color.blue);
    b14.addActionListener(new Bt());
    b15 = new Button("*");
    b15.setForeground(Color.red);
    b15.addActionListener(new Bt());
    b16 = new Button("%");
    b16.setForeground(Color.blue);
    b16.addActionListener(new Bt());
    b17 = new Button("1");
    b17.setForeground(Color.blue);
    b17.addActionListener(new Bt());
    b18 = new Button("2");
    b18.setForeground(Color.blue);
    b18.addActionListener(new Bt());
    b19 = new Button("3");
    b19.setForeground(Color.blue);
    b19.addActionListener(new Bt());
    b20 = new Button("-");
    b20.setForeground(Color.red);
    b20.addActionListener(new Bt());
    b21 = new Button("1/X");
    b21.setForeground(Color.blue);
    b21.addActionListener(new Bt());
    b22 = new Button("0");
    b22.setForeground(Color.blue);
    b22.addActionListener(new Bt());
    b23 = new Button("+/-");
    b23.setForeground(Color.blue);
    b23.addActionListener(new Bt());
    b24 = new Button(".");
    b24.setForeground(Color.blue);
    b24.addActionListener(new Bt());
    b25 = new Button("+");
    b25.setForeground(Color.red);
    b25.addActionListener(new Bt());
    b26 = new Button("=");
    b26.setForeground(Color.red);
    b26.addActionListener(new Bt()); // 实例化四个面板
    p0 = new Panel();
    p1 = new Panel();
    p2 = new Panel();
    p3 = new Panel();
    // 创建一个空字符串缓冲区
    str = new StringBuffer(); // 添加面板p0中的组件和设置其在框架中的位置和大小
    p0.add(tf1);
    p0.setBounds(10, 25, 300, 40);
    // 添加面板p1中的组件和设置其在框架中的位置和大小
    p1.setLayout(gl1);
    p1.add(tf2);
    p1.add(b0);
    p1.add(b1);
    p1.add(b2);
    p1.setBounds(10, 65, 300, 25);
    // 添加面板p2中的组件并设置其的框架中的位置和大小
    p2.setLayout(gl2);
    p2.add(b3);
    p2.add(b4);
    p2.add(b5);
    p2.add(b6);
    p2.setBounds(10, 110, 40, 150);
    // 添加面板p3中的组件并设置其在框架中的位置和大小
    p3.setLayout(gl3);// 设置p3的布局
    p3.add(b7);
    p3.add(b8);
    p3.add(b9);
    p3.add(b10);
    p3.add(b11);
    p3.add(b12);
    p3.add(b13);
    p3.add(b14);
    p3.add(b15);
    p3.add(b16);
    p3.add(b17);
    p3.add(b18);
    p3.add(b19);
    p3.add(b20);
    p3.add(b21);
    p3.add(b22);
    p3.add(b23);
    p3.add(b24);
    p3.add(b25);
    p3.add(b26);
    p3.setBounds(60, 110, 250, 150);
    // 设置框架中的布局为空布局并添加4个面板
    setLayout(null);
    add(p0);
    add(p1);
    add(p2);
    add(p3);
    setResizable(false);// 禁止调整框架的大小
    // 匿名类关闭窗口
    addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e1) {
    System.exit(0);
    }
    });
    setBackground(Color.lightGray);
    setBounds(100, 100, 320, 280);
    setVisible(true); } // 构造监听器
    class Bt implements ActionListener {
    public void actionPerformed(ActionEvent e2) {
    try { if (e2.getSource() == b1)// 选择"CE"清零
    {
    tf1.setText("0");// 把显示屏清零
    str.setLength(0);// 清空字符串缓冲区以准备接收新的输入运算数
    } else if (e2.getSource() == b2)// 选择"C"清零
    {
    tf1.setText("0");// 把显示屏清零
    str.setLength(0);
    } else if (e2.getSource() == b23)// 单击"+/-"选择输入的运算数是正数还是负数
    {
    x = Double.parseDouble(tf1.getText().trim());
    tf1.setText("" + (-x));
    } else if (e2.getSource() == b25)// 单击加号按钮获得x的值和z的值并清空y的值
    {
    x = Double.parseDouble(tf1.getText().trim());
    str.setLength(0);// 清空缓冲区以便接收新的另一个运算数
    y = 0d;
    z = 0;
    } else if (e2.getSource() == b20)// 单击减号按钮获得x的值和z的值并清空y的值
    {
    x = Double.parseDouble(tf1.getText().trim());
    str.setLength(0);
    y = 0d;
    z = 1;
    } else if (e2.getSource() == b15)// 单击乘号按钮获得x的值和z的值并清空y的值
    {
    x = Double.parseDouble(tf1.getText().trim());
    str.setLength(0);
    y = 0d;
    z = 2;
    } else if (e2.getSource() == b10)// 单击除号按钮获得x的值和z的值并空y的值
    {
    x = Double.parseDouble(tf1.getText().trim());
    str.setLength(0);
    y = 0d;
    z = 3;
    } else if (e2.getSource() == b26)// 单击等号按钮输出计算结果
    {
    str.setLength(0);
    switch (z) {
    case 0:
    tf1.setText("" + (x + y));
    break;
    case 1:
    tf1.setText("" + (x - y));
    break;
    case 2:
    tf1.setText("" + (x * y));
    break;
    case 3:
    tf1.setText("" + (x / y));
    break;
    }
    } else if (e2.getSource() == b24)// 单击"."按钮输入小数
    {
    if (tf1.getText().trim().indexOf(".") != -1)// 判断字符串中是否已经包含了小数点
    { } else// 如果没数点有小
    {
    if (tf1.getText().trim().equals("0"))// 如果初时显示为0
    {
    str.setLength(0);
    tf1.setText((str
    .append("0" + e2.getActionCommand()))
    .toString());
    } else if (tf1.getText().trim().equals(""))// 如果初时显示为空则不做任何操作
    {
    } else {
    tf1.setText(str.append(e2.getActionCommand())
    .toString());
    }
    } y = 0d; } else if (e2.getSource() == b11)// 求平方根
    {
    x = Double.parseDouble(tf1.getText().trim());
    tf1.setText("数字格式异常");
    if (x < 0)
    tf1.setText("负数没有平方根");
    else
    tf1.setText("" + Math.sqrt(x));
    str.setLength(0);
    y = 0d;
    } else if (e2.getSource() == b16)// 单击了"%"按钮
    {
    x = Double.parseDouble(tf1.getText().trim());
    tf1.setText("" + (0.01 * x));
    str.setLength(0);
    y = 0d;
    } else if (e2.getSource() == b21)// 单击了"1/X"按钮
    { x = Double.parseDouble(tf1.getText().trim());
    if (x == 0) { tf1.setText("除数不能为零");
    } else {
    tf1.setText("" + (1 / x));
    }
    str.setLength(0);
    y = 0d;
    } else if (e2.getSource() == b3)// MC为清除内存
    {
    m = 0d;
    tf2.setText("");
    str.setLength(0);
    } else if (e2.getSource() == b4)// MR为重新调用存储的数据
    {
    if (tf2.getText().trim() != "")// 有记忆数字
    {
    tf1.setText("" + m);
    }
    } else if (e2.getSource() == b5)// MS为存储显示的数据
    { m = Double.parseDouble(tf1.getText().trim());
    tf2.setText("M");
    tf1.setText("0");
    str.setLength(0);
    } else if (e2.getSource() == b6)// M+为将显示的数字与已经存储的数据相加要查看新的数字单击MR
    {
    m = m + Double.parseDouble(tf1.getText().trim());
    } else// 选择的是其他的按钮
    {
    if (e2.getSource() == b22)// 如果选择的是"0"这个数字键
    {
    if (tf1.getText().trim().equals("0"))// 如果显示屏显示的为零不做操作
    { } else {
    tf1.setText(str.append(e2.getActionCommand())
    .toString());
    y = Double.parseDouble(tf1.getText().trim());
    }
    } else if (e2.getSource() == b0)// 选择的是“BackSpace”按钮
    {
    if (!tf1.getText().trim().equals("0"))// 如果显示屏显示的不是零
    {
    if (str.length() != 1) {
    tf1.setText(str.delete(str.length() - 1,
    str.length()).toString());// 可能抛出字符串越界异常
    } else {
    tf1.setText("0");
    str.setLength(0);
    }
    }
    y = Double.parseDouble(tf1.getText().trim());
    } else// 其他的数字键
    {
    tf1.setText(str.append(e2.getActionCommand())
    .toString());
    y = Double.parseDouble(tf1.getText().trim());
    }
    }
    } catch (NumberFormatException e) {
    tf1.setText("数字格式异常");
    } catch (StringIndexOutOfBoundsException e) {
    tf1.setText("字符串索引越界");
    }
    }
    }}
      

  2.   

    addWindowListener(new WindowAdapter() { 
    public void windowClosing(WindowEvent e1) { 
    System.exit(0); 

    }); 你这段中的System.exit(0); 这句就是退出虚拟机的。换一种其它方法吧。
    我现在是在网吧上的,那语句我记得不太清楚了,你上网去查一下看看。
      

  3.   

    我已经做了些修改了!
    // 匿名类关闭窗口 
    addWindowListener(new WindowAdapter() { 
    public void windowClosing(WindowEvent e1) { 
    System.exit(0); 

    }); 改后:// 匿名类关闭窗口 
    addWindowListener(new WindowAdapter() { 
    public void windowClosing(WindowEvent e1) { 
    Frame   f   =   (Frame)   (e1.getSource());   
    f.show(false);

    }); 这样后,关闭计算器不会停掉虚拟机了。不过我有个疑问:f.show(false);这个方法会不会导致内存溢出啊?
    因为每次点“计算器”都会new Counter();产生一个新的,但f.show(false);好像没有清除内存中,是不?N次后会不会溢出呢?如果会的话,有什么好的解决方法!
      

  4.   

    这样,按钮里面给个onClick ,关键看你基于什么技术实现。你可以给个onClick属性,在页面上面定义函数,调用方法。或者给input一个ID,在servlet中根据ID来给按钮添加事件,你的那种进入方式,估计关联到了最底层吧,一关就都关了。
      

  5.   

    Tomcat是突然关的?还是正常关闭的?
    突然关闭,有可能是调用了exit(0);这样强制终止JAVA虚拟机的代码