AjaxAnywhere的用法
 

ajaxanywhere 总结:
1,简介
AjaxAnywhere被设计成能够把任何一套现存的JSP组件转换成AJAX感知组件而不需要复杂的JavaScript编码.它利用标签把Web页面简单地划分成几个区域,然后使用AjaxAnywhere来刷新那些需要被更新地区域

下面把我这两天的所学做一下总结:
2.1 从配置上来讲:
ajaxanywhere没有tld文件,但是他需要在web.xml中配置一个filter,这就足够了。
    <filter>
         <filter-name>AjaxAnywhere</filter-name>
         <filter-class>org.ajaxanywhere.AAFilter</filter-class>
     </filter>
     <filter-mapping>
         <filter-name>AjaxAnywhere</filter-name>
         <url-pattern>*.jsf</url-pattern>
     </filter-mapping>
     <filter-mapping>
         <filter-name>AjaxAnywhere</filter-name>
         <url-pattern>*.jsp</url-pattern>
     </filter-mapping>
      <filter-mapping>
         <filter-name>AjaxAnywhere</filter-name>
         <url-pattern>*.do</url-pattern>
     </filter-mapping>
值得注意的是,只有通过此filter的request url才能够使用它的功能,所以要确保需要此功能的url能够通过此filter!我刚开始的时候写了一个servlet与ajaxanywhere的jsp页面联合使用,但总是抱错:“说返回的类型并不是text/xml”类型,后来
我想肯定是要求servlet必须返回text/xml类型了,于是就在servlet的末尾增加了一句话:
response.setContentType("text/xml; charset=UTF-8");心想这回没错了吧,没想到运行时仍旧显示“返回类型不是
text/xml”,这是页面的js报的错误,也就是在返回信息到了页面,叶面分析返回数据的时候报的错误。仔细检查了servlet
设置返回类型的那句话并没有错误。

原来问题出在servlet的mapping上面,设置了一个/xxxx没有带".do"(这时还没有struts环境呢),这样一来,servelt返回给页面的response并没有被AjAxanywhere Filter截获,当然就没有没有被处理过(具体内部处理不太清楚),于是就出了上面的错误。
解决方法很简单,把所有需要ajaxanywhere的servlet   mapping配置成一个比较特殊的后缀,例如localServlet.aj这样在
web.xml中配置AjaxAnywhere过滤器的filer-mapping 增加一条
      <filter-mapping>
         <filter-name>AjaxAnywhere</filter-name>
         <url-pattern>*.aj</url-pattern>
     </filter-mapping>
这样所有的后缀为aj的servlet就都可以使用上此Filter了。错误就没有了。ok,上面讲了ajaxanywhere + servlet 的方法。

2.2 配置ajaxanywhere + struts .
配置也比较简单。在struts的配置正确的基础上,只需要配置ajaxanywhere的filter,增加一个mapping,如果struts ActionServlet配置了mapping *.xx ,那么表示所与后缀为xx的url都经过AcitonServlet来处理,好,ajaxanywhere要求所有的
url在进入AciontServlet之前首先进入他的Filter,离开ActionServlet之后也要首先进入他的Filter,而不是直接返回页面。
这样,只要在ajaxanywhere filter的mapping后面增加
      <filter-mapping>
         <filter-name>AjaxAnywhere</filter-name>
         <url-pattern>*.xx</url-pattern>
     </filter-mapping>
即可。这样就能和struts配置使用了。

2.3 配置ajaxanywhere + jsf
例子中也讲到了与jsf配合使用的方法,jsf我没有用过,但是配置ajaxanywhere要做得就是增加一个filter-mapping而已。假设jsf的后缀是*.jsf,那么只需要在 ajaxanywhere filter中增加一个此后缀的mapping,就ok了。

2.4 ajaxanywhere + * + jstl
于jstl连用实际上就是与jsp连用,但是把jstl也融合进来需要注意,ajaxanywhere Demo例子中的web.xml
不兼容jstl,所以除了要把必要的jar文件tld文件拷贝到项目之外,还要把web.xml的头部进行修改,原来是这样写的
<web-app>..... ,必须要修改成
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
这样才行。
否则你会发现一个特别奇怪的错误,例如<c:forEach items="sdfsd" var="item">${item.value}</c:forEach>
就是不循环显示,但是<c:out value="xxxx"/>却可以运行,当时就懵了。修改了web.xml之后就一切正常了^_^

