容器时如何知道发生某种事件由哪个监听器处理?
时间: 2023-07-18 17:11:28 浏览: 91
在JavaWeb应用程序中,容器使用监听器来监听不同类型的事件,并且在事件发生时,会调用相应的监听器来处理事件。容器通过在web.xml文件中配置监听器,来告知容器哪些事件应该由哪些监听器来处理。
当某个事件发生时,容器会通过Servlet API中定义的回调方法来通知监听器,例如对于ServletRequest对象的事件,容器会调用ServletRequestListener接口中的回调方法来通知监听器。在调用回调方法时,容器会将事件对象作为参数传递给监听器,从而让监听器能够获取事件的详细信息,并进行相应的处理。
每个监听器都需要实现相应的接口,并在web.xml文件中进行配置,以便容器能够识别和调用它们。在配置监听器时,通常需要指定监听器的类名和需要监听的事件类型,例如:
```
<listener>
<listener-class>com.example.MyServletRequestListener</listener-class>
</listener>
```
在这个例子中,我们配置了一个ServletRequestListener监听器,用于监听ServletRequest对象的事件。当ServletRequest对象的事件发生时,容器会调用MyServletRequestListener类中的回调方法来处理事件。
总之,容器通过配置监听器来指定哪些事件应该由哪些监听器来处理,并在事件发生时调用相应的回调方法来通知监听器。这种机制为应用程序提供了一种灵活的扩展机制,使得应用程序能够更加灵活和高效地处理各种事件。
相关问题
2.补充完整程序代码,实现如下图形用户界面。当在窗口中单击鼠标时,能显示鼠标位置坐标,当点击“Quit”按钮时,退出程序。import javax.swing.*; import java.awt.*; import java.awt.event.*; public class AdapterTest extends JFrame implements ActionListener { int x,y; String str; JButton b; JLabel l; public AdapterTest(){ super("The Mouse Adapter"); getContentPane(). ; //设置流式布局 JPanel p=new JPanel(); l=new JLabel("Please click the window"); getContentPane().add(l); b=new JButton("Quit"); b. ; //注册按钮单击事件监听器 getContentPane().add(b); ListenerClass listen=new ListenerClass(); ; //注册框架的鼠标事件监听器 setSize(300,300); setVisible(true); } public void actionPerformed(ActionEvent ae){ String s= ; //获取按钮的标签字符串 if("Quit".equals(s)){ System.exit(0); } } public static void main(String args[]){ AdapterTest f=new AdapterTest(); } } class ListenerClass extends MouseAdapter{ public void mouseClicked(MouseEvent me){ AdapterTest at= ; //获取事件源对象 at.l.setText("Mouse clicked at: "+me.getX()+","+me.getY()); } }
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class AdapterTest extends JFrame implements ActionListener {
int x,y;
String str;
JButton b;
JLabel l;
public AdapterTest(){
super("The Mouse Adapter");
getContentPane().setLayout(new FlowLayout()); //设置流式布局
JPanel p=new JPanel();
l=new JLabel("Please click the window");
getContentPane().add(l);
b=new JButton("Quit");
b.addActionListener(this); //注册按钮单击事件监听器
getContentPane().add(b);
ListenerClass listen=new ListenerClass();
addMouseListener(listen); //注册框架的鼠标事件监听器
setSize(300,300);
setVisible(true);
}
public void actionPerformed(ActionEvent ae){
String s=b.getText(); //获取按钮的标签字符串
if("Quit".equals(s)){
System.exit(0);
}
}
public static void main(String args[]){
AdapterTest f=new AdapterTest();
}
}
class ListenerClass extends MouseAdapter{
public void mouseClicked(MouseEvent me){
AdapterTest at=(AdapterTest)me.getSource(); //获取事件源对象
at.l.setText("Mouse clicked at: "+me.getX()+","+me.getY());
}
}
编写一个监听器类CountListener.java,记录记录当前在线人数,以及web应用程序启动以来被访问的总次数。
下面是一个简单的示例代码,实现了CountListener.java监听器类,用于记录当前在线人数和被访问的总次数:
```java
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class CountListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
// 应用程序启动时,初始化在线人数和访问次数
ServletContext context = sce.getServletContext();
context.setAttribute("onlineCount", 0);
context.setAttribute("visitCount", 0);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// 应用程序关闭时,清空在线人数和访问次数
ServletContext context = sce.getServletContext();
context.removeAttribute("onlineCount");
context.removeAttribute("visitCount");
}
@Override
public void sessionCreated(HttpSessionEvent se) {
// 有新的会话创建时,增加在线人数
ServletContext context = se.getSession().getServletContext();
Integer onlineCount = (Integer) context.getAttribute("onlineCount");
onlineCount++;
context.setAttribute("onlineCount", onlineCount);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// 有会话销毁时,减少在线人数
ServletContext context = se.getSession().getServletContext();
Integer onlineCount = (Integer) context.getAttribute("onlineCount");
onlineCount--;
context.setAttribute("onlineCount", onlineCount);
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
// 有新的请求时,增加访问次数
ServletContext context = sre.getServletContext();
Integer visitCount = (Integer) context.getAttribute("visitCount");
visitCount++;
context.setAttribute("visitCount", visitCount);
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
// 请求结束时不做任何处理
}
}
```
在web.xml中配置监听器,如下所示:
```xml
<listener>
<listener-class>com.example.CountListener</listener-class>
</listener>
```
这样,当应用程序启动时,CountListener会被初始化,并将在线人数和访问次数都设置为0。当有新的会话创建时,会增加在线人数;当有会话销毁时,会减少在线人数。当有新的请求时,会增加访问次数。最后,当应用程序关闭时,CountListener会被销毁,在线人数和访问次数会被清空。
阅读全文