用jabsorb(json) for java编写AJAX应用程序

简介:
jabsorb 是一种基于Ajax/Web 2.0 的简单轻便的框架,可用于在Web 浏览中通过HTTP 请求向服务端发送请求,并获得响应数据。实际上jabsorb 就是json 的升级版(不仅改了个名,而且包名都改了),目前最新版本是1.3
老版本的json 可以从 http://oss.metaparadigm.com/jsonrpc/download.html 下载。
jabsorb 可以从http://jabsorb.org/Download 下载。
jabsorb json 基础上有了很大的改进,从1.2 版开始支持ORB 和循环引用(Circular References )。使用jabsorb 至少有以下两个好处:

1. 
jabsorb 中已经支持IE, Mozilla , Firefox , Safari , Opera, Konqueror  等浏览器,因此,使用jabsorb 编写的AJAX 程序也就可以跨不同的Web 浏览器。
2.  使用jabsorb 在客户端和服务端传递数据非常方便。在客户端可以象使用本地对象一样使用服务端的对象。

     下面我们就来看一下如何使用jabsorb 来编写基于AJAX Web 程序。本文使用Tomcat6.x 作为Web 服务器,读者可以根据需要使用其他的Web 服务器。

一、jabsorb的安装
安装jabsorb 需要如下几步:

1 步:加入jar
jabsorb 需要三个jar 包:jsonrpc-1.0.jar jsonrpc-1.0.jar slf4j-api-1.4.2.jar ,这三个文件都可以在jabsorb 的压缩包中找到。将这三个文件放到<Tomcat 安装目录>"lib 目录中,或是放到<Web 根目录>"WEB-INF"lib 目录中。
2 步:配置web.xml
     打开 <Web 根目录 >\WEB-INF\web.xml ,并加入如下的配置代码:

   < servlet >
    
< servlet-name > JSONRPCServlet </ servlet-name >
    
< servlet-class > org.jabsorb.JSONRPCServlet </ servlet-class >
   
    
< init-param >
      
< param-name > gzip_threshold </ param-name >
      
< param-value > 0 </ param-value >
    
</ init-param >
  
</ servlet >
  
< servlet-mapping >
    
< servlet-name > JSONRPCServlet </ servlet-name >
    
< url-pattern > /JSON-RPC </ url-pattern >
  
</ servlet-mapping >

这段代码配置了一个jabsorb 引擎,实际上就是一个Servlet (和Struts1.x 类似,也是通过Servlet 作为入口的)。其中gzip_threshold 可以取-1 0 和一个正整数。如果值为-1 ,表示不会对响应的内容进行压缩,如果为0 ,表示对响应的所有内容进行压缩,如果为一个正整数,表示当响应内容超过这个整数时, 进行压缩。
但当浏览器不支持gzip 压缩格式,或是经过压缩后的尺寸要比不压缩的尺寸还大时(当响应内容比较少时可能发生这种情况),jabsorb 就不会对响应内容进行压缩。因此,最好将这个值设为0 ,但这样做所付出的代价是可能会对所有的响应内容进行压缩。具体要设成什么值,读者可根据自己的具体情况决定。
3   jsonrpc.js 复制到<Web 根目录>\script 中,读者也可以将其放到<Web 根目录> 中的其他可访问的位置。这个文件也可以在jabsorb 的压缩包中找到。

二、编写一个简单的jabsorb应用程序

1 编写一个用客户端访问的 Java 类。

package  invoke;

public   class  Message  implements  java.io.Serializable
{
    
public  String getMessage(String s)
    {
        
return   " 你好   "   +  s;
    }    
}

2    编写 JSP 代码
<!--[if !supportLineBreakNewLine]--><!--[endif]-->


<% --   index.jsp   -- %>

<% @ page language = " java "  import = " java.util.* "  pageEncoding = " GB18030 " %>

<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
< html >
    
