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接口。
实现监听在线用户:
相关推荐
赠送jar包:sentinel-web-servlet-1.8.0.jar; 赠送原API文档:sentinel-web-servlet-1.8.0-javadoc.jar; 赠送源代码:sentinel-web-servlet-1.8.0-sources.jar; 赠送Maven依赖信息文件:sentinel-web-servlet-...
赠送jar包:jersey-container-servlet-core-2.22.2.jar; 赠送原API文档:jersey-container-servlet-core-2.22.2-javadoc.jar; 赠送源代码:jersey-container-servlet-core-2.22.2-sources.jar; 赠送Maven依赖信息...
jcaptcha-integration-simple-servlet-sample.jar 验证码, jcaptcha组件,验证码项目
jakarta-servletapi-5.rar jakarta-servletapi-5.rar jakarta-servletapi-5.rar jakarta-servletapi-5.rar jakarta-servletapi-5.rar jakarta-servletapi-5.rar jakarta-servletapi-5.rar
赠送jar包:sentinel-web-servlet-1.8.0.jar 赠送原API文档:sentinel-web-servlet-1.8.0-javadoc.jar 赠送源代码:sentinel-web-servlet-1.8.0-sources.jar 包含翻译后的API文档:sentinel-web-servlet-1.8.0-...
赠送jar包:jersey-container-servlet-core-2.22.2.jar; 赠送原API文档:jersey-container-servlet-core-2.22.2-javadoc.jar; 赠送源代码:jersey-container-servlet-core-2.22.2-sources.jar; 赠送Maven依赖信息...
赠送jar包:jersey-servlet-1.19.jar; 赠送原API文档:jersey-servlet-1.19-javadoc.jar; 赠送源代码:jersey-servlet-1.19-sources.jar; 赠送Maven依赖信息文件:jersey-servlet-1.19.pom; 包含翻译后的API文档...
java-servlet-连接mysql-数据库.docx java-servlet-连接mysql-数据库.docx java-servlet-连接mysql-数据库.docx java-servlet-连接mysql-数据库.docx java-servlet-连接mysql-数据库.docx java-servlet-连接mysql-...
赠送jar包:jersey-servlet-1.19.jar; 赠送原API文档:jersey-servlet-1.19-javadoc.jar; 赠送源代码:jersey-servlet-1.19-sources.jar; 赠送Maven依赖信息文件:jersey-servlet-1.19.pom; 包含翻译后的API文档...
基于jsp-servlet的客户管理系统CRM基于jsp-servlet的客户管理系统CRM 基于jsp-servlet的客户管理系统CRM基于jsp-servlet的客户管理系统CRM 基于jsp-servlet的客户管理系统CRM基于jsp-servlet的客户管理系统CRM 基于...
赠送jar包:undertow-servlet-2.2.14.Final.jar; 赠送原API文档:undertow-servlet-2.2.14.Final-javadoc.jar; 赠送源代码:undertow-servlet-2.2.14.Final-sources.jar; 赠送Maven依赖信息文件:undertow-...
赠送jar包:jetty-servlet-9.3.19.v20170502.jar; 赠送原API文档:jetty-servlet-9.3.19.v20170502-javadoc.jar; 赠送源代码:jetty-servlet-9.3.19.v20170502-sources.jar; 赠送Maven依赖信息文件:jetty-...
使用JSP-Servlet技术开发新闻发布系统-贯穿案例-项目演示.mp4使用JSP-Servlet技术开发新闻发布系统-贯穿案例-项目演示.mp4
PHP/Java Bridge的JavaBridge.jar、php-servlet.jar和php-script.jar
java运行依赖jar包
Java程序开发教学课件:15-Servlet高级编程.ppt
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
赠送jar包:guice-servlet-4.0.jar; 赠送原API文档:guice-servlet-4.0-javadoc.jar; 赠送源代码:guice-servlet-4.0-sources.jar; 赠送Maven依赖信息文件:guice-servlet-4.0.pom; 包含翻译后的API文档:guice-...
geronimo-servlet_2.5_spec-1.2.jar geronimo-servlet_2.5_spec-1.2.jar