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

简介: 用jabsorb(json) for java编写AJAX应用程序本文为原创,如需转载,请注明作者和出处,谢谢!jabsorb是一种基于Ajax/Web 2.0的简单轻便的框架,可用于在Web浏览中通过HTTP请求向服务端发送请求,并获得响应数据。
用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代码


<%--  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="获得信息"  />        
    </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');

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

相关文章
|
1月前
|
存储 数据采集 搜索推荐
Java 大视界 -- Java 大数据在智慧文旅旅游景区游客情感分析与服务改进中的应用实践(226)
本篇文章探讨了 Java 大数据在智慧文旅景区中的创新应用,重点分析了如何通过数据采集、情感分析与可视化等技术,挖掘游客情感需求,进而优化景区服务。文章结合实际案例,展示了 Java 在数据处理与智能推荐等方面的强大能力,为文旅行业的智慧化升级提供了可行路径。
Java 大视界 -- Java 大数据在智慧文旅旅游景区游客情感分析与服务改进中的应用实践(226)
|
1月前
|
机器学习/深度学习 数据采集 数据可视化
Java 大视界 -- 基于 Java 的大数据可视化在城市空气质量监测与污染溯源中的应用(216)
本文探讨Java大数据可视化在城市空气质量监测与污染溯源中的创新应用,结合多源数据采集、实时分析与GIS技术,助力环保决策,提升城市空气质量管理水平。
Java 大视界 -- 基于 Java 的大数据可视化在城市空气质量监测与污染溯源中的应用(216)
|
1月前
|
存储 监控 数据可视化
Java 大视界 -- 基于 Java 的大数据可视化在企业生产运营监控与决策支持中的应用(228)
本文探讨了基于 Java 的大数据可视化技术在企业生产运营监控与决策支持中的关键应用。面对数据爆炸、信息孤岛和实时性不足等挑战,Java 通过高效数据采集、清洗与可视化引擎,助力企业构建实时监控与智能决策系统,显著提升运营效率与竞争力。
|
1月前
|
Java 大数据 数据处理
Java 大视界 -- 基于 Java 的大数据实时数据处理在工业互联网设备协同制造中的应用与挑战(222)
本文探讨了基于 Java 的大数据实时数据处理在工业互联网设备协同制造中的应用与挑战。文章分析了传统制造模式的局限性,介绍了工业互联网带来的机遇,并结合实际案例展示了 Java 在多源数据采集、实时处理及设备协同优化中的关键技术应用。同时,也深入讨论了数据安全、技术架构等挑战及应对策略。
|
1月前
|
数据采集 搜索推荐 Java
Java 大视界 -- Java 大数据在智能教育虚拟学习环境构建与用户体验优化中的应用(221)
本文探讨 Java 大数据在智能教育虚拟学习环境中的应用,涵盖多源数据采集、个性化推荐、实时互动优化等核心技术,结合实际案例分析其在提升学习体验与教学质量中的成效,并展望未来发展方向与技术挑战。
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
Java 大视界 -- Java 大数据机器学习模型在自然语言生成中的可控性研究与应用(229)
本文深入探讨Java大数据与机器学习在自然语言生成(NLG)中的可控性研究,分析当前生成模型面临的“失控”挑战,如数据噪声、标注偏差及黑盒模型信任问题,提出Java技术在数据清洗、异构框架融合与生态工具链中的关键作用。通过条件注入、强化学习与模型融合等策略,实现文本生成的精准控制,并结合网易新闻与蚂蚁集团的实战案例,展示Java在提升生成效率与合规性方面的卓越能力,为金融、法律等强监管领域提供技术参考。
|
1月前
|
存储 人工智能 算法
Java 大视界 -- Java 大数据在智能医疗影像数据压缩与传输优化中的技术应用(227)
本文探讨 Java 大数据在智能医疗影像压缩与传输中的关键技术应用,分析其如何解决医疗影像数据存储、传输与压缩三大难题,并结合实际案例展示技术落地效果。
|
1月前
|
机器学习/深度学习 安全 Java
Java 大视界 -- Java 大数据在智能金融反洗钱监测与交易异常分析中的应用(224)
本文探讨 Java 大数据在智能金融反洗钱监测与交易异常分析中的应用,介绍其在数据处理、机器学习建模、实战案例及安全隐私等方面的技术方案与挑战,展现 Java 在金融风控中的强大能力。
|
1月前
|
机器学习/深度学习 算法 Java
Java 大视界 -- Java 大数据机器学习模型在生物信息学基因功能预测中的优化与应用(223)
本文探讨了Java大数据与机器学习模型在生物信息学中基因功能预测的优化与应用。通过高效的数据处理能力和智能算法,提升基因功能预测的准确性与效率,助力医学与农业发展。
|
1月前
|
机器学习/深度学习 搜索推荐 数据可视化
Java 大视界 -- Java 大数据机器学习模型在电商用户流失预测与留存策略制定中的应用(217)
本文探讨 Java 大数据与机器学习在电商用户流失预测与留存策略中的应用。通过构建高精度预测模型与动态分层策略,助力企业提前识别流失用户、精准触达,实现用户留存率与商业价值双提升,为电商应对用户流失提供技术新思路。