< head >
< script  type ="text/javascript"  src ="script/jsonrpc.js" ></ script >
< script  type ="text/javascript" >
function  onLoad()
{
    jsonrpc 
=   new  JSONRpcClient( " JSON-RPC " );
}
window.onload 
=  onLoad;

function  invoke()
{
    
var  text  =  document.getElementById( " text " );
    
var  result  =  jsonrpc.msg.getMessage(text.value);
    alert(result);
}
</ script >
< jsp:useBean  id ="JSONRPCBridge"  scope ="session"
   class
=" org.jabsorb.JSONRPCBridge "   />
< jsp:useBean  id ="message"  scope ="session"  
     class
="invoke.Message"   />
<%  
JSONRPCBridge.registerObject(
" msg " , message);
%>
</ head >
 
    
< body >
    
< input type = " text "  id = " text " />
    
< input type = " button "  value = " 获得信息 "  onclick = " invoke() "   />         
    
</ body >
</ html >

在这个jsp 文件中需要做如下四件事才能调用getMessage 方法。
1          引用jsonrpc.js 文件。
2          onLoad 函数中创建JSONRpcClient 对象。JSONRpcClient 类的构造方法的参数值就是在web.xml 中配置的JSON-RPC
3          使用<jsp:userBean> 创建了org.jabsorb. JSONRPCBridge invoke.Message 对象
4          使用JSONRPCBridge registerObject 方法注册Message 类,其中第一个参数可以是任意的字符串(这个参数是注册名),第二个参数是Message 对象实例。registerObject 方法可以对同一个注册名使用多次,但后一个将覆盖前一个对象。
在做完上述工作后,就可以使用jsonrpc.msg.getMessage 来调用getMessage 方法了。
三、在Servlet中使用 jabsorb

    
除了在 JSP 中使用 jabsorb 外,也可以在 Servlet 中使用它。代码如下:

public   void  service(HttpServletRequest request, HttpServletResponse response)
            
throws  ServletException, IOException
    HttpSession session 
=  request.getSession();
    JSONRPCBridge bridge 
=  (JSONRPCBridge) session.getAttribute( " JSONRPCBridge " );
    if (bridge  ==   null )
    {
        bridge 
=   new  JSONRPCBridge();
        session.setAttribute(
" JSONRPCBridge " , bridge);
    }
    bridge.registerObject(
" msg " , message);
     
}

从上面的代码可以看出,在Servlet 中使用jabsorb ,实际上就是使用registerObject 方法来注册Message 类。然后可以forward 到使用jabsorb JSP 页面,也可以使用PrintWriter 在当前Servlet 中输出相应的javascript html 代码。
四、注册全局对象

    
使用registerObject 注册的对象只能在当前页面访问。如果想注册一次,就可以任何运行在当前Web 服务器的页面(JSP HTML 等)中使用这个对象,就需要使用如下的代码来注册Message 对象:

 JSONRPCBridge.getGlobalBridge().registerObject( " globalMsg " , message);

     读者可以将上面的相应代码换成这行代码,然后另建立一个 test.jsp ,然后使用如下的代码调用 getMessage 方法:


< script type = " text/javascript "  src = " script/jsonrpc.js " ></ script >
< script type = " text/javascript " >
try
{
    jsonrpc 
=   new  JSONRpcClient( " JSON-RPC " );
    //  如果将globalMsg换成msg,将抛出[object error]错误
     var  result  =  jsonrpc.globalMsg.getMessage( " bill " );
    alert(result);
 }
catch (e)
{
  alert(e);
}
</ script >

但经笔者测试,在firefox 中访问test.jsp ,竟然可以访问msg 对象,但在IE 里就会抛出对象错误异常。
    
五、访问集合类型

    
如果反回的数据很多的话,可以使用 Java 提供的集合类型,如将 Message 因扩展为如下形式:

package  invoke;

