Buffalo.jar包一共包含的82个JAVA文件,大体的类结构如下(对于我们常用的先关类和处理流程进行分析):
正常运行buffalo.jar包需要的第三方包:spring.jar(如果你需要集成Spring开发环境),junit.jar
buffalo.jar包含的接口和类一共是83个,主要有protocal,request,service,view,web几个包。
如果用最简单的形式描述如下:
客户端组装XML字à服务端解释出调用的方法和参数信息à通过反射调用服务方法并返回值à将返回值转化为相关xml字符串à客户端解释服务器返回的XML字符串。
1、web启动的时候(或者第一次调用Buffalo服务)就会初始化ApplicationServlet类,创建/获取了一个服务仓库(ServiceRepository)。
2、客户端请求服务,根据请求的路径调用不同的RequestWorker实现类BuffaloWorker ,ViewWorker(目前版本还没有实现),, UploadWorker(目前版本还没有实现),因为buffalo目前的版本只实现了BuffaloWorker类,所以主要介绍BuffaloWorker的处理流程。
3、BuffaloWorker先验证请求的类型(get或post),请求方式应该为post。
4、BuffaloWorker对请求进行处理,主要是调用BuffaloInvoker的invoke()方法做如下事情:
1) 获取BuffaloInvoker实例: BuffaloInvoker.getInstance()方法获取BuffaloInvoker的实例并且用new OutputStreamWriter(response.getOutputStream(), “utf-8“)封装输出流。
2) 解释请求的输入流:通过BuffaloProtocal.getInstance()获取BuffaloProtocal实例后,调用unmarshall(inputStream)方法构造BuffaloCall 对象。调用MarshallingStrategy接口的默认实现类DefaultMarshallingStrategy的unmarshal方法,获取BuffaloCall想象。BuffaloCall包含了服务的相关属性:方法(methodName),参数(arguments),argumentTypes(参数类型))。
3) 调用服务:根据解析出来的参数信息,通过反射机制调用类的相关方法。
4) 组装信息并返回:获取服务的返回方法,并组装成XML形式的字符串。
因为时间的关系,这里只对buffalo.jar包中几个比较重要的知识点进行介绍,了解这几个知识点以后,你也可以开发一个自己的RIA框架了 :)。
Buffalo客户端的是以固定格式的XML形式字符串请求到服务端,所以对XML字符串解释buffalo没有利用第三方的包,首先应该了解客户端发送到传送到服务端的XML字符串形式,如下:
主要包含三层信息,大体是这样的:根节点是固定为“buffalo-call”;根节点下的第一个子节点也是固定为“method”(即调用的服务方法,如上请求的方法为testUser);接下来就是方法的参数,上面包含调用方法的两个参数:第一个参数为Javabean(buffalo.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表单的所有元素只能是一个对象的成员。