Java 有没有办法在ServletContextListener中知道Web应用程序中发生了什么变化?
在ServletContextListener中,是否有办法知道web应用程序中的哪个文件已更改,从而导致重新加载上下文?Java 有没有办法在ServletContextListener中知道Web应用程序中发生了什么变化?,java,tomcat,jakarta-ee,servletcontextlistener,Java,Tomcat,Jakarta Ee,Servletcontextlistener,在ServletContextListener中,是否有办法知道web应用程序中的哪个文件已更改,从而导致重新加载上下文? 它是一个JSP文件吗?我可以找出哪个.class文件被更改了吗?您可以实现一个文件更改侦听器 public class FileMonitor { private static Logger logger = Logger.getLogger(FileMonitor.class); private static final FileMonitor insta
它是一个JSP文件吗?我可以找出哪个.class文件被更改了吗?您可以实现一个文件更改侦听器
public class FileMonitor
{
private static Logger logger = Logger.getLogger(FileMonitor.class);
private static final FileMonitor instance = new FileMonitor();
private Timer timer;
private Map timerEntries;
private FileMonitor() {
this.timerEntries = new HashMap();
this.timer = new Timer(true);
}
public static FileMonitor getInstance() {
return instance;
}
/**
* Add a file to the monitor
*
* @param listener The file listener
* @param filename The filename to watch
* @param period The watch interval.
*/
public void addFileChangeListener(FileChangeListener listener,
String filename, long period) {
this.removeFileChangeListener(filename);
logger.info("Watching " + filename);
FileMonitorTask task = new FileMonitorTask(listener, filename);
this.timerEntries.put(filename, task);
this.timer.schedule(task, period, period);
}
/**
* Stop watching a file
*
* @param listener The file listener
* @param filename The filename to keep watch
*/
public void removeFileChangeListener(String filename) {
FileMonitorTask task = (FileMonitorTask)this.timerEntries.remove(filename);
if (task != null) {
task.cancel();
}
}
private static class FileMonitorTask extends TimerTask {
private FileChangeListener listener;
private String filename;
private File monitoredFile;
private long lastModified;
public FileMonitorTask(FileChangeListener listener, String filename) {
this.listener = listener;
this.filename = filename;
this.monitoredFile = new File(filename);
if (!this.monitoredFile.exists()) {
return;
}
this.lastModified = this.monitoredFile.lastModified();
}
public void run() {
long latestChange = this.monitoredFile.lastModified();
if (this.lastModified != latestChange) {
this.lastModified = latestChange;
this.listener.fileChanged(this.filename);
}
}
}
}
代码不是我的,我找不到作者,我会尽快更新。为什么?在
ServletContextListener
中,您将如何处理从容器日志文件中无法获得的内容?EJP,目前在contextDestroyed和contextInitialized上都有一些长处理代码。例如,如果JSP文件已更改,则不需要运行此代码,并且此代码也会针对所有类运行。如果它知道哪些类发生了更改,那么它只能对这些类进行更改,换句话说,就是复制容器已经在做的事情,这样开销就加倍了。