视频总结-servlet高级开发 servlet高级开发:servlet和jsp的多线程问题 servlet: 在默认情况下,单个servlet实例可以处理多个并发请求 在一个共享的servlet实例中多个线程的执行可能导致数据不一致方法1: .通过同步crirical section能够避免不一致的后果 .使用"sysnchronized"保护重要的程序代码 使用同步序列化多个请求的实例: Object so=new Object(); public void service(...request,....response){ sysnchronized(so){ ....在某时刻上只有一个线程执行这段代码 } }方法2:单线程模型 .通过实现SingleThreadMode接口,可以保证只有一个线程执行Servlet的service()方法 .weblogic server将从相同的servlets的池中获得一个servlet 实现SingleThreadModel接口: public class MyServlet extends HttpServlet implements SingleThreadModel{ public void service(...request,...response){ ....只有一个线程能执行这段代码 } }jsp的多线程问题: .在默认的情况下,jsps能够接手来自不同客户的并发请求 .对于Critial section中代码必须像servlet那样使用同步机制 .在page指示中使用SingleThreadModel接口配置jsp 单线程模型的jsp实例 <%@ page isThreadSafe="false"%> .默认情况下isThreadSafe="true" Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。下面将介绍几种常用的监听器,以及它们都适合运用于那些环境。 分类及介绍:(红色表示重要) 1. ServletContextListener:用于监听WEB 应用启动和销毁的事件,监听器类需要实现javax.servlet.ServletContextListener 接口。 import java.util.HashMap;import java.util.Map;import javax.servlet.http.HttpSessionAttributeListener;import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener; /** * Web application lifecycle listener. * @author Administrator */ public class OnlineUserListener implements HttpSessionListener,HttpSessionAttributeListener { private static int activeSessions = 1; private static Map<String,String> online=new HashMap<String,String>(); public static Map<String,String> getOnline() { return online; } public static int getActiveSessions() { return activeSessions; } public void attributeAdded(HttpSessionBindingEvent event) { if (event.getName().equals("userlogin")) { System.out.println("User logged in."); String username = (String)event.getSession().getAttribute("userlogin"); online.put(event.getSession().getId(),username); } } public synchronized void attributeRemoved(HttpSessionBindingEvent event) { if (event.getName().equals("userlogin")) { online.remove(event.getSession().getId()); } } public void attributeReplaced(HttpSessionBindingEvent event) { } public void sessionCreated(HttpSessionEvent event) { activeSessions++; } public void sessionDestroyed(HttpSessionEvent event) { if (activeSessions > 0) { activeSessions--; } }} web.xml配置: <listener> <listener-class>mgc.listener.test.OnlineListener</listener-class> </listener> 2. ServletContextAttributeListener:用于监听WEB应用属性改变的事件,包括:增加属性、删除属性、修改属性,监听器类需要实现javax.servlet.ServletContextAttributeListener接口。 3. HttpSessionListener:用于监听Session对象的创建和销毁,监听器类需要实现javax.servlet.http.HttpSessionListener接口或者javax.servlet.http.HttpSessionActivationListener接口,或者两个都实现。 4. HttpSessionActivationListener:用于监听Session对象的钝化/活化事件,监听器类需要实现javax.servlet.http.HttpSessionListener接口或者javax.servlet.http.HttpSessionActivationListener接口,或者两个都实现。 5. HttpSessionAttributeListener:用于监听Session对象属性的改变事件,监听器类需要实现javax.servlet.http.HttpSessionAttributeListener接口。 实现监听在线用户: