java如何实现:一个一直在运行的监听程序,每当监听到数据,就把数据发给jsp页面

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java如何实现:一个一直在运行的监听程序,每当监听到数据,就把数据发给jsp页面相关的知识,希望对你有一定的参考价值。

java如何实现:一个一直在运行的监听程序,每当监听到数据,就把数据发给jsp页面。求大家帮帮忙

方法1:可以利用ServletContext类的对象application解决,这个属于整个web应用都公用的内部对象。例如在监听器中
public class GetConnListener implements ServletContextListener
//例如这个是要传的数据
String data="0";

//当此web应用被访问后启用该方法

public void contextInitialized(ServletContextEvent sce)

//创建application
ServletContext application=sce.getServletContext();

//将数据存入application的属性中
application.setAttribute("Data",data);
然后再JSP页面,的JSP脚本中写入
String data=(String)sapplication.getAttribute("Data");
out.print(data);
就能狗获取和输出这个数据了。
方法二便是直接在JAVA中把数据存入数据库,JSP从数据库中读出数据。
参考技术A 一直在运行的监听程序,这个用定时器实现,定时器可以用java定时任务,也可以用spring封装好的。每隔一秒执行一次。每当监听到数据时,存入数据。
而那个jsp页面也写个定时的js脚本,每隔一段时间刷新一次(setinterval)获取最新的数据
参考技术B 首页 java没办法把信息直接发给jsp,只能jsp去请求java代码然后得到数据,最多加入延迟加载等等策略,监听简单 两种模式,1、主动监听,也就是ScheduledThreadPool定时去查,不多见,一些开源的数据库框架会用这种模式去监测数据库状态,或者是一些项目会用这种模式监听配置文件修改,实时生效;2、监听方上报,也就是observer模式,多用于无关联的东西,用的比较多一些 参考技术C 你可以看看apache的camel,可以适合各种监听,目录,webservice等都可以, 发送到jsp也很方便。 参考技术D 在servlet init 那加入监测的方法 或者数据库里面写触发器 或者用socket

如何在java的后台运行这个关键监听器

【中文标题】如何在java的后台运行这个关键监听器【英文标题】:how to run this key listener in background in java 【发布时间】:2021-06-29 07:22:29 【问题描述】:

如何在后台运行这个关键监听器?我应该在代码部分嵌入什么?代码在前窗口中运行良好,但是当我切换到另一个窗口时 失去其功能。

import java.util.*;
import javax.imageio.*;
import java.awt.*;
import javax.swing.*; 

public class KeyListenerExample extends Frame implements KeyListener 
    Label l;  
    TextArea area;  

    KeyListenerExample() 
        l=new Label();  
        l.setBounds(20,50,100,20);  
        area=new TextArea();  
        area.setBounds(20,80,300, 300);  
        area.addKeyListener(this);

        add(l);add(area);  
        setSize(400,400);  
        setLayout(null);  
        setVisible(true); 
    

    public void keyPressed(KeyEvent e) 
        l.setText("Key Pressed");
    

    public void keyReleased(KeyEvent e) 
        l.setText("Key Released");
    

    public void keyTyped(KeyEvent e) 
        l.setText("Key Typed");
    

    public static void main(String[] args) 
        new KeyListenerExample();
    

【问题讨论】:

您是说即使您的应用程序不是焦点应用程序,您也希望您的应用程序继续捕获按键? 如果 Frame 在后台,它不会收到按键。 Java key listener to track all keystrokes的可能重复 【参考方案1】:

您可以使用 JNativeHook Java 库,即使您不在窗口中,它也会抓取密钥,这里是 JNativehook 的示例代码。来自我的一个较旧的项目。如果没有清除,请随时提出问题,您将需要下载 JNativeHook jar 文件

import java.awt.EventQueue;
import java.awt.Toolkit;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.AbstractExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JDialog;
import javax.swing.JFrame;
import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;

public class Main2 extends JDialog implements NativeKeyListener 

    private static final long serialVersionUID = 1L;

    public static void main(String[] args) throws Exception 

        EventQueue.invokeLater(new Runnable() 
            @Override
            public void run() 
                try 

                    Main2 frame = new Main2(new JFrame() 
                        @Override
                        public boolean isShowing() 
                            return true;
                        
                    );
                 catch (Exception e) 
                    e.printStackTrace();
                
            
        );
    

    /**
     * Create the frame.
     * 
     * @throws IOException
     */
    public Main2(JFrame jFrame) throws IOException, NativeHookException 
        System.setProperty("sun.java2d.noddraw", "true");
        setBounds(0, 0, 1, 1);

        setUndecorated(true);
        this.setLocationRelativeTo(null);

        try 
            SwingExecutorService ses = new SwingExecutorService();
            GlobalScreen.getInstance().setEventDispatcher(ses);
            GlobalScreen.registerNativeHook();
            Logger loggy = Logger.getLogger(GlobalScreen.class.getPackage().getName());
            loggy.setLevel(Level.SEVERE);
         catch (Exception e) 

        

        GlobalScreen.getInstance().addNativeKeyListener(this);

        setFocusable(true);
        setVisible(true);

    

    @Override
    public void nativeKeyPressed(NativeKeyEvent e) 
        char ch = e.getKeyChar();
        System.out.println(e.getKeyText(e.getKeyCode()));
        int key = e.getKeyCode();
        System.out.println(ch);
        System.out.println(key);
        String modifiers = e.getModifiersText(e.getModifiers());
        int rawCode = e.getRawCode();
        System.out.println(rawCode);
    

    @Override
    public void nativeKeyTyped(NativeKeyEvent e) 
    

    private class SwingExecutorService extends AbstractExecutorService 
        private EventQueue queue;

        public SwingExecutorService() 
            queue = Toolkit.getDefaultToolkit().getSystemEventQueue();
        

        @Override
        public void shutdown() 
            queue = null;
        

        @Override
        public List<Runnable> shutdownNow() 
            return new ArrayList<>(0);
        

        @Override
        public boolean isShutdown() 
            return queue == null;
        

        @Override
        public boolean isTerminated() 
            return queue == null;
        

        @Override
        public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException 
            return true;
        

        @Override
        public void execute(Runnable r) 
            EventQueue.invokeLater(r);
        
    

    @Override
    public void nativeKeyReleased(NativeKeyEvent arg0) 
    

【讨论】:

【参考方案2】:

如果这个另一个窗口也和第一个窗口在同一个java进程中运行,你可以使用

KeyboardFocusManager.addKeyEventDispatcher(java.awt.KeyEventDispatcher)

使用您的自定义 KeyEvenDispatcher

【讨论】:

以上是关于java如何实现:一个一直在运行的监听程序,每当监听到数据,就把数据发给jsp页面的主要内容,如果未能解决你的问题,请参考以下文章

Listener--监听器

Android dialog实现监听生命周期

vue如何监听到原生js删除dom结点

为啥props里面的值不能监听到

父组件可以监听到子组件的生命周期吗?

用携程来启动一个监听程序