Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Web Start Swing应用程序如何显示servlet信息?_Java_Swing_Servlets_Java Web Start - Fatal编程技术网

Java Web Start Swing应用程序如何显示servlet信息?

Java Web Start Swing应用程序如何显示servlet信息?,java,swing,servlets,java-web-start,Java,Swing,Servlets,Java Web Start,当我输入我的问题时,类似的问题出现了,像这个[],但我看了看,没有找到我要找的答案,所以这是我的问题 我正在为内部呼叫中心开发一个web应用程序,它使用Java应用程序[CCT:call center technology]来调用asterisk服务器来拨打电话,这个CCT有很多servlet来生成html网页,以便呼叫代理可以访问网页并拨打电话。为了更好地开发和调试,我添加了一个Swing GUI面板,这样当它在我的开发PC上运行时,它会打开一个包含许多按钮的窗口,每个按钮都代表一个调用方代理

当我输入我的问题时,类似的问题出现了,像这个[],但我看了看,没有找到我要找的答案,所以这是我的问题

我正在为内部呼叫中心开发一个web应用程序,它使用Java应用程序[CCT:call center technology]来调用asterisk服务器来拨打电话,这个CCT有很多servlet来生成html网页,以便呼叫代理可以访问网页并拨打电话。为了更好地开发和调试,我添加了一个Swing GUI面板,这样当它在我的开发PC上运行时,它会打开一个包含许多按钮的窗口,每个按钮都代表一个调用方代理及其设置信息,因此我可以单击并查看详细信息。它运行良好,我已将代码复制到测试服务器,当它在那里运行时,我可以远程访问它,并看到Swing面板,其中包含代表每个调用方代理的JButtons

但问题是,当这个Java应用程序在生产服务器上运行时,它将作为Windows服务运行[我的老板告诉我],并且不会显示,因此不会看到Swing面板,因此我考虑了Java web Start,使用它我可以拥有一个带有“WebStartLaunchButton”的网页所以当我点击这个按钮时,它会让我下载一个Jar文件,启动一个Swing应用程序。但后来我意识到Jar文件将下载到我的本地PC上,并从PC上运行,它将不知道servlet设置/信息,它是独立的,与呼叫中心web app sevlet无关,并且无法显示呼叫代理信息。我说得对吗?有没有办法让Swing应用程序在服务器上运行,并从我的PC上查看它

下面是更详细的信息,servlet中有这样一个类:

public class DialerService extends Service implements Runnable
{
  private boolean running = false;
  private Thread thread;

  private CallManager cm = null;
  private AgentDialListManager adlm = null;            // <-- My Swing program
  private DataAccessManager dam = null;
  ...

  public void run()
  {
    adlm = new AgentDialListManager();                 // <-- My Swing program
    ...
  }
  ...

  private CallData getNextDial(SessionManager sm, SessionData session)
  {
    CallData nextDial = null;

    AgentData agent = session.getAgentData();
    if (agent != null)
    {
      SystemSettingsData settings = dam.getSystemSettings();
      if (settings.isNextDialBufferOn())
      {
        nextDial = adlm.getNextNumber(dam,session);   // <-- My Swing program : Get a number from self-managed agent dial list
      }
      ...
    }
  }
  ...

}
公共类DialerService扩展服务实现可运行
{
私有布尔运行=false;
私有线程;
私有CallManager cm=null;

private AgentDialListManager adlm=null;//我很长一段时间都在试图了解您的应用程序是如何工作的。我认为您正在做的是,您有一个servlet处理http请求,作为请求处理的一部分,您启动一个线程来打开Swing应用程序。这是否正确

如果是这样,这是一个糟糕的设计。Servlet用于服务web内容。如果启动Swing应用程序,它在同一个JVM中运行,您实际上可以访问与Servlet中相同的后端资源,但问题是Servlet服务的内容通过网络传输到客户端。而这可以在您的本地计算机上运行(其中服务器计算机也是客户端计算机)它将无法在正常的客户端-服务器体系结构上工作,其中服务器与客户端是不同的计算机。在此,客户端接收响应(html),但无法访问服务器计算机上运行的Swing应用程序

这种设计的另一个问题是如何将swing应用程序绑定到正确的客户机上?Image 100用户访问servlet,它是否打开了swing应用程序的100个实例?正如Kayaman所说,您将需要某种与客户机的另一种连接来访问swing应用程序。这不是小事,也不值得这么做。

实际上,我来自Webswing团队,但这不是Webswing的正确使用案例。Webswing适用于独立的Swing/JavaFX应用程序,用户通常从桌面启动,而不是从servlet启动


我认为最好的选择是将Swing应用程序的逻辑实现到servlet提供的HTML页面中,可能在按钮上使用一些AJAX调用,等等。实际上,有很多可能性可以通过Web页面以响应速度非常快且与本机类似的方式访问后端。

我很长一段时间都在试图了解您的应用程序是如何运行的应用程序可以工作。我认为您正在做的是,您有一个servlet来处理http请求,并且作为请求处理的一部分,您启动一个线程来打开Swing应用程序。这是正确的吗

如果是这样,这是一个糟糕的设计。Servlet用于服务web内容。如果启动Swing应用程序,它在同一个JVM中运行,您实际上可以访问与Servlet中相同的后端资源,但问题是Servlet服务的内容通过网络传输到客户端。而这可以在您的本地计算机上运行(其中服务器计算机也是客户端计算机)它将无法在正常的客户端-服务器体系结构上工作,其中服务器与客户端是不同的计算机。在此,客户端接收响应(html),但无法访问服务器计算机上运行的Swing应用程序

这种设计的另一个问题是如何将swing应用程序绑定到正确的客户机上?Image 100用户访问servlet,它是否打开了swing应用程序的100个实例?正如Kayaman所说,您将需要某种与客户机的另一种连接来访问swing应用程序。这不是小事,也不值得这么做。

实际上,我来自Webswing团队,但这不是Webswing的正确使用案例。Webswing适用于独立的Swing/JavaFX应用程序,用户通常从桌面启动,而不是从servlet启动


我认为最好的选择是将Swing应用程序的逻辑实现到servlet提供的HTML页面中,可能会在按钮上使用一些AJAX调用,等等。确实有很多可能性可以通过Web页面以一种响应速度非常快且与本机类似的方式访问后端。

Swing应用程序永远不会在服务器上运行。它将始终运行在客户端上运行,因此问题归结为“swing应用程序如何与服务器通信”Webstart不会给您带来任何好处,因为它只是获取jar文件的一种机制。您必须在服务器和swing应用程序之间建立一个通信通道,或者在应用程序本身上建立一个web界面。感谢您的深入了解,但是swing应用程序要实现这一点需要做很多工作与servlet对话,包括获取
package com.amerisave.cct.call;

import com.amerisave.cct.data.DataAccessManager;
import com.amerisave.cct.session.AgentData;
import com.amerisave.cct.session.SessionData;
import com.orderlysoftware.orderlycalls.OrderlyCalls;
...
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.SwingConstants;
...

public class AgentDialListManager extends JPanel implements Runnable
{
  public static final long serialVersionUID = 26362862L;
  static Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
  static int W = 1136, H = 800, updateInterval = 1000;
  HashMap<Integer,AgentDialListRunner> agentDialListMap = null;
  HashMap<Integer,JFrame> Agent_Panel_Frame_Map = null;
  AgentData agent;
  Insets anInset = new Insets(0,0,0,0);
  AgentDialListRunner adlr;
  JPanel agentPanel = new JPanel(),Log_Panel=new JPanel(new FlowLayout(1,0,0));
...
  static JTabbedPane Tabbed_Pane;
  static JTextArea Log_TextArea = new JTextArea(Get_System_Properties());
  String hostAddress,hostName,dialerServerInfo="";
  List dialerServerList = null;
  Thread agentDialListManagerThread;

  AgentDialListManager()
  {
    if (!agentDialListManager_Exists_B)
    {
      agentDialListMap = new HashMap();
      Agent_Panel_Frame_Map = new HashMap();
      shutdown = false;
      if (showGUI_B) Init();
      start();
      agentDialListManager_Exists_B = true;
    }
  }

  void Init()
  {
    setLayout(new FlowLayout(1,0,1));
    Tabbed_Pane=new JTabbedPane();
    Tabbed_Pane.setDoubleBuffered(true);
    Tabbed_Pane.setPreferredSize(new Dimension(W - 20,H - 42));
    Tabbed_Pane.setAutoscrolls(true);
    Tabbed_Pane.setFont(new Font("Times New Roman",0,16));
    Tabbed_Pane.setForeground(new Color(0,0,230));
    add(Tabbed_Pane);

    agentPanel.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.RAISED,Color.white,new Color(134,134,134))," Agents",TitledBorder.CENTER,TitledBorder.TOP,new Font("Times New Roman",0,15),new Color(0,60,198)));
    agentPanel.setPreferredSize(new Dimension(W - 20,H - 42));
    Tabbed_Pane.addTab("Agents",null,agentPanel,"");

    JPanel bottomPanel = new JPanel(new FlowLayout(1,0,0));

    JPanel skipRatioPanel = new JPanel(new FlowLayout(1,0,0));
    skipRatioPanel.setBorder(new EtchedBorder(EtchedBorder.RAISED,new Color(0,188,250),new Color(134,134,134)));
    skipRatioPanel.setPreferredSize(new Dimension(330,30));
    bottomPanel.add(skipRatioPanel);