3,ajaxanywhere的目录结构和文件的特色。
和普通的项目的区别就在三个地方:
3.1 /aa/aa.js 里面包含了ajaxanywhere必须使用的javascript对象和方法。这个文件必须用,
   而且每个jsp页面都要引用他,如果想深入使用就有必要对里面的方法有所了解。

3.2    多了一个Filter,一个ajaxanywhere.jar,对程序员是透明的。

3.3    jsp页面要引入lib<%@ taglib uri="http://ajaxanywhere.sourceforge.net/" prefix="aa" %>。
   简单使用时只需要配置好<aa:zone>,
   然后当Get方法(链接跳转),某标签的onclick中调用“ajaxAnywhere.getAJAX(目标url)”。
   当Post方法(表单提交)时,首先配置form名字,例如,ajaxAnywhere.formName = "main"
     在表单里调用“ajaxAnywhere.submitAJAX();”或者干脆设置一个能够自动submit
     的input按钮例如<intput type="image"><input type="submit">就什么都不用写,也能提交。

4,具体使用方法:
4.1 jsp页面上:
   定义刷新区域,使用<aa:zone name="xxxx">来定义一个区域。
   可以在jsp页面上“指定”刷新区域,他和“定义”刷新区域的区别在于,定义了不一定会被刷新,定义后
    又被指定的刷新区域才能被刷新。通过覆盖js中AjaxAnywere对象的ajaxAnywhere.getZonesToReload
    方法来指定刷新区域。例如,
    ajaxAnywhere.getZonesToReload = function () {
            return "zone,1"
       };
    指定了两块刷新区域。
   在刷新区域显示新的内容:
    刷新区域里面,使用动态脚本(scriplet,jstl)从request(或其他范围)获得服务端返回的新的数据,
    并显示。(推荐使用jstl比scriptlet更简洁)。

4.2 服务端:
   不论是Servlet还是Action还是直接使用jsp做服务端,代码都是一样的。
   必须有的几行代码是:
   if (AAUtils.isAjaxRequest(request)){
         AAUtils.addZonesToRefresh(request, "xxxx");//这句话也可以不写如果jsp页面已经指定了刷新区域
   }
   然后返回一个List放到request或者其他范围内,供页面显示。
  
        注意:
    服务端代码不必使用设置context-type为xml,没有必要。因为通过ajaxanywhere filter可以做到这一点。

5,定制js
5.1 如何在response尚未返回期间不显示默认的“loading...”(蓝色图层)?
   通过在jsp页面里覆盖 ajaxAnywhere.showLoadingMessage = function() {}并设置为空。

5.2 如何修改默认的loading。。。图片为其他图片?
   通过在jsp页面里覆盖 ajaxAnywhere.showLoadingMessage ,hideLoadingMessage,方法。
   ajaxAnywhere.showLoadingMessage = function() {

var img = document.getElementById("myImg");
     if (img == null) {
         img = document.createElement("img");
         document.body.appendChild(img);
         img.id = "myImg";
        
        
         img.src = "psyline.gif";
         img.style.position = "absolute";
         img.style.border = "1 solid black";
         img.style.top = 0;
         img.style.left = documet.body.offsetLeft;
     }
    
     img.style.display = "";
}

/**
*   Default sample loading message hide function. Overrride it if you like.
*/
AjaxAnywhere.prototype.hideLoadingMessage = function() {
      var img = document.getElementById("myImg");
      if (img != null)
          img.style.display = "none";
}
好,这样就把把默认图片替换成其他图片了。

5.3 如何修改loading图片的显示为之为相对位置?
   只需要配置top,left,例如:
ajaxAnywhere.showLoadingMessage = function() {
     var div = document.getElementById("testshowdiv");
     if (div == null) {
         div = document.createElement("DIV");
         document.body.appendChild(div);
         div.id = "testshowdiv";
         div.innerHTML = "<img src='shc.gif' border=0/>";
         div.style.position = "absolute";
         div.style.border = "1 solid black";
         div.style.color = "white";
         div.style.backgroundColor = "blue";
         div.style.width = "100px";
         div.style.heigth = "50px";
         div.style.fontFamily = "Arial, Helvetica, sans-serif";
         div.style.fontWeight = "bold";
         div.style.fontSize = "11px";
     }
//注意,如果alink没有定义,那么就始终显示进度条了。有时抱错,有时不抱错。
     div.style.top = document.all.alink.offsetTop;
     div.style.left =document.all.alink.offsetWidth-170; // 如果不减,在屏幕上就看不到了。
     div.style.display = "";
    
     }

