java基础复习(7)

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以帮你复习Java基础面试题。以下是一些常见的Java基础面试题及其答案: 1. Java中的基本数据类型有哪些? 答:Java中的基本数据类型包括byte、short、int、long、float、double、boolean和char。 2. Java中的包装类是什么? 答:包装类是一种将基本数据类型封装成对象的方式。Java提供了对应于每个基本数据类型的包装类,如Integer、Double、Boolean等。 3. Java中的String类是可变的吗? 答:String类是不可变的,即一旦创建就不能被修改。如果需要对字符串进行修改操作,可以使用StringBuilder或StringBuffer类。 4. Java中的final关键字有什么作用? 答:final关键字可以用来修饰类、方法和变量。当修饰类时,表示该类不能被继承;当修饰方法时,表示该方法不能被重写;当修饰变量时,表示该变量的值不能被修改。 5. Java中的抽象类和接口有什么区别? 答:抽象类是一种不能被实例化的类,它可以包含抽象方法和非抽象方法。接口是一种完全抽象的类,它只能包含抽象方法和常量。一个类可以实现多个接口,但只能继承一个抽象类。 6. Java中的异常处理机制是什么? 答:Java中的异常处理机制通过try-catch-finally语句块来实现。当可能发生异常的代码放在try块中,如果发生异常,则会被catch块捕获并进行处理,最后无论是否发生异常,都会执行finally块中的代码。 7. Java中的多线程是如何实现的? 答:Java中实现多线程有两种方式,一种是继承Thread类,另一种是实现Runnable接口。通过重写Thread类的run()方法或实现Runnable接口的run()方法来定义线程的执行逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值