第一次接触mina这个物件,在网上看了一些相关的资料,同时也参考了别人的一些分析mina的心得和方式!
mina是何物?
Mina是一个用于开发高性能和高可用性的网络应用程序基础架构,它封装了底层的I/O和线程并发等复杂工作。
Mina主要是基于java NIO类库开发;采用非阻塞方式的异步传输、事件驱动、批量数据传输;支持TCP、UDP网络协议
首先从服务器端启动NioSocketAcceptor对象进行分析。
1、实例化DefaultSocketSessionConfig会话配置器和异步传输NioProcessor处理器
2、实例化AbstractPollingIoAcceptor构造器同时实例化SimpleIoProcessorPool处理器池
--〉在SimpleProcessorPool中初始化执行器<线程池>,然后初始化一个IoProcessor对象数组,长度为3,最后将处理器对象放入到IoProcessor数组中
--〉处理化传输带元数据
--〉初始化服务监视器
--〉初始化异常监视器
3、初始化过滤链
4、初始化选择器
架构介绍
应用结构图
深入分析结构图
mina的基本应用可以分为3层:
1、I/O Serivce:实际执行I/O层
2、I/OFilter chain:数据过滤和转换层,主要是把字节转换为需要的数据格式或者反过来处理
3、I/OHandler:业务处理层
创建Mina应用分为3部分:
1、创建I/O 2、创建过滤链
3、创建I/O业务处理
Dojo介绍
Dojo 是一个用javascript语言实现的开源DHTML工具包。它是在几个项目捐助基础上建立起来的(nWidgets, Burstlib, f(m)), 这也是为什么叫它a \"unified\" toolkit的原因。Dojo的目标是解决开发DHTML应用程序遇到的那些,长期存在 、历史问题。historical problems with DHTML 跨浏览器问题。Dojo让你更容易 使web页面具有动态能力,或在任何稳健的支持javascript语言的环境中发挥作用。
a、利用dojo提供的组件,你可以提升你的web应用程序可用性、交互能力以及功能上的提高;
b、你也可以 更容易的建立degradeable user interfaces ??,dojo提供小巧的 widgets ,animate transitions;
c、利用它的低级APIs和可兼容的代码,写出轻便的、单一风格(复杂)的javascript代码,Dojo的 event system, I/O APIs, and generic language enhancement form the basis of a powerful programming environment.
d、通过Dojo提供的工具,你可以为你的代码写命令行式的单元测试代码。
e、the Dojo package system使你自己的代码更容易维护,偶合性更低。
Dojo通过很少的代码完成了以上的功能。(以后可能我详细说说dojo的package system ,只需要三个js文件)。当你写脚本时,只需要包含很少的js文件(大小)。也可以选择的(包含)下载dojo提供的庞大的功能。Dojo provides MultiplePointsOfEntry, InterpreterIndependence, ForwardLookingAPIs, and focuses on ReducingBarriersToAdoption.
dojo试图建立一种新的标签语言DojoML。目标是,在DojoML和javascript脚本语言不变的情况下,用不同的render方式展示数据, Renderings may be made available in several rendering contexts (such as SVG, or perhaps even the desktop or Flash)。(比较美好啊)更进一步,the DojoML 剖析器可以接受html和svg为输入,容易的建立DegradeableResponsiveApplications。
第一部分 安装
第一个小节 怎么安装Dojo Toolkit
Dojo在磁盘上只是一堆文件,它不需要特殊的设置,它可以通过以下三种途径获得:
1、可以从google的内容分布网络获得
加载的方法可以参考http://code.google.com/intl/zh-CN/apis/ajaxlibs/documentation/index.html#dojo
2、.在你自己的服务器上使用Dojo
a、下载最新的dojo包,地址:http://dojotoolkit.org/downloads;目前最新的包为1.3.1
b、解压下载的压缩文件
--dojo-release-1.3.1-src
----dijit
----dojo
----dojox
----util
c、可以通过D:\Apache-Source\dojo\1.3.1\dojo-release-1.3.1-src\dojo-release-1.3.1-src\dijit\themes\themeTester.html 这样的路径来查看相关的JS例子
3、每日构建代码
你可以通过SVN地址获得
For instance, Dojo Core repository is:
http://svn.dojotoolkit.org/src/dojo/trunk
There are two versions of this view: anonymous and committer.
For users (readonly):
http://svn.dojotoolkit.org/src/view/anon/all/trunk
For committers (read/write):
https://svn.dojotoolkit.org/src/view/committer/all/trunk
第二部分 Ajax
第一个小节 ajax
a、ajax and Dojo
1)XHR选项
例子:
// post some data, ignore the response:
dojo.xhrPost({
form: "someFormId", // read the url: from the action="" of the <form>
timeout: 3000, // give up after 3 seconds
content: { part:"one", another:"part" } // creates ?part=one&another=part with GET, Sent as POST data when using xhrPost
});
// get some data, convert to JSON
dojo.xhrGet({
url:"data.json",
handleAs:"json",
load: function(data){
for(var i in data){
console.log("key", i, "value", data[i]);
}
}
});
2)XHR回调
有三种方法可以附加到XHR选择对象,以确定当数据回调时该怎么做。
如果不输入绝对的URL访问地址,例如:URL=http://localhost:8080/petstore;则Glassfish能够自动的搜索项目中是否存在index.html或者index.jsp页面作为入口页面。
CatalogFacade对象在服务器启动时被实例化,然后将实例化的CatalogFacade对象放置到ServletContext环境中,这样可以直接从ServletContext环境中取得CatalogFacade对象进行相关数据方法的调用。
index.jsp中涉足到一个js框架DOJO,这个需要进一步的学习。
对数据的增、删、改、查主要用到了JPA来处理。
由于PetStore涉及到了jsf,那就没有办法了,还是先看看JSF
--------------------------------------------------------------------------
JSF是有JCP(JAVA Community Process)团队研发出来的一套标准,并在2004年3月发表JavaServer Faces1.0成果。
看到一篇内容对初学者目前jsf的了解很重要:注意这篇文章是2006年的内容
JSF1.1 , JSF1.2 , myfaces,oracle ADF,ajax4jsf , facelets, 它们究竟是什么,有什么关系呢?
JSF1.1 、 1.2 都是 JSF 的标准,定义例如接口、规范( JSF 是面向接口编程的),必须通过实现才能被我们所使用,而实现包括有 JSF RI(Reference Implementation) ,还有 myfaces core1.1.4 的实现等。 JSF RI 是 SUN 对 JSF 的实现,相对来说兼容性比较好,也比较稳定(因为 1.1 已经很久没更新过了,已经转向 1.2 去了),而 myfaces 更新比较快,功能也比较多一点,初学的推荐 JSF RI1.1 就可以了, 1.2 需要新的 servlet2.5/jsp2.1 以及服务器支持,现在还不稳定。
myfaces ,它是一个大的项目,下面有几个子项目,分别是 myfaces core, sandbox ,tabago,tomahawk ,(奇怪的名字,好难说,我简称它为 TOM ),还有一个新的 ADF Faces (跟 oracle adf 有关,应该是兼容整合 adf 的功能吧)。 Tabago,tom 都是组件库, tabago 比较好玩的是支持换肤,还有一些支持 ajax 的组件, TOM 则是一个丰富的增强组件库,大概有三十个之多,例如 TREE , TAB 等等。 Sandbox 是测试用的。
Oracle ADF 是 oracle 为 jsf 做的一个大型的组件库,以前是收费的,现在开源了,我没用过,不好说。
Ajax4jsf 是为 jsf 提供 AJAX 支持的一个标签库,使用它提供的标签,就能在原有的 JSF 程序上轻易的加上 AJAX 的功能,而且不用写任何 Javascript 。
Facelets 这个是很激动人心的一个框架,有了这个框架才把 JSF 的组件化发挥出来,通过模板的方式来组合成我们所需要的组件,而且可以不使用 <h:input> 这样的标签库,而用 <input type=”text” jsfc=”h:input”> 这样的方式来使用组件,这样就可以方便的使用 UI 可视化工具去开发我们的 WEB 程序。这个框架我会在以后的文章中详细的说,以及和 jsp2.0 的模板功能作对比。
--------------------------------------------------------------------------------
JSF的session超时问题会在页面上抛出如下异常:
javax.faces.application.ViewExpiredException: viewId:/pages/index.faces - View /pages/index.faces could not be restored.
at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:185)
at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
解决方案:
在web.xml中添加如下代码:
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/pages/SessionRefire.jsp</location>
</error-page>
----------------------------------------------------
注意:所有的JSF标签一定要包含在<f:view></f:view>这个节点中,不然会报一下问题:
javax.servlet.ServletException: Component javax.faces.component.UIViewRoot@f1fad1 not expected type. Expected: javax.faces.component.UIOutput. Perhaps you're missing a tag?
javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)