<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
    數(shù)據(jù)加載中……

    用jabsorb(json) for java編寫AJAX應(yīng)用程序

    本文為原創(chuàng),如需轉(zhuǎn)載,請注明作者和出處,謝謝!

    jabsorb是一種基于Ajax/Web 2.0的簡單輕便的框架,可用于在Web瀏覽中通過HTTP請求向服務(wù)端發(fā)送請求,并獲得響應(yīng)數(shù)據(jù)。實(shí)際上jabsorb就是json的升級版(不僅改了個名,而且包名都改了),目前最新版本是1.3

    老版本的json可以從http://oss.metaparadigm.com/jsonrpc/download.html下載。

    jabsorb可以從http://jabsorb.org/Download下載。

    jabsorbjson基礎(chǔ)上有了很大的改進(jìn),從1.2版開始支持ORB和循環(huán)引用(Circular References)。使用jabsorb至少有以下兩個好處:

    1. 
    jabsorb中已經(jīng)支持IE, Mozilla , Firefox , Safari , Opera, Konqueror 等瀏覽器,因此,使用jabsorb編寫的AJAX程序也就可以跨不同的Web瀏覽器。

    2. 使用jabsorb在客戶端和服務(wù)端傳遞數(shù)據(jù)非常方便。在客戶端可以象使用本地對象一樣使用服務(wù)端的對象。

        下面我們就來看一下如何使用jabsorb來編寫基于AJAXWeb程序。本文使用Tomcat6.x作為Web服務(wù)器,讀者可以根據(jù)需要使用其他的Web服務(wù)器。


    一、jabsorb的安裝

    安裝jabsorb需要如下幾步:

    1步:加入jar

    jabsorb需要三個jar包:jsonrpc-1.0.jarjsonrpc-1.0.jarslf4j-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引擎,實(shí)際上就是一個Servlet(和Struts1.x類似,也是通過Servlet作為入口的)。其中gzip_threshold可以取-10和一個正整數(shù)。如果值為-1,表示不會對響應(yīng)的內(nèi)容進(jìn)行壓縮,如果為0,表示對響應(yīng)的所有內(nèi)容進(jìn)行壓縮,如果為一個正整數(shù),表示當(dāng)響應(yīng)內(nèi)容超過這個整數(shù)時,進(jìn)行壓縮。

    但當(dāng)瀏覽器不支持gzip壓縮格式,或是經(jīng)過壓縮后的尺寸要比不壓縮的尺寸還大時(當(dāng)響應(yīng)內(nèi)容比較少時可能發(fā)生這種情況),jabsorb就不會對響應(yīng)內(nèi)容進(jìn)行壓縮。因此,最好將這個值設(shè)為0,但這樣做所付出的代價是可能會對所有的響應(yīng)內(nèi)容進(jìn)行壓縮。具體要設(shè)成什么值,讀者可根據(jù)自己的具體情況決定。

    3 jsonrpc.js復(fù)制到<Web根目錄>\script中,讀者也可以將其放到<Web根目錄>中的其他可訪問的位置。這個文件也可以在jabsorb的壓縮包中找到。

    二、編寫一個簡單的jabsorb應(yīng)用程序

    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="獲得信息" onclick="invoke()" />        
        
    </body>
    </html>

    在這個jsp文件中需要做如下四件事才能調(diào)用getMessage方法。

    1         引用jsonrpc.js文件。

    2         onLoad函數(shù)中創(chuàng)建JSONRpcClient對象。JSONRpcClient類的構(gòu)造方法的參數(shù)值就是在web.xml中配置的JSON-RPC

    3         使用<jsp:userBean>創(chuàng)建了org.jabsorb. JSONRPCBridgeinvoke.Message對象

    4         使用JSONRPCBridgeregisterObject方法注冊Message類,其中第一個參數(shù)可以是任意的字符串(這個參數(shù)是注冊名),第二個參數(shù)是Message對象實(shí)例。registerObject方法可以對同一個注冊名使用多次,但后一個將覆蓋前一個對象。

    在做完上述工作后,就可以使用jsonrpc.msg.getMessage來調(diào)用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,實(shí)際上就是使用registerObject方法來注冊Message類。然后可以forward到使用jabsorbJSP頁面,也可以使用PrintWriter在當(dāng)前Servlet中輸出相應(yīng)的javascripthtml代碼。

    四、注冊全局對象

       
    使用registerObject注冊的對象只能在當(dāng)前頁面訪問。如果想注冊一次,就可以任何運(yùn)行在當(dāng)前Web服務(wù)器的頁面(JSPHTML等)中使用這個對象,就需要使用如下的代碼來注冊Message對象:

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

        讀者可以將上面的相應(yīng)代碼換成這行代碼,然后另建立一個test.jsp,然后使用如下的代碼調(diào)用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>

    但經(jīng)筆者測試,在firefox中訪問test.jsp,竟然可以訪問msg對象,但在IE里就會拋出對象錯誤異常。

       
    五、訪問集合類型

       
    如果反回的數(shù)據(jù)很多的話,可以使用Java提供的集合類型,如將Message因擴(kuò)展為如下形式:

    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中可加入如下的代碼來訪問getListgetMap方法中的數(shù)據(jù):

    <script type="text/javascript">
    jsonrpc = new JSONRpcClient("JSON-RPC");

    alert(jsonrpc.globalMsg.getList().list[1]);
        alert(jsonrpc.globalMsg.getMap().map['bird']);

    </script>

    六、異步調(diào)用

       
    上面的代碼都是同步調(diào)用,也就是在反回結(jié)果之前,客戶端程序會被阻塞。為了在網(wǎng)絡(luò)環(huán)境不暢的環(huán)境下Web程序仍然能運(yùn)行良好,這就需要進(jìn)行異步調(diào)用。也就是說,客戶端在發(fā)送請求后立即返回,直接服務(wù)端返回信息,才會調(diào)用另一個“回調(diào)函數(shù)”來獲取結(jié)果。

    回調(diào)函數(shù)必須有兩個參數(shù),第一個參數(shù)表示返回值,第二個參數(shù)表示異常信息。如果無異常信息,第二個參數(shù)值為null。下面是一個回調(diào)函數(shù):

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


    可以使用下面的代碼以異步方式來調(diào)用getMessage方法:

        jsonrpc.msg.getMessage(asyc, 'bill');

    從上面的代碼可以看出,異步調(diào)用和同步調(diào)用的區(qū)別就是異步調(diào)用需要將回調(diào)函數(shù)作為方法的第一個參數(shù)傳入被調(diào)用的方法。后面跟著被調(diào)用方法的參數(shù)值。






    Android開發(fā)完全講義(第2版)(本書版權(quán)已輸出到臺灣)

    http://product.dangdang.com/product.aspx?product_id=22741502



    Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


    新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

    posted on 2008-07-04 11:03 銀河使者 閱讀(3002) 評論(2)  編輯  收藏 所屬分類: javaajaxweb 原創(chuàng)

    評論

    # re: 用jabsorb(json) for java編寫AJAX應(yīng)用程序[未登錄]  回復(fù)  更多評論   

    不如用dwr直接
    2008-07-06 22:00 | 懶人

    # re: 用jabsorb(json) for java編寫AJAX應(yīng)用程序  回復(fù)  更多評論   

    謝謝老師
    2009-07-07 11:23 | 郝耀
    主站蜘蛛池模板: 日本a级片免费看| 色www永久免费| 亚洲av乱码中文一区二区三区 | 99久久精品免费精品国产| 最近免费中文字幕中文高清| www免费黄色网| 久久精品免费网站网| 女同免费毛片在线播放| 久久爰www免费人成| 96免费精品视频在线观看| 日本免费一区二区在线观看| 97视频免费在线| 最近中文字幕免费mv视频7| 成全视频免费高清| 国产做床爱无遮挡免费视频| 人人狠狠综合久久亚洲高清 | 日本视频一区在线观看免费| 久久久久久国产精品免费免费 | 野花香在线视频免费观看大全| 免费无码av片在线观看| 日韩中文字幕免费视频| 九九精品免费视频| 性做久久久久免费看| 久久久精品国产亚洲成人满18免费网站| 亚洲中文字幕无码久久精品1| 婷婷久久久亚洲欧洲日产国码AV| 久久久久久亚洲精品成人| 亚洲一本到无码av中文字幕 | 久久夜色精品国产噜噜亚洲AV| 亚洲av无码久久忘忧草| 香蕉视频亚洲一级| 成人免费ā片在线观看| 久久国产免费观看精品3| 麻豆国产VA免费精品高清在线| 亚洲无线一二三四区手机| 亚洲AV永久无码区成人网站| 日本亚洲精品色婷婷在线影院| 亚洲精品无码av中文字幕| 精品无码一级毛片免费视频观看| 99久久久国产精品免费牛牛| 噼里啪啦电影在线观看免费高清|