...

    Tabbed_Pane.addTab("Log",null,Log_Panel,"");

    setPreferredSize(new Dimension(W,H));

    SwingUtilities.invokeLater(new Runnable()
    {
      public void run()
      {
        createAndShowGUI();
      }
    });
  }

  CallData getNextNumber(DataAccessManager dam,SessionData session)
  {
    CallData nextDial = null;
    if (agentDialListMap != null)
    {
      agent = session.getAgentData();
      int nEmployeeId = agent.nEmployeeId;

      if (!agentDialListMap.containsKey(nEmployeeId))
      {
        adlr = new AgentDialListRunner(nEmployeeId,dam);
        agentDialListMap.put(nEmployeeId,adlr);
        agentCount = agentDialListMap.size();
        agentPanel.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.RAISED,Color.white,new Color(134,134,134)),agentCount + " Agent" + (agentCount > 1 ? "s" : ""),TitledBorder.CENTER,TitledBorder.TOP,new Font("Times New Roman",0,15),new Color(0,60,198)));
        addAgent(adlr.id,adlr,agent);
      }
      adlr = agentDialListMap.get(nEmployeeId);
      nextDial = adlr.getNextNumber();
    }
    return nextDial;
  }

  void createAndShowGUI()
  {
    JFrame frame = new JFrame("AgentDialListManager [  Java = " + System.getProperty("java.version") + "  |  jetty.home = "+System.getProperty("jetty.home")+"  ]   dialerServerInfo = " + dialerServerInfo+"   [ hostAddress = " + hostAddress+"   hostName = " + hostName+" ]");
    frame.add(this);

    frame.addWindowListener(new WindowAdapter()
    {
      public void windowActivated(WindowEvent e)  { }
      public void windowClosed(WindowEvent e) { }
      public void windowClosing(WindowEvent e) { if (runFromMain_B) System.exit(0); }
      public void windowDeactivated(WindowEvent e) { }
      public void windowDeiconified(WindowEvent e) { repaint(); }
      public void windowGainedFocus(WindowEvent e) { repaint(); }
      public void windowIconified(WindowEvent e) { }
      public void windowLostFocus(WindowEvent e) { }
      public void windowOpening(WindowEvent e) { repaint(); }
      public void windowOpened(WindowEvent e) { }
      public void windowResized(WindowEvent e) { repaint(); }
      public void windowStateChanged(WindowEvent e) { repaint(); }
    });

    frame.pack();
    if (runFromMain_B) frame.setLocationRelativeTo(null);
    else frame.setBounds(displayCount==3?-1728:0,displayCount==3?0:26,this.getWidth(),this.getHeight() + 43);
    frame.setVisible(true);
  }

  public void run()
  {
    try
    {
      while (!shutdown)
      {
        Thread.sleep(sleepTime);
        AgentDialListRunner.averageTimeToMoreNumbers = 0;
        for (Map.Entry<Integer,AgentDialListRunner> mapElement : agentDialListMap.entrySet())
        {
          int nEmployeeId = (int)mapElement.getKey();
          AgentDialListRunner adlr = (AgentDialListRunner)mapElement.getValue();
          AgentDialListRunner.averageTimeToMoreNumbers += adlr.averageTimeInSecondsBeforeGettingMoreNumbers;
        }
        agentCount = agentDialListMap.size();
        if (agentCount > 0)
        {
          AgentDialListRunner.averageTimeToMoreNumbers /= agentCount;
       averageTimeToMoreNumbersValueLabel.setText(AgentDialListRunner.averageTimeToMoreNumbers + " Sec.");
        }
      }
    }
    catch (Exception e)
    {
      log.error("Exception in runner thread:", e);
    }
  }

  public void start()
  {
    stop();
    if (agentDialListManagerThread == null)
    {
      agentDialListManagerThread = new Thread(this);
      agentDialListManagerThread.setPriority(Thread.NORM_PRIORITY);
      agentDialListManagerThread.start();
    }
  }

  public void stop()
  {
    if (agentDialListManagerThread != null) agentDialListManagerThread = null;
  }
...

  public static void main(String[] args)
  {
    runFromMain_B = true;
    new AgentDialListManager();
  }
}