`
peng_jian_ming
  • 浏览: 255597 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

面向Java开发人员Ajax:构建动态的Java应用程序

    博客分类:
  • AJAX
阅读更多
  作为J2EE开发人员,我们经常关注“后端机制(backend mechanics)”。我们通常会忘记J2EE成功之处在于WEB应用程序方面。许多原因使得人们喜欢利用WEB开发应用程序,但主要原因还是因为其易于部署的特点,允许站点以尽可能底的成本拥有上百万的用户。我们在后端投入太多的精力,使得我们在WEB用户界面对用户的相应灵敏方面投入不足。

                 本文介绍一种方法,Ajax,使用它可以构建更加更为动态和响应更加灵敏的Web应用程序。该方法的关键在于对浏览器端的JavaScript、DHTML和与服务器异步通讯的组合。Ajax用来描述一组技术,它使浏览器可以为用户提供更为自然的浏览体验。在Ajax之前,Web站点强制用户进入提交/等待/重新显示范例。用户的动作总是与服务器的“思考时间”同步。Ajax提供了与服务器异步通讯的能力,从而使用户从请求/响应的循环中解脱出来。借助Ajax,用户可以在单击按钮时,使用JavaScript和DHTML立即更新UI,并向服务器发出异步请求,以执行查询或更新数据库。当请求返回时,可以利用JavaScript和CSS来相应的更新UI而不是刷新整个页面。

            定义Ajax,Ajax不是一种新技术,而是几种蓬勃发展的几种强大技术以新的方式组合而成,Ajax包括:基于XHTML和CSS标准的表示;使用Document Object Model进行动态的显示和交互;使用XML Request与服务器进行异步通讯;使用JavaScript绑定一切。

                 Ajax的工作原理,Ajax的核心是JavaScript和XMLHttpRequest。该对象在Internet Explorer5中首次引入,它是一种支持异步请求的技术。简单的说:XmlHttpRequest使你可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。在创建Web站点时,在客户端执行屏幕更新为用户提供了很大的灵活性能。下面是使用Ajax完成的功能:1、动态更新购物车的物品总数,无需用户单击Update并等待服务器发送整个页面。2、提升站点的性能,这是通过减少从服务器下载的数据量来实现的。例如:当更新购物车一个物品的数量时,会重新载入整个页面,这必须下载32K的数据,而使用Ajax计算新的总量,服务器只需要返回新的总量值,因此所需要的带宽仅仅为原来的百分之一。3、消除了用户每次输入时的页面刷新。例如,在Ajax中,如果用户在分页列表上单击Next,则服务器数据只刷新列表而不是整个页面。

                 从Ajax的序列的起点开始,创建和分派来自浏览器的XMLHttpRequest。但不同的浏览器创建XMLHttpRequest的方法各不相同。下列JavaScript的代码,可以检测出浏览器要使用的正确方法,并返回一个可以使用的XMLHttpRequest。

<script language="JavaScript">
<!--
//定义xmlHttp全局对象
var xmlHttp = null;
//根据不同浏览器创建方法的不同进行区分,确定xmlHttp对象的顺利创建
function createXMLHttpRequest(){
    if(window.ActiveXObject){
     xmlHttp = new window.ActiveXObject("Microsoft.XMLHTTP");
    }else if(window.XMLHttpRequest){
     xmlHttp = new window.XMLHttpRequest();
    }
}
//定义一个函数,可以让JS脚本可以去动态的访问后台的代码
function queryMess(){
    //定义一个要查询所需要的参数
    var jrnl_id = document.getElementById("jrnl_id").value;
    if(jrnl_id==""){
     return ;
    }
    //定义JS脚本要访问的地址,从访问的地址获取数据来源
    var url = "../jsp/gywork/getInfo.jsp?user_id="+jrnl_id;
    //调用创建xmlHttp对象的函数,来创建一个对象
    this.createXMLHttpRequest();
    //事先给xmlHttp对象获取数据返回后一个处理数据的函数,即:回调函数

    //xmlHttp.onreadystatechange属性,是xmlHttp对象的状态改变所触发事件的事件处理程序

    xmlHttp.onreadystatechange = dealDate;
    //调用xmlHttp对象去访问地址,或后台内容获取数据
    xmlHttp.open("GET",url,true);
    //xmlHttp.send(null);用来发送信息参数,是对于发送方法为post,若发送请求的方法为get
    //则发送的内容为null,xmlHttp.open("POST","login",true);发送请求的地址信息方式为
    //XMLHttpReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xmlHttp.send(null);
}
//定义一个回调函数,用作xmlHttp对象获取数据后进行处理的操作
function dealDate(){
    /*xmlHttp.readyState属性,是xmlHttp对象的对象状态值,0表示未初始化,1表示正在加载,
     2表示加载完毕,3表示开始进行交互,4表示整个处理完成
    */
    if(xmlHttp.readyState == 4){
     /*xmlHttp.status从服务器返回的数字代码,404表示未找到,200表示就绪,不管是否获取
       到数据,200表示已经顺利完成访问服务器后,顺利返回未发生异常
     */
     if(xmlHttp.status == 200){
      /*数据返回后可以使用xmlHttp.responseText属性获取数据,但是xmlHttp.responseText
      返回的是一个字符串,对于比较复杂的数据结构可以利用xmlHttp.responseXML属性来进行
      处理数据,如果返回值是一条记录,则可以处理数据的XML样式为:
      <?xml version="1.0" encoding="gb2312" ?>
      <result>根节点
       <username>sa</username>子节点
       <userid>23</username>子节点
      </result>
      可以根据节电名称来获取节点值,例如:*/
      var responseXML = xmlHttp.reponseXML;
      var username = responseXML.getElementsByTagName("username")[0].firstChild.nodeValue;
      var userid = responseXML.getElementByTagName("userid")[0].firstChild.nodeValue;
      /*
      若返回值为一组数据,则可以处理数据的XML样式为:
      <? xml version="1.0" encoding="gb2312" ?>
      <result>根节点
       <users>子节点
        <name>sa</name>
        <id>12</id>
       </users>
       <users>
        <name>ss</name>
        <id>22</id>
       </users>
      </result>对XML进行解析来获取数据
      */
      var responseXML = xmlHttp.reponseXML;
      //获取根节点,获取根节点的节点名称:var domName = responseXML.documentElement.tagName;
      var xmldom = responseXML.documentElement;
      var len = xmldom.childNodes.length;
      for(var i=0;i<len;i++){
       var child = xmldom.childNodes.item(i);//根据根节点的长度,遍历创建子节点对象child
       for(var j=0;j<child.childNodes.length;j++){ //相当于users节点
        var node = child.childNodes.item(j);
        document.writeln(node.tagName+"||"+node.text);
       }          
      }
      /*
      打印结果为:
      sa || 12
      ss || 22
      */
     }
    }else{
     alert("获取数据发生错误!");
    }
}
//-->
</script>

页面所请求得Jsp页面源代码如下,其中包括如何处理运算后得到的结果集:

<%@ page contentType="text/html;charset=gb2312" %>

<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%@ page import="com.yc.ycportal.blockimp.service.CommonService" %>
<%@ page import="com.yc.ycportal.util.GetRaq"%>

<%

response.setContentType("text/xml");  
         


   String userId = request.getParameter("userId");

   String organ = new GetRaq(session).getParamid();
   //Create the response XML
   if (userId != null && !"".equals(userId.trim())) {
    List gyList = CommonService.getInstance().getDynamicTable("select * from dic_counter where counter_id='" + userId + "' and organ_id='"+organ+"'");
  
    if (gyList != null && gyList.size() == 1) {
     Map gyMap = (Map) gyList.get(0);
     String gyName = (String) gyMap.get("COUNTER_NAME");//柜员姓名
     String organId = (String) gyMap.get("ORGAN_ID");//柜员所属行号

     List organList = CommonService.getInstance().getDynamicTable("select * from dic_organ where organ_id='31" + organId + "'");
       if( organList != null && organList.size() == 1) {
        Map organMap = (Map) organList.get(0);
        String organName = (String) organMap.get("ORGAN_NAME");//获取柜员所属行名

        //组织需要返回的xml

        StringBuffer xml = new StringBuffer("<?xml version=\"1.0\" encoding=\"gb2312\" ?><result><queryResult>success</queryResult><name>").append(gyName).append("</name><bank_id>").append(organId).append("</bank_id><bank_name>").append(organName).append("</bank_name></result>");

        //Send the response back to the browser
        response.getWriter().write(xml.toString());
       }else{
         response.getWriter().write("<result><queryResult>failed</queryResult></result>");
        }
    }else{
      response.getWriter().write("<result><queryResult>failed</queryResult></result>");
     }
   }else{
      response.getWriter().write("<result><queryResult>failed</queryResult></result>");
   }

%>
分享到:
评论

相关推荐

    面向Java开发人员的Ajax之1:构建动态的Java应用程序

    本文中将解释Ajax背后的概念...我将使用代码示例演示让Ajax应用程序如此动态的服务器端Java代码和客户端JavaScript。最后将指出Ajax方式的一些不足,以及在创建Ajax应用程序时应当考虑的一些更广的可用性和访问性问题。

    面向 Java 开发人员的 Ajax 构建动态的 Java 应用程序

    很好的学习ajax的资料,内附源码。

    AJax详解.chm

    第 12 部分:面向 Java 开发人员的 Ajax: 构建动态的 Java 应用程序 第 13 部分:面向 Java 开发人员的 Ajax: Ajax 的 Java 对象序列化 第 14部分:面向 Java 开发人员的 Ajax 结合 Direct Web Remoting 使用 Ajax ...

    AjaxIbm(掌握Ajax系列及不同领域的应用)

    掌握Ajax系列 使用AJAX构建应用程序:学习用AJAX构建支持实时验证的Web应用程序 面向 Java 开发人员的 Ajax Java应用开发源动力

    Ajax详解.rar

    第 12 部分:面向 Java 开发人员的 Ajax: 构建动态的 Java 应用程序 133 1.5 更好的购物车 133 1.6 Ajax 往返过程 134 1.7 分派 XMLHttpRequest 135 1.8 servlet 请求处理 137 1.9 用 JavaScript 进行响应处理 ...

    java源码包2

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java源码包---java 源码 大量 实例

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    知识库源码java-echo3:Echo是一个用于构建基于Web的应用程序的平台,该应用程序可实现富客户端的功能。这些应用程序是使用面向组件和

    知识库源码java ____ __ _ __ __ ...Echo应用程序可以使用面向组件和事件驱动的API完全在服务器端Java代码中创建,也可以完全用JavaScript编写为客户端应用程序。 为什么回声? 尽管Model-View-Con

    java源码包4

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    java源码包3

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    java开源包4

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包101

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包11

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包6

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包9

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包8

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包10

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包5

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

Global site tag (gtag.js) - Google Analytics