免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5393 | 回复: 0
打印 上一主题 下一主题

使用ajax技术实现javascript调用java方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-23 09:37 |只看该作者 |倒序浏览
    使用ajax技术来实现远程调用的组件有很多种,buffalo就是其中一个,当时本来想用的,可是觉得这个太大了,如果使用到项目中的话,整个项目就变得太复杂,然后自己就参考buffalo实现了一个小的组件出来,只是提供远程调用,然后将结果封装成javascript对象,然后在项目中试用了下,效果不错,能解决一些页面验证和小数据量更新的问题,但是如果数据量大的话,还是有一定延迟,我觉得ajax的技术不适合做那种页面信息很丰富的应用,只能是适当的使用下。
    这个组件包括一个servlet(RemoteCallServlet.java)和两个js文件(remotecall.js,base.js):servlet用来处理请求,然后调用请求的方法,最后把结果封装成XML字符串返回给客户端;js文件是用来解析返回的结果,然后处理成javascript对象。
    servlet中的关键方法如下:
   
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,java.io.IOException{
        //得到类名、方法名和参数
        String methodName=req.getParameter("methodName");
        String className=req.getParameter("className");
        Object[] objs=req.getParameterValues("params");
        Object targetObj;
        try {
            targetObj = Class.forName(className).newInstance();
            Object obj=MethodUtils.invokeMethod(targetObj, methodName, objs);
            this.dealResp(resp, obj);
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
    private void dealResp(HttpServletResponse resp,Object obj) throws IOException{
        resp.setContentType("text/xml;charset=GBK");
        PrintWriter pw=resp.getWriter();
        pw.write(""+deal(obj)+"");
        pw.flush();
        pw.close();
    }
    private String deal(Object obj){
        String sbResult="";
        if(obj==null){
            sbResult="";
        }else if(obj instanceof java.lang.String){
            sbResult=dealString(obj);
        }else if(obj instanceof java.util.List){
            sbResult=dealList(obj);
        }else if(obj instanceof java.lang.Boolean){
            sbResult=dealBoolean(obj);
        }else if(obj instanceof java.lang.Double){
            sbResult=dealDouble(obj);
        }else if((obj instanceof java.lang.Integer) || (obj instanceof java.lang.Long)){
            sbResult=dealInteger(obj);
        }else if(obj instanceof java.lang.Throwable){
            sbResult=dealException(obj);
        }else if(obj instanceof java.util.Map){
            sbResult=dealMap(obj);
        }else if(obj instanceof java.util.Date){
            sbResult=dealDate(obj);
        }else if(obj instanceof java.util.Calendar){
            sbResult=dealDate(obj);
        }else if(obj instanceof org.w3c.dom.Document){
            sbResult=dealXml(obj);
        }else{
            sbResult=dealObject(obj);
        }
        return sbResult;
    }
    //处理Date或Calendar类型,返回值为yyyy-MM-dd-HH-mm-ss-SSS格式的字符串
    private String dealDate(Object obj){
        Calendar cal=null;
        if(obj instanceof Calendar){
            cal=(Calendar)obj;
        }else{
            cal=Calendar.getInstance();
            cal.setTime((Date)obj);
        }
        
        StringBuffer sb=new StringBuffer();
        sb.append("");
        sb.append(cal.get(Calendar.YEAR));
        sb.append("-");
        sb.append(cal.get(Calendar.MONTH));
        sb.append("-");
        sb.append(cal.get(Calendar.DAY_OF_MONTH));
        sb.append("-");
        sb.append(cal.get(Calendar.HOUR_OF_DAY));
        sb.append("-");
        sb.append(cal.get(Calendar.MINUTE));
        sb.append("-");
        sb.append(cal.get(Calendar.SECOND));
        sb.append("-");
        sb.append(cal.get(Calendar.MILLISECOND));
        sb.append("");
        return sb.toString();
    }
    private String dealMap(Object obj){
        StringBuffer sb=new StringBuffer();
        Map map=(Map)obj;
        sb.append("");
        Set entrys=map.entrySet();
        Iterator ite=entrys.iterator();
        Map.Entry entry=null;
        while(ite.hasNext()){
            entry=(Map.Entry)ite.next();
            sb.append(");
            sb.append(entry.getKey());
            sb.append(">");
            sb.append(deal(entry.getValue()));
            sb.append(");
            sb.append(entry.getKey());
            sb.append(">");
        }
        sb.append("");
        return sb.toString();
    }

   js文件中的处理Map对象方法:

doMap: function (dataNode) {
   
        var obj = new Object();
        //this._objects[this._objects.length] = obj;
        var attrs = dataNode.childNodes;
        alert(attrs.length);
        for (var i = 0; i  attrs.length; i++) {
            //alert(attrs.childNodes[0]);
            obj[this._getType(attrs)] = this.deserialize(attrs.childNodes[0]);
        }
        
        return obj;
    }

使用的时候将servlet在web.xml中注册:
servlet>
    servlet-name>action/servlet-name>
    servlet-class>com.hollyinfo.eus.remotecall.RemoteCallServlet/servlet-class>
  /servlet>
  
  servlet-mapping>
    servlet-name>action/servlet-name>
    url-pattern>/RemoteCall/url-pattern>
  /servlet-mapping>
然后引入两个js文件就可以了。
客户端调用例子:调用服务器端类test.TestA的receiveObject方法,然后调用js函数
new Reply(temp),该函数返回一个Reply对象,直接调用它的getResult()就可以得到处理成javascript对象的结果。

function _Call(){
        var temp=RemoteCall("test.TestA","receiveObject","");
        alert(temp);
        var reply=new Reply(temp);
        
        temp=reply.getResult();
        alert(temp.name+" "+temp.age);
    }


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/3961/showart_307538.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP