为什么javaweb都要容器?深入理解Java Servlet与Web容器之间的关系
大家好,今天给各位分享为什么javaweb都要容器的一些知识,其中也会对深入理解Java Servlet与Web容器之间的关系进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
深入理解Java Servlet与Web容器之间的关系
自从计算机软件开发进入网络时代就开始涉及到通讯问题在客户/服务器(也叫C/S应用)时期每个软件都有自己的客户端和服务器端软件并且客户端和服务器端之间的通讯协议差别也很大后来随着互联网的发展基于浏览器/服务器的应用逐渐成为主流通讯协议也统一到HTTP协议但是在HTTP协议之上如何处理来自客户端的请求信息以及如何对请求进行回应则经历了很长时间也没有统一下来目前对于这个问题的解决方案主要有两种一个是CGI另一个是Servlet
CGI(Common Gateway Interface)通用网关接口
通用网关接口简称CGI是一种根据请求信息动态产生回应内容的技术通过CGI Web服务器可以将根据请求不同启动不同的外部程序并将请求内容转发给该程序在程序执行结束后将执行结果作为回应返回给客户端也就是说对于每个请求都要产生一个新的进程进行处理因为每个进程都会占有很多服务器的资源和时间这就导致服务器无法同时处理很多的并发请求另外CGI程序都是与操作系统平台相关的虽然在互联网爆发的初期 CGI为开发互联网应用做出了很大的贡献但是随着技术的发展开始逐渐衰落
Servlet
Servlet最初是在年由James Gosling提出的因为使用该技术需要复杂的Web服务器支持所以当时并没有得到重视也就放弃了后来随着Web应用复杂度的提升并要求提供更高的并发处理能力 Servlet被重新捡起并在Java平台上得到实现现在提起Servlet指的都是Java Servlet Java Servlet要求必须运行在Web服务器当中与Web服务器之间属于分工和互补关系确切的说在实际运行的时候Java Servlet与Web服务器会融为一体如同一个程序一样运行在同一个Java虚拟机(JVM)当中与CGI不同的是 Servlet对每个请求都是单独启动一个线程而不是进程这种处理方式大幅度地降低了系统里的进程数量提高了系统的并发处理能力另外因为Java Servlet是运行在虚拟机之上的也就解决了跨平台问题如果没有Servlet的出现也就没有互联网的今天
在Servlet出现之后随着使用范围的扩大人们发现了它的一个很大的一个弊端那就是为了能够输出HTML格式内容需要编写大量重复代码造成不必要的重复劳动为了解决这个问题基于Servlet技术产生了JavaServet Pages技术也就是JSP Servlet和JSP两者分工协作 Servlet侧重于解决运算和业务逻辑问题 JSP则侧重于解决展示问题 Servlet与JSP一起为Web应用开发带来了巨大的贡献后来出现的众多Java Web应用开发框架都是基于这两种技术的更确切的说都是基于Servlet技术的
Java Servlet与Web容器之间的关系
Java是一种动态加载和运行的语言也就是说当应用程序持有一个类的地址(CLASSPATH)和名称(包名和类名)的情况下可以在程序运行期间任何时候加载这个类并创建和使用该类的对象 Servlet就是基于这个机制与Web容器融合在一起的目前已知的所有支持Java Servlet的Web容器都是采用Java开发的当Web容器接收到来自客户端的请求信息之后会根据URL中的Web元件地址信息到Servlet队列中查找对应的Servlet对象如果找到则直接使用如果没有找到则加载对应的类并创建对象也就是说 Servlet对象是在第一次被使用的时候才创建的并且一旦创建就会被反复使用不再创建新的对象所有创建出的Servlet对象会在Web服务器停止运行的时候统一进行垃圾回收
为了解决客户端请求地址与Java Servlet之间对应关系问题 Web容器需要一个用来描述这种对应关系的文件一般是web xml文件如果一个Web应用程序中存在很多个Servlet那么web xml会变得非常庞大在Servlet规范推出之后允许在Servlet代码中使用声明式语法来代替web xml中的描述信息这才让web xml瘦身下来下图是这个过程的一个示意图
lishixinzhi/Article/program/Java/hx/201311/26848简述一下Java中的web容器,举几个例子也行
目前市场上常用的开源Java Web容器有Tomcat、Resin和Jetty。其中Resin从V3.0后需要购买才能用于商业目的,而其他两种则是纯开源的。可以分别从他们的网站上下载最新的二进制包和源代码。
作为Web容器,需要承受较高的访问量,能够同时响应不同用户的请求,能够在恶劣环境下保持较高的稳定性和健壮性。在HTTP服务器领域,Apache HTTPD的效率是最高的,也是最为稳定的,但它只能处理静态页面的请求,如果需要支持动态页面请求,则必须安装相应的插件,比如mod_perl可以处理Perl脚本,mod_python可以处理Python脚本。
上面介绍的三中Web容器,都是使用Java编写的HTTP服务器,当然他们都可以嵌到Apache中使用,也可以独立使用。分析它们处理客户请求的方法有助于了解Java多线程和线程池的实现方法,为设计强大的多线程服务器打好基础。
Tomcat是使用最广的Java Web容器,功能强大,可扩展性强。最新版本的Tomcat(5.5.17)为了提高响应速度和效率,使用了Apache Portable Runtime(APR)作为最底层,使用了APR中包含Socket、缓冲池等多种技术,性能也提高了。APR也是Apache HTTPD的最底层。可想而知,同属于ASF(Apache Software Foundation)中的成员,互补互用的情况还是很多的,虽然使用了不同的开发语言。
Tomcat的线程池位于tomcat-util.jar文件中,包含了两种线程池方案。方案一:使用APR的Pool技术,使用了JNI;方案二:使用Java实现的ThreadPool。这里介绍的是第二种。如果想了解APR的Pool技术,可以查看APR的源代码。
ThreadPool默认创建了5个线程,保存在一个200维的线程数组中,创建时就启动了这些线程,当然在没有请求时,它们都处理“等待”状态(其实就是一个while循环,不停的等待notify)。如果有请求时,空闲线程会被唤醒执行用户的请求。
具体的请求过程是:服务启动时,创建一个一维线程数组(maxThread=200个),并创建空闲线程(minSpareThreads=5个)随时等待用户请求。当有用户请求时,调用 threadpool.runIt(ThreadPoolRunnable)方法,将一个需要执行的实例传给ThreadPool中。其中用户需要执行的实例必须实现ThreadPoolRunnable接口。 ThreadPool首先查找空闲的线程,如果有则用它运行要执行ThreadPoolRunnable;如果没有空闲线程并且没有超过maxThreads,就一次性创建minSpareThreads个空闲线程;如果已经超过了maxThreads了,就等待空闲线程了。总之,要找到空闲的线程,以便用它执行实例。找到后,将该线程从线程数组中移走。接着唤醒已经找到的空闲线程,用它运行执行实例(ThreadPoolRunnable)。运行完ThreadPoolRunnable后,就将该线程重新放到线程数组中,作为空闲线程供后续使用。
由此可以看出,Tomcat的线程池实现是比较简单的,ThreadPool.java也只有840行代码。用一个一维数组保存空闲的线程,每次以一个较小步伐(5个)创建空闲线程并放到线程池中。使用时从数组中移走空闲的线程,用完后,再“归还”给线程池。
Java难吗
世上无难事,只怕有心人。
Java是编程语言中比较难学的一门语言,它的难度并不低,相对比于C语言、Python语言来说,他们的学习难度要比Java轻松很多;
Java的学习中最难得就是,各种各样的框架,框架的使用、整合、最后项目;
学习Java刚开始我们要学习各种各样的基础知识:
Java的基础:
数据结构和算法、集合(容器)、IO流、多线程、封装、多态、继承等等
数据库的基础:
MySQL基础、MySQL增删改查语句、数据库对象、JDBC、反射和注解等
Java web基础知识:
前端的基础:
JS(JavaScript)、jQuery、HEML、CSS等
当我们学完这些基础知识以后我们将迈入Java中的高级阶段 JavaEE
这个阶段中会需要我们将所有的,知识总结在一起揉吧揉吧和一块,“难就难在这里”以我对学习Java来看就是这种想象,起个名词“学英语”;
就是那种“ABCDEFG···”我都会,但是合在一起的话我们就变得,不能理解甚至无从下手。原本很简单的基础知识,什么封装多态简单、什么 HTML/CSS简单、什么数据库简单!!但是他们集合在一起会导致我们不知道从哪里开始
一脸懵逼?
学习Java不止要靠毅力、脑力、思维力,还要靠人际交流问题需要靠你的花言巧语找大牛为你指点江山,走上成功之路!
为什么javaweb都要容器和深入理解Java Servlet与Web容器之间的关系的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!