4 buffalo.jar 包分析

 

4.1 概述

Buffalo.jar包一共包含的82JAVA文件,大体的类结构如下(对于我们常用的先关类和处理流程进行分析):

4.1.1 包介绍

正常运行buffalo.jar包需要的第三方包:spring.jar(如果你需要集成Spring开发环境),junit.jar

buffalo.jar包含的接口和类一共是83个,主要有protocalrequestserviceviewweb几个包。

4.1.2 buffalo.jar 的处理流程

如果用最简单的形式描述如下:

客户端组装XMLà服务端解释出调用的方法和参数信息à通过反射调用服务方法并返回值à将返回值转化为相关xml字符串à客户端解释服务器返回的XML字符串。

1web启动的时候(或者第一次调用Buffalo服务)就会初始化ApplicationServlet类,创建/获取了一个服务仓库(ServiceRepository)。

2、客户端请求服务,根据请求的路径调用不同的RequestWorker实现类BuffaloWorker ,ViewWorker(目前版本还没有实现),, UploadWorker(目前版本还没有实现),因为buffalo目前的版本只实现了BuffaloWorker类,所以主要介绍BuffaloWorker的处理流程。

3BuffaloWorker先验证请求的类型(getpost,请求方式应该为post

4BuffaloWorker对请求进行处理,主要是调用BuffaloInvokerinvoke()方法做如下事情:

1)        获取BuffaloInvoker实例: BuffaloInvoker.getInstance()方法获取BuffaloInvoker的实例并且用new OutputStreamWriter(response.getOutputStream(), utf-8)封装输出流。

2)        解释请求的输入流:通过BuffaloProtocal.getInstance()获取BuffaloProtocal实例后,调用unmarshall(inputStream)方法构造BuffaloCall 对象。调用MarshallingStrategy接口的默认实现类DefaultMarshallingStrategyunmarshal方法,获取BuffaloCall想象。BuffaloCall包含了服务的相关属性:方法(methodName),参数(arguments),argumentTypes(参数类型))。

 

3)        调用服务:根据解析出来的参数信息,通过反射机制调用类的相关方法。

 

4)        组装信息并返回:获取服务的返回方法,并组装成XML形式的字符串。

 

4.2 重点介绍

因为时间的关系,这里只对buffalo.jar包中几个比较重要的知识点进行介绍,了解这几个知识点以后,你也可以开发一个自己的RIA框架了 :)。

4.2.1 输入流解释

Buffalo客户端的是以固定格式的XML形式字符串请求到服务端,所以对XML字符串解释buffalo没有利用第三方的包,首先应该了解客户端发送到传送到服务端的XML字符串形式,如下:

          testUser

         

            buffalo.jianglike.test.User

            name

            32323

               memo

               2323232

            

2222

        

主要包含三层信息,大体是这样的:根节点是固定为“buffalo-call”;根节点下的第一个子节点也是固定为“method”(即调用的服务方法,如上请求的方法为testUser);接下来就是方法的参数,上面包含调用方法的两个参数:第一个参数为Javabeanbuffalo.jianglike.test.User);第二个参数为为一个字符串值为2222

因为客户端组装XML字符串的时候有固定的顺序,所以解释也是按照固定的顺序进行。

1、  逐个读取输入流的单个字符,读到空格或者空行等忽略,直到读到第一个字符“<”。

2、  逐个读取“<”字符后的字符并且存储在一个临时变量,直到读取到“>”字符。

3、  判断 临时变量的值是否为buffalo-call,如果否,抛出标签异常,否则将标签值入栈。

4、  重复 1 2 步,获取客户端请求的方法名(testUser)和标签(method)。

5、  重复 1 2 步,获取标签 ,并且判断栈顶标签是否与该标签匹配,如果不匹配抛标签异常。

6、  重复 1 2 步,获取方法参数的类型和值,并用相应的转化器进行转化。

7、  重复6步骤 知道所有的参数转化完成。

 


 

 5. 个人建议

l     应该考虑客户端的内存及时的释放,如果数据量比较大,客户端内存没有及时的释放,轻则导致操作缓慢,重则导致IE崩溃掉。

l     客户端传递与后台绑定参数信息容易出现类型转化的异常。

l     Buffalo.Form.formToBean 这个方法有一个缺陷 就是一个Form表单的所有元素只能是一个对象的成员。

 

你可能感兴趣的:(xml,string,spring,service,ria,服务器)