servlet部分理解

来源:互联网 发布:电脑使用手机网络 编辑:程序博客网 时间:2024/04/29 05:10

Servlet的作用就是为java程序提供一个统一的web的应用规范,方便程序员可以用这种统一规范来编写程序

关于他是如何工作的,简单来说:一个http请求的到来,容器将请求封装成servlet中的request对象,在request中你可以读到所有的http信息,然后取出来操作 ,最后再把数据封装成servlet的response对象,应用容器将respose对象解析之后封装成http response。

Servlet运行与支持java的应用服务器中,从实际上将,servlet可以响应任何类型的请求,但对大多数情况下,servlet只用来扩展基于http协议的web服务器。

Servlet借口SUN公司定义了两个默认实现类,GenericServlet、HttpServlet。

HttpServle指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。

Servlet的工作流程分为三个阶段:init(初始化) service(运行)   destroy(销毁)

 

 

 

 

Servlet的生命周期

 

1) 加载和实例化;在第一次请求Servlet时,Servlet容器将会创建Servlet实例;

2) 初始化;Servlet容器加载完成Servlet之后,必须进行初始化,此时,init方法将被调用;

3) Servlet初始化之后,就处于响应请求的就绪状态,此时如有客户端请求发送,就会调用Servlet实例的service()方法,并且根据用户的请求方式,调用doPost或者doGet方法。

4) 最后,Servlet容器负责将Servlet实例进行销毁,调用destroy方法实现;

对于更多的客户端请求,Server创建新的请求和响应对象,仍然激活Servlet的service()方法,将这两个对象作为参数传递给它。如此重复以上的循环,但无需再次调用init()方法。

一般Servlet只初始化一次(只有一个对象),当Server不再需要Servlet时(一般当Server关闭时),Server调用Servlet的Destroy()方法。

 

Servlet如何同时处理多个请求?
      Servlet采用多线程来处理多个请求的同时访问。Servlet容器通过线程池来管理维护服务请求。所谓线程池,相当于数据库连接池,实际上是等待执行代码的一组线程,叫做工作者线程。Servlet容器通过一个调度线程来管理工作者线程。
   当容器收到一个Servlet的访问请求,调度者线程就从线程池中选出一个工作者线程,将用户请求传递给该线程,然后由该线程处理Servlet的service()方法;
   当这个线程在执行的时候,容器收到一个新的请求,调度者线程再次从线程池中选出一个新的工作者线程;
   当容器同时收到对同一个Servlet的多个请求时,那么Servlet的service方法将在多线程中并发执行。

 

如何开发安全的Servlet?
 Servlet容器采用多线程来处理请求,提高性能的同时也造成了线程安全问题。要开发线程安全的Servlet应该从一下几个方面进行:
1)  变量的线程安全; 多线程并不共享局部变量,所以我们要尽可能的在Servlet中使用局部变量;
2) 代码块的线程安全; 使用同步块Synchronized,防止可能调用的代码块;但是要注意的是,要尽可能得缩小同步代码的方范围,不要在service方法和响应方法上直接使用同步,这会严重影响性能。
3) 属性的线程安全; ServletContext,HttpSession,ServletRequest对象中属性;
4)  使用同步集合; 使用Vector代替ArrayList,使用HashTable代替HashMap;
5) 不要在Servlet中创建自己的线程来完成某个功能;Servlet本身就是多线程的,如果再创建新的线程,将会导致线程执行复杂化,出现线程安全问题;
6)在多个Servlet中,对外部对象,比如:文件;进行修改操作一定要加锁,做到互斥访问;

原创粉丝点击