servlet简介:
-
客户端发送请求至服务器端;
-
服务器将请求信息发送至 Servlet;
-
Servlet 生成响应内容并将其传给 服务器。响应内容动态生成,通常取决于客户端的请求;
-
服务器将响应返回给客户端。
③调用Servlet实例对象的init()方法。
Servlet容器加载servlet类,把它的. Class文件中的数据读到内存中。
Servlet容器创建servletConfig对象。servletConfig对象包含了servlet的初始化配置信息。
此外servlet容器还会使得servletConfig对象与当前的web应用的servletContext对象关联。
Servlet容器创建servlet对象。
Servlet容器调用servlet对象的init(ServletConfig config)方法。
通过初始化步骤,创建了servlet对象和servletConfig对象,并且servlet对象与servletConfig对象关联,
而servletConfig对象又与当前对象的servletContext对象关联。当servlet容器完成servlet后,
servlet对象只要通过getServletContext()方法就能得到web应用的servletContext对象。
注:servlet初始化的情况:
(1)当web应用处于运行阶段时,特定的servlet被客户端首次请求访问。
(2)在web.xml文件中为servlet设置了<load-on-startup>元素
<servlet>
<servlet-name>servlet1</servlet-name>
<servlet-class>servlet.servlet1</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
说明:
在servlet的配置当中,<load-on-startup>5</load-on-startup>的含义是:
标记容器是否在启动的时候就加载这个servlet。
当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;
当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。
正数的值越小,启动该servlet的优先级越高。
(3)当web应用被重新启动时,web应用中的所有servlet会在特定的时间被重新初始化。
· 当容器收到一个Servlet的访问请求,调度者线程就从线程池中选出一个工作者线程,将用户请求传递给该线程,然后由该线程处理Servlet的service()方法;
· 当这个线程在执行的时候,容器收到一个新的请求,调度者线程再次从线程池中选出一个新的工作者线程;
· 当容器同时收到对同一个Servlet的多个请求时,那么Servlet的service方法将在多线程中并发执行。
注意:
1.Servlet容器默认采用单实例多线程的方式来处理请求。这样减少了产生Servlet实例的开销,提升了对请求的响应时间;
2.对于Tomcat容器来讲,可以在其server.xml中通过<Connector>中设置线程池中的线程数目。
如何开发线程安全的servlet:
Servlet容器采用多线程来处理请求,提高性能的同时也造成了线程安全问题。要开发线程安全的Servlet应该从一下几个方面进行:
1.变量的线程安全: 多线程并不共享局部变量,所以我们要尽可能的在Servlet中使用局部变量;
2.代码块的线程安全; 使用同步块Synchronized,防止可能调用的代码块;但是要注意的是,要尽可能得缩小同步代码的方范围,
不要在service方法和响应方法上直接使用同步,这会严重影响性能。
3.属性的线程安全;ServletContext,HttpSession,ServletRequest对象中属性;
4.使用同步集合; 使用Vector代替ArrayList,使用HashTable代替HashMap;
5.不要在Servlet中创建自己的线程来完成某个功能;Servlet本身就是多线程的,如果再创建新的线程,将会导致线程执行复杂化,出现线程安全问题;
6.在多个Servlet中,对外部对象,比如:文件;进行修改操作一定要加锁,做到互斥访问;