/**
*   Default sample loading message hide function. Overrride it if you like.
*/
AjaxAnywhere.prototype.hideLoadingMessage = function() {
      var div = document.getElementById("testshowdiv");
      if (div != null)
          div.style.display = "none";
}

5.4 如果设置默认的弹出框。在上次请求被忽略后,默认会弹出一个框,如果让不让他出来?
只需要覆盖或者直接在aa。js中修改
ajaxAnywhere.handlePrevousRequestAborted = function() {
        // alert("放弃上一次的提交");//或者什么都不作
     }

5.5 如何处理异常弹出框?
只需要覆盖
ajaxAnywhere.handleException = function(type, details) {
         alert("出异常了: \n\n\n ***************\n"+details.substring(0,350)+"\n...\n\n      ***************");
     }
5.6 如何处理错误弹出框?
只需要覆盖
ajaxAnywhere.handleHttpErrorCode = function(code) {
         alert("返回错误: \n \n \n ***************\n错误码:" + code+"\n\n ***************");
     }

5.7 如何定时刷新指定区域?
ajax定时刷新执行得更象普通的js,
// 指定定期执行的刷新所指向的url
function go() {
         ajaxAnywhere.getAJAX('demo.jsp');
     }
//指定刷新区域
     ajaxAnywhere.getZonesToReload = function () {
         return "zone,1"
     };
//指定刷新之后的动作
     ajaxAnywhere.onAfterResponseProcessing = function () {
         window.setTimeout("go();", 1000);
      //setInterval("go()",1000);
     }
//隐藏loading图片
     ajaxAnywhere.showLoadingMessage = function(){};
//调用刷新后的动作
     ajaxAnywhere.onAfterResponseProcessing();
这样就构成了一个循环。

与普通的js定时执行某个操作并没有什么不同,只不过通过在定时操作中使用ajax,可以调用非客户端的程序,即后台程序。而普通的定时执行却做不来。

6,一些与ajaxanywhere无关的技术。
6.1 struts动态form
ajaxanywhere不是必须指定formName,因为它默认使用forms[0]当作提交的form,这并不保险(一个页面可能有多个form),所以有必要指定formName,struts的<html:form>标签,必须struts-config配置了form时才行,没有必要使用ActionForm时可以定义一个空的DynaActionForm,例如,
<form-bean name="localeform" type="org.apache.struts.action.DynaActionForm">
     <form-property name="nnn" type="java.lang.String"/> //这句话也可以没有。即没有属性的form
    </form-bean>
这样就不必多定义一个类了,动态form与ajaxanywhere配合得很好。

6.2 struts DispatchAction
ajax与strutsDispatchAction配合得也很好。

总结:
比较ajax tags,struts ajaxtag,还是ajaxanywhere比较好些。
ajaxtags是基于组件的,能实现的功能有限。struts ajaxtags我用了之后感觉复杂。好了,暂时就写这么多,以后的实践经验就算在ajaxanywhere的补充了。
下载地址:http://ajaxanywhere.sourceforge.net/index.html

