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>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
  <filter-name>AjaxAnywhere</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
  <filter-name>AjaxAnywhere</filter-name>
<url-pattern>*.xx</url-pattern>
</filter-mapping>

  值得注意的是,只有通过此filterrequest url才能够使用它的功能,所以要确保需要此功能的url能够通过此filter!我刚开始的时候写了一个servletajaxanywhere的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截获,当然就没有没有被处理过(具体内部处理不太清楚),于是就出了上面的错误。

  2.2 配置ajaxanywhere + struts .

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

  2.3 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"> 

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">就什么都不用写,也能提交。 其中目标URL注意,在getAJAX方式中要加上path;<%=path%>

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或者其他范围内,供页面显示。 Struts中mapping.findForward();指向你要跳转的页面,一般使用AJAX说明就为本页面了.   注意:服务端代码不必使用设置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 = ;
    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的补充了。

AjaxAnywhere+struts用法的更多相关文章

  1. AjaxAnywhere的用法(FORWARD)

    AjaxAnywhere的用法   ajaxanywhere 总结:1,简介AjaxAnywhere被设计成能够把任何一套现存的JSP组件转换成AJAX感知组件而不需要复杂的JavaScript编码. ...

  2. Struts入门(三)深入Struts用法讲解

    访问Servlet API Action搜索顺序 动态方法调用 指定多个配置文件 默认Action Struts 后缀 接收参数 处理结果类型 1.访问Servlet API 首先我们了解什么是Ser ...

  3. struts标签<logic:iterate>的用法

    <logic:iterate>主要用来处理在页面上输出集合类,集合一般来说是下列之一: 1. java对象的数组 2. ArrayList.Vector.HashMap等 具体用法请参考s ...

  4. Struts中<s:checkboxlist>的用法

    一.JSP中 ①集合为list <s:checkboxlist name="list" list="{'Java','.Net','RoR','PHP'}" ...

  5. Action开发、通配符、路径问题和struts中常量用法

    1.action开发 开发的几种方式 (1).继承自ActionSupport,(如果用struts的数据效验功,能必须必须使用此功能,因为ActionSupport实现了数据效验的接口) publi ...

  6. Struts, Namespace用法

    最近在用SSH框架做一个项目,在使用Struts 的namespace时遇到不少问题,现在就对struts namespace 做一个简单的介绍吧.(本文从项目结构展开叙述) (第1次写博客, 写的不 ...

  7. Struts 之 通配符 路径匹配 常量用法 配置默认值

    Struts 框架学习 Action的开发的几种方式 方式1 : 继承ActionSupport     如果使用Struts校验功能,必须继承此类 方式2 : 实现Action接口 方式3 :不继承 ...

  8. 有关struts中DispatchAction的用法小结

       今天刚刚看了DispatchAction觉得这个东西有点意思,所以就写点东西,通过它的名字我想应该可以明白它的作用了,用于分发的Action,主要的好处是把一些功能类似的Action放到一个Ac ...

  9. Struts(十六):通过CURD来学习Struts流程及ModelDriven的用法

    背景: 从一个Member的增删改查,来了解Struts2的运行原理及学习ModelDriven拦截器.Preparable拦截器. 新建项目实现列表的展示及删除功能: web.xml <?xm ...

随机推荐

  1. linux中sh基本语法

    介绍:1 开头程序必须以下面的行开始(必须方在文件的第一行):#!/bin/sh  有人说是bash符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序 ...

  2. linux 中php以及nginx的重启命令

    关闭php killall php-fpm 注意:php关闭之前,使用ps aux|grep 'php' 查看一下php的服务及进程 php重启 /usr/local/php/sbin/php-fpm ...

  3. 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

    一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...

  4. python面向对象基础

    面向对象基础 1. 简述 编程方式: 面向过程: 根据代码在脚本的堆叠顺序,从上到下依次执行 函数式编程:将相同功能的代码封装到函数中,直接调用即可,减少代码重复性 面向对象:对函数进行分类和封装,将 ...

  5. Scala Trait

    Scala Trait 大多数的时候,Scala中的trait有点类似于Java中的interface.正如同java中的class可以implement多个interface,scala中的cals ...

  6. HDU 5925 Coconuts

    2016 CCPC 东北四省赛 D. 一道好题. 现场写崩了. 赛后LSh跟我讲了一种离散化的做法, 没听懂. 题意 一个\(R \cdot C\ (R, C\le 10^9)\) 的矩形点阵上有 $ ...

  7. 在Ubuntu上如何往fcitx里添加输入法

    Ubuntu 16.04引入了一个新的包管理工具apt, 用法与apt-get类似. 在终端用apt搜索fcitx支持的输入法 apt search fcitx All Fcitx related p ...

  8. elk系列2之multiline模块的使用

    preface 上回说道了elk的安装以及kibana的简单搜索语法,还有logstash的input,output的语法,但是我们在使用中发现了一个问题,我们知道,elk是每一行为一个事件,像Jav ...

  9. GMap.NET使用一

    https://greatmaps.codeplex.com/releases/view/20235 从上面网站下载需要的组件dll,也可以下载源码研究,解压后有两个文件夹,如图1所示,根据不同的fr ...

  10. Myeclipse如何设置字体大小

    由于Myeclipse一般是英文版的,这就给英语不太好的人带来了一定的麻烦,有时连设置个字体都无法顺利进行!!! 工具/原料   Myeclipse 方法/步骤   双击启动Myeclipse 点击& ...