`
flash59
  • 浏览: 97742 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基础:用js结合struts实现不刷新页面查询数据

阅读更多

我遇到一个需求,可能大伙也遇见过这样的需求,那就是在页面上提供省和市的列表供用户选择输入,当选择某个省时,市的列表立即改变成这个省里的城市,很简单吧,刚开始时想调用list的onChange方法直接到后面取数据,然后刷新整个页面,改变城市列表的内容,考虑到网络后台处理时要执行很多无关的逻辑处理,所以想到只刷新城市列表那一个控件,那就请出名躁一时的ajax吧!

实现这个功能并不复杂,结合struts一会工夫就搞定了:下面是我的做法

首先描述一下AJAX在Struts框架中的位置和作用:

      STRUTS框架实现了MVC模式,大家都知道这个模式,也知道STRUTS数据流的过程,简单讲,VIEW.jsp发送请求到CONTROL :action.do,action.do来选择业务处理模块,在业务处理模块中更新MODEL:model.java ,并请求action.do选择VIEW.jsp,发送回客户VIEW,而AJAX在VIEW端发送xmlhttprequest给action.do,然后像普通处理一样更新MODEL,不同的是,要由MODEL来生成带有返回数据的XML给客户端VIEW,可以看到,这个过程省略了选择VIEW.jsp的过程,所以,客户端没有刷新页面,但数据已经传到VIEW了。

      我的应用中稍微改变了一下做法,处理完请求后,再交给ACTION来选择VIEW.jsp,不过这个jsp文件和页面的相同,这样在客户端就收到一个和现有页面只有一小部分不同的HTML代码,那部分不同的代码就是要在页面上更新的数据,只要在得到数据后将那部分数据分离出来显示在页面上,就可以实现无刷新页面的更新效果了。。。

      jsp代码:

  1. <script type="text/javascript">
  2.  function getCity()
       {
           //alert("begin1");
           retrieveURL('/xxxx/netinfo.do?method=getCity','NetinfoForm');//document.forms[0].submit();
       }
  3. </script>
  4. <script type="text/javascript" src="/xxxx/scripts/Ajax.js"></script>
  5. <tr bgcolor="#F7FDFD">      
  6.     <td  class="right">省份:  td>      
  7.     <td>      
  8.         <html:select property="province" size="1" onchange="javascript:getCity();" >      
  9.             <logic:iterate id="prov" name="NetinfoForm" property="province_list">      
  10.                 <%String nid= ((Province)prov).getId().toString();%>      
  11.                 <html:option value="<!---->"><bean:write name="prov" property="name"/>html:option>      
  12.              logic:iterate>      
  13.         html:select>      
  14.     td>      
  15.     <td  class="right">城市:  td>      
  16.     <td>      
  17.         <span name="change" id="change">        
  18.             <html:select property="city" size="1" >      
  19.                 <logic:iterate id="cit" name="NetinfoForm" property="city_list">      
  20.     <%String nid= ((City)cit).getId().toString();%>      
  21.     <html:option value="<!---->"><bean:write name="cit" property="name"/>html:option>      
  22.                logic:iterate>      
  23.            html:select>      
  24.     td>             
  25. tr>    

action.do代码

  1. public ActionForward getCity(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {   
  2.     int provinceId=Integer.parseInt(request.getParameter("province"));   
  3.     ArrayList<city></city> city_list=(ArrayList<city></city>)cityManager.getCityByProvince(provinceId);   
  4.     object.setCity_list(city_list);   
  5.     initForm(form, request, object);   
  6.     mapping.findForward(SUCCESS);   
  7.  //转向原页面,请保证jsp页面上的其他无关元素都能得到初始化,否则,struts 在生成html代码的时候会报错,而在客户端却没有任何反应,所以在这个方法中把所有元素都准备好。  

关键部分:ajax.js代码:

js 代码
  1. //global variables   
  2.   var req;   
  3.   var which;   
  4.   
  5.   
  6.   /**  
  7.    * Get the contents of the URL via an Ajax call  
  8.    * url - to get content from (e.g. /struts-ajax/sampleajax.do?ask=COMMAND_NAME_1)   
  9.    * nodeToOverWrite - when callback is made  
  10.    * nameOfFormToPost - which form values will be posted up to the server as part   
  11.    *                    of the request (can be null)  
  12.    */  
  13.   function retrieveURL(url,nameOfFormToPost) {   
  14.     document.getElementById("change").innerHTML = "loading...";   
  15.     //alert("retrieveURL");   
  16.     //get the (form based) params to push up as part of the get request   
  17.     poststr=getFormAsString(nameOfFormToPost);   
  18.     //poststr=encodeURIComponent(poststr);   
  19.     //poststr=encodeURI(poststr);   
  20.     //alert("url="+url+poststr);   
  21.     //Do the Ajax call   
  22.     if (window.XMLHttpRequest) { // Non-IE browsers   
  23.       req = new XMLHttpRequest();   
  24.       //req.setRequestHeader( "Content-Type", "text/html;charset=UTF-8" );   
  25.       req.setRequestHeader("Content-type""application/x-www-form-urlencoded");   
  26.          
  27.       req.onreadystatechange = processStateChange;   
  28.       try {   
  29.         req.open("POST", url, true); //was get   
  30.       } catch (e) {   
  31.         //alert("Problem Communicating with Server\n"+e);   
  32.       }   
  33.       req.send(null);   
  34.     } else if (window.ActiveXObject) { // IE   
  35.       //alert("IE");   
  36.       req = new ActiveXObject("Microsoft.XMLHTTP");   
  37.       if (req) {   
  38.         req.onreadystatechange = processStateChange;   
  39.         req.open("POST", url+poststr, true);   
  40.         req.send();   
  41.       }   
  42.     }   
  43.   }   
  44.     
  45.  /**  
  46.   * gets the contents of the form as a URL encoded String  
  47.   * suitable for appending to a url  
  48.   * @param formName to encode  
  49.   * @return string with encoded form values , beings with &  
  50.   */    
  51.  function getFormAsString(formName){   
  52.     //alert("getFormAsString");   
  53.     //Setup the return String   
  54.     returnString ="";   
  55.        
  56.     //Get the form values   
  57.     formElements=document.forms[formName].elements;   
  58.   
  59.     //loop through the array , building up the url   
  60.     //in the form /strutsaction.do&name=value   
  61.        
  62.     for ( var i=formElements.length-1; i>=0; --i ){   
  63.         //we escape (encode) each value   
  64.         ////只取省的名字   
  65.         //if(formElements[i].name=="province")   
  66.         //{   
  67.             //alert("formElements[i].value="+formElements[i].value);   
  68.             returnString=returnString+"&"+formElements[i].name+"="+formElements[i].value;   
  69.         //}   
  70.         //if(formElements[i].name=="sourcepage")   
  71.         //{   
  72.            // alert("formElements[i].value="+formElements[i].value);   
  73.             //returnString=returnString+"&"+formElements[i].name+"="+formElements[i].value;   
  74.         //}   
  75.         //returnString=returnString+"&"+escape(formElements[i].name)+"="+escape(formElements[i].value);   
  76.     }   
  77.     //alert("returnString="+returnString);   
  78.     //return the values   
  79.     return returnString;    
  80.  }   
  81.     
  82.  /*  
  83.    * Set as the callback method for when XmlHttpRequest State Changes   
  84.    * used by retrieveUrl  
  85.   */  
  86.   function processStateChange() {   
  87.       //alert("processStateChange");   
  88.       if (req.readyState == 4) { // Complete   
  89.       if (req.status == 200) { // OK response   
  90.            
  91.         //alert("Ajax response:"+req.responseText);   
  92.            
  93.         //Split the text response into Span elements   
  94.         spanElements = splitTextIntoSpan(req.responseText);   
  95.            
  96.         //Use these span elements to update the page   
  97.         replaceExistingWithNewHtml(spanElements);   
  98.            
  99.       } else {   
  100.         //alert("Problem with server response:\n " + req.statusText);   
  101.       }   
  102.     }   
  103.   }   
  104.     
  105.  /**  
  106.  * Splits the text into  elements  
  107.  * @param the text to be parsed  
  108.  * @return array of  elements - this array can contain nulls   )   
  109.  */  
  110.  function splitTextIntoSpan(textToSplit){   
  111.        
  112.     //Split the document   
  113.     returnElements=textToSplit.split(""
  114.     //Process each of the elements     
  115.     for ( var i=returnElements.length-1; i>=0; --i ){   
  116.            
  117.         //Remove everything before the 1st span   
  118.         spanPos = returnElements[i].indexOf(");          
  119.            
  120.         //if we find a match , take out everything before the span   
  121.         if(spanPos>0){   
  122.             subString=returnElements[i].substring(spanPos);   
  123.             returnElements[i]=subString;   
  124.            
  125.         }    
  126.     }   
  127.     //alert(returnElements[0]);   
  128.     return returnElements;   
  129.  }   
  130.     
  131.  /*  
  132.   * Replace html elements in the existing (ie viewable document)  
  133.   * with new elements (from the ajax requested document)  
  134.   * WHERE they have the same name AND are  elements  
  135.   * @param newTextElements (output of splitTextIntoSpan)  
  136.   *                 in the format texttoupdate  
  137.   */  
  138.  function replaceExistingWithNewHtml(newTextElements){   
  139.      //alert("newTextElements="+newTextElements);   
  140.     //loop through newTextElements   
  141.     for ( var i=newTextElements.length-1; i>=0; --i ){   
  142.      
  143.         //check that this begins with   
  144.         if(newTextElements[i].indexOf(")>-1){   
  145.                
  146.             //get the name - between the 1st and 2nd quote mark   
  147.             startNamePos=newTextElements[i].indexOf('"')+1;  
  148.             endNamePos=newTextElements[i].indexOf('"',startNamePos);   
  149.             name=newTextElements[i].substring(startNamePos,endNamePos);   
  150.                
  151.             if(name=="change")   
  152.             {   
  153.                 //alert("#"+name+"#");   
  154.                 //get the content - everything after the first > mark   
  155.                 startContentPos=newTextElements[i].indexOf('>')+1;   
  156.                 content=newTextElements[i].substring(startContentPos);   
  157.                    
  158.                 //alert(content);   
  159.                 //Now update the existing Document with this element   
  160.                 //check that this element exists in the document   
  161.                 //document.all.link1.href   
  162.                 if(document.getElementById(name)){   
  163.                 //if(document.all.name){   
  164.                     //alert("Replacing Element:"+name);   
  165.                     document.getElementById(name).innerHTML = content;   
  166.                 } else {   
  167.                     document.getElementById("change").innerHTML = "error,retry!";   
  168.                     //alert("Element:"+name+"not found in existing document");   
  169.                 }   
  170.             }   
  171.         }   
  172.     }   
  173.  }   
分享到:
评论
3 楼 flash59 2007-08-20  
毕竟这个项目不是以AJAX为主的东东啊,整个项目只有这个功能使用了,不过,有机会一定好好学习一下相关的框架,请问有比较流行和实用的框架推荐一下吗?
2 楼 mark.li.guyu 2007-08-17  
目前AJAX技术虽然不能说成熟,但是已经有很多框架可以借鉴了,无论是RIA类型的还是RPC类型的
1 楼 泡泡 2007-08-17  
楼主还生活在2001年?

相关推荐

    struts2+jquery无刷新取后台数据

    在这里,"struts2+jquery无刷新取后台数据"的实现主要是利用Ajax技术,结合Struts2的Action和Result,实现在用户界面上的无刷新交互。 首先,登录功能是Web应用的基础。在Struts2中,我们可以创建一个登录Action类...

    Struts2+jQuery(不用JSON)实现局部刷新

    总结来说,Struts2和jQuery的结合使用,使得开发者能轻松实现Web应用的局部刷新,提供更流畅的用户体验,同时保持后端逻辑的清晰和高效。在实际项目中,理解这两者的原理和配合方式是提升开发效率的关键。

    关于struts2里用javascript刷新window.showModalDialog的父页面

    #### JavaScript与Struts2的结合 在Struts2应用中,JavaScript主要用来处理前端的交互逻辑。例如,可以通过JavaScript来实现动态加载数据、表单验证、AJAX请求等功能。特别是在需要弹出模态对话框时,JavaScript的...

    jquery+struts2实现异步刷新实例

    在现代Web开发中,异步刷新(Ajax)技术已经成为一种不可或缺的交互方式,它使得页面无需完全刷新就能更新部分数据,提升用户体验。本实例将详细讲解如何利用jQuery库与Struts2框架结合,实现异步刷新功能。jQuery以...

    ajax无页面刷新验证、struts结构+ajax+验证码jsp页面

    本主题主要关注的是如何在Struts框架下结合Ajax实现无页面刷新的验证码验证功能,以及在JSP页面中处理验证码的部分。 首先,我们来理解一下Struts框架。Struts是一种基于MVC(Model-View-Controller)设计模式的...

    ajax struts 无刷新访问后台返回json数据

    结合Struts框架,我们可以实现后端服务与前端交互,返回JSON数据,使得前端JavaScript能够动态地处理这些数据,而无需整个页面重新加载。下面我们将详细探讨这一技术。 ### 1. Ajax基础 Ajax(Asynchronous ...

    Struts2无刷新实现登陆退出

    在这个项目中,"Struts2无刷新实现登陆退出"是通过整合Struts2框架、JavaScript库如jQuery和Ajax技术,以及OGNL(Object-Graph Navigation Language)表达式来实现的一种优化用户体验的登录和退出功能。 首先,让...

    Struts2 jQuery Ajax 单页面增删改查,附带Mysql数据脚本

    在Struts2的环境中,jQuery可以用于前端的用户界面交互,例如在页面上添加、删除、修改或查询数据,而无需刷新整个页面。它通常与Ajax一起使用,以实现异步数据通信。 **Ajax** (Asynchronous JavaScript and XML) ...

    struts+js,struts+jquery示例

    标题“struts+js”和“struts+jquery示例”暗示我们将探讨如何将Struts与JavaScript以及jQuery结合使用,以创建更强大的Web应用。 首先,Struts框架的核心组件包括Action类、ActionForm、Struts配置文件和JSP页面。...

    关于Struts2与Jquery实现无刷新分页的不解问题

    Struts2和jQuery是两种非常重要的Java Web开发技术。Struts2是一个强大的MVC框架,它简化了基于Java的...同时,结合Struts2的Action和jQuery的Ajax功能,可以方便地处理后台逻辑和前端交互,实现更复杂的Web应用功能。

    ajax和struts结合实现无刷新验证用户名是否存在

    通过Ajax可以实现在不刷新页面的情况下与服务器进行数据交互,从而提升用户体验。本文将详细介绍如何利用Ajax与Struts框架结合来实现无刷新验证用户名是否存在的功能。 #### 一、理解Ajax技术 Ajax(Asynchronous ...

    struts2的Ajax实现注册验证

    Ajax(异步JavaScript和XML)技术则为Web应用程序带来了增强的用户体验,允许页面部分刷新,而无需整体刷新整个页面。在Struts2框架中实现Ajax功能,可以让用户在注册时实时验证用户名是否已经存在,从而提高用户...

    jQuery+Struts+Ajax无刷新分页

    本项目采用jQuery、Struts2和Ajax技术实现了这样一个功能,用户可以在不重新加载整个页面的情况下查看不同页的数据,提高了交互效率。 ### 1. jQuery jQuery是一个强大的JavaScript库,简化了JavaScript的DOM操作...

    AJAX 想Struts2后台传送Json数据并向前台返回Json格式的数据

    在Web开发中,AJAX(Asynchronous JavaScript and XML)是一种技术,它允许页面在不刷新整个页面的情况下与服务器交换数据并更新部分网页内容。而Struts2是一个强大的MVC(Model-View-Controller)框架,它广泛应用...

    struts2+json+jquery实现ajax数据的存取

    "Struts2+JSON+jQuery实现Ajax数据的存取"就是一个典型的示例,它结合了强大的MVC框架Struts2、轻量级的数据交换格式JSON以及高效的前端库jQuery,以实现网页上的无刷新数据交互。下面将详细介绍这三个技术及其在...

    用JavaScript,Struts2和MVC模式做增删改查

    例如,使用jQuery库发送异步请求到服务器,获取数据并在不刷新整个页面的情况下更新UI。 8. **图片上传**:在SQL Server中,图片通常以BLOB(Binary Large Object)类型存储。需要编写Java代码处理文件上传,例如...

    struts2 dwr ajax 配置 局部刷新

    Struts2、DWR(Direct Web Remoting)和Ajax是Web开发中的关键技术,它们结合使用可以实现页面的局部刷新,提高用户体验。Struts2是一个基于MVC设计模式的Java Web框架,DWR则是一个用于简化AJAX开发的库,允许前端...

    ajax+struts2无刷新取后台

    在IT行业中,Ajax(Asynchronous JavaScript and XML)与Struts2框架的结合使用,是实现Web应用程序无刷新交互的关键技术。这种技术允许用户在不重新加载整个网页的情况下,与服务器交换数据并局部更新页面,极大地...

    用案例学Java Web整合开发:Java+Eclipse+Struts 2+Ajax

    在Java Web中,Ajax通常结合JSON(JavaScript Object Notation)数据格式使用,因为JSON轻量且易于解析。开发者需要学习XMLHttpRequest对象的使用,以及在JavaScript中处理JSON数据的方法。 在实际案例中,我们可能...

    Ajax与Struts2异步请求数据

    在本文中,我们将深入探讨如何将Ajax技术与Struts2框架结合,实现异步请求数据。这种方式能够提高用户体验,因为它允许后台处理数据而无需刷新整个页面。以下是对关键知识点的详细说明: 1. **Ajax(Asynchronous ...

Global site tag (gtag.js) - Google Analytics