AjaxAnywhere的用法(FORWARD)的更多相关文章

  1. AjaxAnywhere+struts用法

    AjaxAnywhere的用法 1,简介 AjaxAnywhere被设计成能够把任何一套现存的JSP组件转换成AJAX感知组件而不需要复杂的JavaScript编码.它利用标签把Web页面简单地划分成 ...

  2. H5系列之History(必知必会)

    H5系列之History(必知必会)   目录 概念 兼容性 属性 方法 H5方法       概念     理解History Api的使用方式 目的是为了解决哪些问题   作用:ajax获取数据时 ...

  3. struts2.3.15.1 中jsp:include与jsp:forward的用法

    首先配置好struts2的过滤器:web.xml中的配置 <filter> <filter-name>struts-prepare</filter-name> &l ...

  4. 使用JavaScript的history对象来实现页面前进后退(go/back/forward)。

    我们都知道JavaScript有history对象,主要是用来记录浏览器窗口的浏览记录.但是,JS脚本是不允许访问到这个记录里面的内容(隐私). 常见的用法是: history.back();//返回 ...

  5. Delphi常用关键字用法详解

    本文详细介绍了Delphi中常用的各个关键字名称及用法,供大家在编程过程中借鉴参考之用.详情如下: absolute: ? 1 2 3 4 5 6 7 8 9 10 //它使得你能够创建一个新变量, ...

  6. C#播放声音的四种方法 +AxWindowsMediaPlayer的详细用法

    C#播放声音的四种方法 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroSoft.DirectX.dll和 Microsoft.Directx ...

  7. SSH的端口转发:本地转发Local Forward和远程转发Remote Forward

    关于使用ssh portforwarding来进行FQ的操作,网络上已经有很多很好的文章,我在这里只是画两个图解释一下. 首先要记住一件事情就是: SSH 端口转发自然需要 SSH 连接,而 SSH ...

  8. JSP中RequestDispatcher的用法

    RequestDispatcher是一个Web资源的包装器,可以用来把当前request传递到该资源,或者把新的资源包括到当前响应中.RequestDispatcher接口中定义了两个方法:inclu ...

  9. c++11 中的 move 与 forward

    [update: 关于左值右值的另一点总结,请参看这篇] 一. move 关于 lvaue 和 rvalue,在 c++11 以前存在一个有趣的现象:T&  指向 lvalue (左传引用), ...

随机推荐

  1. c# windows服务

    参考:https://www.cnblogs.com/knowledgesea/p/3616127.html 序言 前段时间做一个数据迁移项目,刚开始用B/S架构做的项目,但B/S要寄存在IIs中,而 ...

  2. HybridApp启动引导页的实现

    有一种帅叫做长话短说,@孙红雷,--这可以叫做“短帅”吗,^_^ 首先说下思路,既然是Hybrid APP, 那就是可以用html的方式实现,启动引导页比较常见的展示方式是滑动,那么我们就可以使用图片 ...

  3. 【代码审计】iZhanCMS_v2.1 代码执行漏洞分析

      0x00 环境准备 iZhanCMS官网:http://www.izhancms.com 网站源码版本:爱站CMS(zend6.0) V2.1 程序源码下载:http://www.izhancms ...

  4. [转]linux下释放文件内存

    在Linux系统下,我们一般不需要去释放内存,因为系统已经将内存管理的很好.但是凡事也有例外,有的时候内存会被缓存占用掉,导致系统使用SWAP空间影响性能,此时就需要执行释放内存(清理缓存)的操作了. ...

  5. Django 定义数据模型

    如何定义数据模型: (1) 在 MVC 设计模式中,M 表示数据模型 ( Model ),负责业务对象与数据库的映射,我们可以通过应用的 models.py 来定义数据模型(2) Model 采用了 ...

  6. 使用taro开发钉钉的E应用报错 You are currently using minified code outside of NODE_ENV === "production". This means that you are running a slower development build of Redux. You can use loose-envify (https://git

    今天测试taro转钉钉E应用的时候,在模拟器上没事,但是在真机上却报错了: You are currently using minified code outside of NODE_ENV === ...

  7. ViewBag对象的更改

    JSSDKObj = new JSSDKModel(); JSSDKObj.title = "初始名称"; ViewBag.JSSDK = JSSDKObj;//初始设置ViewB ...

  8. Linux记录用户shell命令

    在/etc/profile中添加下面内容: export LC_ALL=C TMOUT=3600 HISTFILESIZE=2000 HISTSIZE=2000 HISTTIMEFORMAT=&quo ...

  9. 【jquery基础】 jquery.manifest用法:通过后台查询and添加到默认项

    今天做一个东西 效果如下: 后台已经保存了006这个SN码,现在需要查到了这个人(杨小婷),然后作为默认值,展示到 manifest 里面 <script> $(document).rea ...

  10. C#TreeView节点选中后失去焦点时改变节点背景色

    C#TreeView节点选中后失去焦点时改变节点背景色 在使用TreeView控件时候,单击一个节点,当鼠标聚焦到别的地方的时候,之前点击的这个节点就看不清楚了 举例截图 单击后           ...