public   class  Message  implements  java.io.Serializable
{
    
public  String getMessage(String s)
    {
        
return   " 你好   "   +  s;
    }
    
public  java.util.List getList()
    {
        java.util.List list 
=   new  java.util.LinkedList();
        list.add(
" 中国 " );
        list.add(
1234 );
        
return  list;
    }
    
    
public  java.util.Map getMap()
    {
        java.util.Map map 
=   new  java.util.HashMap();
        map.put(
" bird " " " );
        map.put(
" human " " 人类 " );
        
return  map;
    } 
}

index.jsp 中可加入如下的代码来访问 getList getMap 方法中的数据:

<script type="text/javascript">
jsonrpc = new JSONRpcClient("JSON-RPC");
alert(jsonrpc.globalMsg.getList().list[1]);
    alert(jsonrpc.globalMsg.getMap().map['bird']);
</script>

六、异步调用

    
上面的代码都是同步调用,也就是在反回结果之前,客户端程序会被阻塞。为了在网络环境不畅的环境下Web 程序仍然能运行良好,这就需要进行异步调用。也就是说,客户端在发送请求后立即返回,直接服务端返回信息,才会调用另一个“回调函数”来获取结果。
回调函数必须有两个参数,第一个参数表示返回值,第二个参数表示异常信息。如果无异常信息,第二个参数值为null 。下面是一个回调函数:

function  asyc(result,e)
{
    if (e  ==   null )
        alert(result);
}

可以使用下面的代码以异步方式来调用getMessage 方法:

    jsonrpc.msg.getMessage(asyc, 'bill');
从上面的代码可以看出,异步调用和同步调用的区别就是异步调用需要将回调函数作为方法的第一个参数传入被调用的方法。后面跟着被调用方法的参数值。






 本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/215327,如需转载请自行联系原作者

相关文章
|
2月前
|
人工智能 安全 Java
Java和Python在企业中的应用情况
Java和Python在企业中的应用情况
61 7
|
2月前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
162 3
|
27天前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
84 25
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
|
10天前
|
安全 算法 Java
Java CAS原理和应用场景大揭秘:你掌握了吗?
CAS(Compare and Swap)是一种乐观锁机制,通过硬件指令实现原子操作,确保多线程环境下对共享变量的安全访问。它避免了传统互斥锁的性能开销和线程阻塞问题。CAS操作包含三个步骤:获取期望值、比较当前值与期望值是否相等、若相等则更新为新值。CAS广泛应用于高并发场景,如数据库事务、分布式锁、无锁数据结构等,但需注意ABA问题。Java中常用`java.util.concurrent.atomic`包下的类支持CAS操作。
41 2
|
2月前
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
101 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
2月前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
238 12
基于开源框架Spring AI Alibaba快速构建Java应用
|
2月前
|
缓存 Java 开发者
Java多线程并发编程:同步机制与实践应用
本文深入探讨Java多线程中的同步机制,分析了多线程并发带来的数据不一致等问题,详细介绍了`synchronized`关键字、`ReentrantLock`显式锁及`ReentrantReadWriteLock`读写锁的应用,结合代码示例展示了如何有效解决竞态条件,提升程序性能与稳定性。
150 6
|
1月前
|
监控 Java 数据库连接
Java线程管理:守护线程与用户线程的区分与应用
在Java多线程编程中,线程可以分为守护线程(Daemon Thread)和用户线程(User Thread)。这两种线程在行为和用途上有着明显的区别,了解它们的差异对于编写高效、稳定的并发程序至关重要。
35 2
|
2月前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
66 6
|
2月前
|
关系型数据库 MySQL Java
MySQL索引优化与Java应用实践
【11月更文挑战第25天】在大数据量和高并发的业务场景下,MySQL数据库的索引优化是提升查询性能的关键。本文将深入探讨MySQL索引的多种类型、优化策略及其在Java应用中的实践,通过历史背景、业务场景、底层原理的介绍,并结合Java示例代码,帮助Java架构师更好地理解并应用这些技术。
52 2