java基础复习(7)

来源:互联网 发布:python内置函数手册 编辑:程序博客网 时间:2024/05/29 14:48

J2EE复习第一篇  关于Servlet总结

1:Servlet的生命周期

      1)实例化

            servlet的实例化存在两个时间,一是在Servlet容器启动项目的时候或读取项目中Web.xml的信息,如果load-on-startup设置大于0,则会在启动的时候进行实例化,而是如果load-on-startup设置为小于0或者不写的话  则是在client第一次请求的时候实例化。

           在此还要纠正一些错误,在load-on-startup为自然数(正整数和0)的时候,哪个值小则哪个先实例化,但是网上有些错误的解释误导    

   说是0是最后加载的,而正整数则是值越小越先加载,这个我感觉很疑惑,这逻辑有点奇葩,所以做了测试,结果是自然数值越小越线加载

     2)Servlet服务

     

   第六步中,调用Servlet的service方法,而service方法则是调用doGet或者doPost方法

 3)销毁

      在servlet容器停止服务或者重新启动(也停止服务了),则调用servlet的destroy方法进行销毁


2:Servlet服务

     前面已经讲到将Servlet的实例化 了,现在我们看下Servlet如何进行服务的

    首先,client是要发送请求的,比如说是http://localhost:8080/singletonServlet/indexServlet这个url,servlet容器会将这个url减去此应用程序的上下文(http://localhost:8080/indexServlet),得到这个/indexServlet,剩下的这部分则会拿来作为映射匹配了,它的匹配规则和顺序如下图

   

    匹配之后,访问Servlet的Service方法,然后调用服务,但是这里Servlet是单实例多线程的,也就是说每个当请求达到时Servlet容器通过调度线程(Dispatchaer Thread)调度它管理下的线程池中等待执行的线程(Worker Thread)给请求者;如果是同一个Servlet,则service方法在多个线程中执行,service调用哪个完成后,则会将线程返回给线程池,等待被再次调用。

 3:单实例多线程的同步问题

     1:实现SingleThreadModel接口,这是个标识接口,表明在同一时刻只有一个线程访问servlet的service的方法,但是SingleThreadModel并不能保证静态变量、会话属性等信息被多线程访问,所以不推荐使用(比如session是需要保存多个用户信息的,在多个线程中都会存在(假设用户发了多个不同的请求))

   2:加锁synchronized,在同步块的地方加锁就可以

         使用线程安全的类  HashTable代替HashMap  Vector替换ArrayList

  3:代码提高(避免使用实例变量),多使用局部变量


4:Servlet和Socket的关系

      在javax.servlet包中定义了所有的Servlet类都必须实现或扩展的的通用接口和类.在javax.servlet.http包中定义了采用HTTP通信协议的HttpServlet类. Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这一接口。

      在servlet中定义了五个方法:如下图所示

    

     上面已经提到和servlet生命周期相关的三个方法init  service  destroy方法了。而且也提到了servlet的服务过程,现在我们着重来看下web容器如何将请求进行封装为HttpRequest以及将响应封装为HttpResponse。

   socket则是对TCP/IP协议的封装和应用(程序员层面上)。也可以说,TPC/IP协议是传输层协议,主要解决数据 如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:

我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如 果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等,也 可以自己定义应用层协议。WEB使用HTTP协议作应用层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发到网络上。

我们平时说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。 实际上,Socket跟TCP/IP协议没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以说,Socket的出现 只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、 listen、connect、accept、send、read和write等等。网络有一段关于socket和TCP/IP协议关系的说法比较容易理 解:

TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。这个就像操作系统会提供标准的编程接口,比如win32编程接口一样,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。”

总结一些基于基于TCP/IP协议的应用和编程接口的知识,也就是刚才说了很多的 HTTP和Socket。

CSDN上有个比较形象的描述:HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力

实际上,传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,而Socket本身不算是协议,就像上面所说,它只是提供了一个针对TCP或者UDP编程的接口。

    关于ServletRequest和HttpServletRequest的区别在于HttpServletRequest是在ServletRequest的基础上加上了对于Http请求的封装。

   看了这么多,我们来看下httpservlet与socket之间的关系,可以这样来说吧,httpservlet底层是通过socket来实现的

   可以这么来理解,servlet容器监听到请求,则将socket读取出来的请求封装成servletrequest,而响应的时候则是将响应封装成servletresponse之后,由socket返回给客户端。


5:Tomcat的Socket


  

     

0 0