from:http://www.apkbus.com/android-61775-1-1.html
一、I-jetty的web应用程序编程语言的确定
要确定其发布页面的语言就要找到他发布的服务器中页面所在的位置,之前说服务器需要存储卡才可以发布服务,所以目标锁定在Android
文件系统的sd
卡。
打开eclipse
,然后启动虚拟机,找到虚拟机的文件管理器,如图
找到mnt/sdcard
目录,查看文件夹发现多了两个目录,且都跟jetty
有关,如图:
在jetty
文件夹下发现了webapps
,仔细研究发现这个目录类似于之前做过的jsp
的目录,再看其文件类型,可以确定这些是jsp
项目的页面:
上面的网站文件是编译好的,均为class
文件,无法查看其源码,是否采用了其他的自定义的类还不是很清楚,但可以看到他引入了一些jar
包,在webapps-console-webinf-lib
文件夹下,如图:
目前还有一些问题有待研究,就是1.
他开发网站采用的工具是什么,是不是也是跟jsp
一样使用myeclipse
进行开发,除了引入那些jar
包外是否需要安装其他的插件。2.
他的网站是如何部署到服务器上去的,例子中的网站是提供了一个apk
的安装包,这个安装包要怎么打?或者不用安装包像jsp
网站那样直接复制到webapps
的目录下是否可以使用?
二、关于jetty服务器的详细介绍
看i-jetty
的介绍可以了解他是pc
端jetty
服务器的简化版,我们有必要理解一下jetty
服务器是什么,过去的一段时间里jetty
服务器一度很火,听说谷歌就是用的jetty
的服务器。下面我们了解一下jetty
服务器。
Jetty
¶
Jetty是什么?
¶
Jetty
是一个用Java
实现的开源的Http
和Web
服务器,包括HTTPserver, HTTP client
和javax.servlet container
。
Jetty用在何处?
¶
Jetty
的应用非常广泛,包括:
- 大型集群系统,如Yahoo Hadoop Cluster(http://developer.yahoo.net/hadoop/)
- 云计算服务,如Google AppEngine (http://code.google.com/appengine/)
- SaaS(Software-as-a-service)系统,如Yahoo! Zimbra(http://www.zimbra.com/)
- 应用程序服务器,如Apache Geronimo(http://geronimo.apache.org/)
- 应用框架,如GWT(http://code.google.com/webtoolkit/)
- 工具,如 Eclipse IDE(http://www.eclipse.org/)
- 移动设备,i-jetty(http://code.google.com/p/i-jetty/)
Jetty的特性是什么?
¶
Jetty
的广泛应用得益于其诸多优秀的特性:
- 轻量级:Jetty体积小巧,占用系统资源较少。
- 易嵌入性:Jetty既可以像tomcat一样独立运行,也可以很方便的嵌入到工具、框架或其他应用服务器中运行。Jetty在设计之 初就是作为一个可以嵌入到其他的Java代码中的servlet容器而设计的,因此开发小组将Jetty作为一组Jar文件提供出来,可以非常方便的在自 己的容器中将Jetty实例化成一个对象并操纵该容器对象。
- 灵活性:Jetty的体系架构及其面向接口的设计实现了功能模块高度可插拔和可扩展的特性,可以非常方便的根据需要来配置Jetty启用的功能。
- 稳定性:Jetty运行速度较快,即使有大量服务请求并发的情况下,系统性能也能保持在一个可以接受的状态。
Jetty的体系架构
¶
下面分别对上图中的几个部分作简要介绍:
- Connector负责解析服务器请求并产生应答,不同的Connector用于处理不同协议的请求。
- Handler用于处理经过Connector解析的请求并产生应答内容,同样可以通过配置不同的Handler来负责处理不同的请求。
- TheadPool:管理和调度多个线程,用于服务于多个连接请求。
- Server代表一个Jetty服务器对象,主要作用是协同Connector、Handler和TheadPool的工作。
其中,!TheadPool
可以根据配置选择是否使用,Connector
和Handler
也可以通过配置非常方便的实现替换。
Continuation机制
¶
Continuation
机制是Jetty
用于更好的支持异步Servlet
的机制。
首先简要介绍一下技术应用的背景。异步请求是指当客户端发送一个请求到服务器的时候,客户端不必一直等待服务器的响应,例如Web 2.0
中的Ajax(Asynchronous JavaScript and XML)
技术、JDBC
连接池等,当服务器端响应返回时,客户端利用一个 Javascript
函数对返回值进行处理,以更新页面上的部分元素的值而不必刷新整个页面,从而带来更好的客户体验。但很多时候这种异步事件只是在很小一部分的情况下才会发
生,那么怎么保证一旦服务器端有了响应之后客户端马上就知道呢,我们有两种方法来解决这个问题,一是让浏览器每隔几秒请求服务器来获得更改,称之为轮询。
二是服务器维持与浏览器的长时间的连接来传递数据,长连接的技术称之为Comet
。轮询的主要缺点是产生了大量的传输浪费;而如果使用Comet
技术的
话,客户端和服务器端之间必须保持一个长连接,一般来讲,服务器端的一个Servlet
会独占一个线程,如果有大量客户端维持长连接,会给服务器端的处理
能力带来很大的挑战。
针对上述情况,Jetty
利用Java
语言的非堵塞I/O
技术来处理并发的大量连接。具体说来,Jetty
实现了一个
基于java.nio API
的SelectChannelConnector
,允许它维持每个连接开放而不用消耗一个线程。当连接挂起时,Connector
将请求维持在未决 Continuations
队列里,用来服务请求的线程返回给TheadPool
,这样,该线程又可以服务于其他请求。暂停的请求停留在未决 Continuations
队列里直到指定的过期时间,或者在它的Continuation
上调用resume()
方法。
Jetty Vs Tomcat
¶
Tomcat
作为第一款成功的web
容器,具有广大的用户群体。从表面功能上Jetty
和Tomcat
都是差不多的,都提供Http Server
和Servlet
容器功能,下面我们从几个方面比较两者的差异:
- 从构架方面
Tomcat主要是作为JSP/Servlet最新规范的参考实现而设计,属于学 院派,但是显得庞大而杂乱。最常见的Tomcat使用方式是将其作为一个服务器软件安装到操作系统上,然后在里面部署web应用,如果嵌入到其他JEE服 务器中以提供Web容器功能或者作为组件嵌入到其他应用中,操作起来比较麻烦。
Jetty是由多个可以独立运行的构件通过彼此之间可插拔的接口组装在一起,其使用可以非常灵活。目前,Jetty在Geronimo、JBoss、Sybase EAServer、JOnAS和Glassfish等JEE应用服务器中提供Web容器功能。
- 从性能方面
Tomcat在耗时请求连接数量不多时,也就是大多数请求能非常短的时间处理完毕的情况下,具有较好的执行效率。
Jetty 在存在大量并发连接,大多数连接又需要更多的处理时间(业务逻辑计算占用的时间)的情况下(这种情况是目前大多数web应用具有的特点),具有更好的性能 和伸缩性。Jetty的这个优势得益于Continuation机制,这样可以把有限的内存资源更多的留给应用程序使用。在静态文件服务方面,Jetty 也具有更好的性能。这是由于Jetty使用了文件内存映射机制和NIO来对静态内容进行输入输出,这种方式将占用更少的系统内存和更快发送速度。
- 从标准规范方面
Tomcat曾是sevlet2.4规范的参考实现,从Servlet2.5之后,Tomcat不再是参考实现了,Sun公司自己创建了Glassfish,并作为Servlet2.5、Servlet3.0、Jsp2.1的参考实现。
Jetty在执行规范方面做的非常好,是Servlet2.5规范的一个优秀实现。在Servlet3.0中,Jetty自有的continuation机制也成为规范备选方案之一。
参考资料
¶
- http://www.ibm.com/developerworks/cn/web/wa-lo-jetty/
- http://docs.codehaus.org/display/JETTY/Jetty+Wiki
三、确定开发工具
由以上说明可以确定,jetty
的项目是通过eclipse+jetty
服务器开发,而eclipse
和jetty
都是跨平台开发工具,且均为免费使用,是开发项目工具的首选,而且不用在乎开发所在的平台是windows
还是Linux
。jetty
本身是一个servlet
容器,可以发布servlet
项目,同时也支持jsp
项目,但对jsp
支持不是很好。Jetty
服务器还有一个好处就是可以把发布在tomcat
里的jsp
和servlet
项目稍作修改进行发布,实际效果怎样还需要测试才能知道。