您的位置:首页 > 编程语言 > Java开发

java基础复习(7)

2014-09-03 22:21 155 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: