但是它也有不之处,Demo中deServerSide.jsp例子?4下后竟然L了,sourceforge论坛?br />294条记录竟然没有一个h发现Q我和其他几个同事用他们提供的|上Demo也是一P提了q个
问题一时半会也没有{。看来,q也是js牛h才能真正玩的通的Qؓ什么这么说呢?因ؓ一旦出
了问题就要研Iaa.js了。说是不用自己写jsQ但实际上还是要把aa.js研究透了才敢用到目中?br />
下面把我q两天的所学做一下ȝQ?br />2.1 从配|上来讲Q?br /> ajaxanywhere没有tld文gQ但是他需要在web.xml中配|一个filterQ这p够了?br /> <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>
值得注意的是Q只有通过此filter的request
url才能够用它的功能,所以要保需要此功能的url能够通过此filterQ我刚开始的时候写了一个servlet与ajaxanywhere?
jsp面联合使用Q但L抱错Q“说q回的类型ƈ不是text/xml”类型,后来
我想肯定是要求servlet必须q回text/xmlcd了,于是在servlet的末֢加了一句话Q?br />response.setContentType("text/xml; charset=UTF-8");心想q回没错了吧Q没惛_q行时仍旧显C“返回类型不?br />text/xml”,q是面的js报的错误Q也是在返回信息到了页面,叉分析q回数据的时候报的错误。仔l检查了servlet
讄q回cd的那句话q没有错误?/p>
原来问题出在servlet的mapping上面Q设|了一?xxxx没有?.do"(q时q没有struts环境?Q这样一来,serveltq?
回给面的responseq没有被AjAxanywhere
Filter截获Q当然就没有没有被处理过Q具体内部处理不太清楚)Q于是就Z上面的错误?br /> 解决Ҏ很简单,把所有需要ajaxanywhere的servlet mapping配置成一个比较特D的后缀Q例如localServlet.ajq样?br />web.xml中配|AjaxAnywhereqo器的filer-mapping 增加一?br /> <filter-mapping>
<filter-name>AjaxAnywhere</filter-name>
<url-pattern>*.aj</url-pattern>
</filter-mapping>
q样所有的后缀为aj的servlet都可以使用上此Filter了。错误就没有了。okQ上面讲了ajaxanywhere + servlet 的方法?/p>
2.2 配置ajaxanywhere + struts .
配置也比较简单。在struts的配|正的基础上,只需要配|ajaxanywhere的filterQ增加一个mappingQ如果struts
ActionServlet配置了mapping *.xx
,那么表示所与后~为xx的url都经qAcitonServlet来处理,好,ajaxanywhere要求所有的
url在进入AciontServlet之前首先q入他的FilterQ离开ActionServlet之后也要首先q入他的FilterQ而不是直接返回页面?br />q样Q只要在ajaxanywhere filter的mapping后面增加
<filter-mapping>
<filter-name>AjaxAnywhere</filter-name>
<url-pattern>*.xx</url-pattern>
</filter-mapping>
卛_。这样就能和struts配置使用了?/p>
2.3 配置ajaxanywhere + jsf
例子中也讲到了与jsf配合使用的方法,jsf我没有用q,但是配置ajaxanywhere要做得就是增加一个filter-mapping而已。假?
jsf的后~?.jsf,那么只需要在 ajaxanywhere filter中增加一个此后缀的mappingQ就ok了?/p>
2.4 ajaxanywhere + * + jstl
于jstl连用实际上是与jspq用Q但是把jstl也融合进来需要注意,ajaxanywhere Demo例子中的web.xml
不兼容jstl,所以除了要把必要的jar文gtld文g拯到项目之外,q要把web.xml的头部进行修改,原来是这样写?br /> <web-app>..... ,必须要修Ҏ
<web-app xmlns="http://java.sun.com/xml/ns/j2ee q样才行?br /> 否则你会发现一个特别奇怪的错误Q例?lt;c:forEach items="sdfsd" var="item">${item.value}</c:forEach>
是不@环显C,但是<c:out value="xxxx"/>却可以运行,当时懵了。修改了web.xml之后׃切正怺^_^
3Qajaxanywhere的目录结构和文g的特艌Ӏ?br /> 和普通的目的区别就在三个地方:
3.1 /aa/aa.js 里面包含了ajaxanywhere必须使用的javascript对象和方法。这个文件必ȝQ?br /> 而且每个jsp面都要引用他,如果x入用就有必要对里面的方法有所了解?br />
3.2 多了一个FilterQ一个ajaxanywhere.jarQ对E序员是透明的?/p>
3.3 jsp面要引入lib<%@ taglib uri=" 单用时只需要配|好<aa:zone>,
然后当GetҎQ链接蟩转)Q某标签的onclick中调用“ajaxAnywhere.getAJAX(目标url)”?br /> 当PostҎQ表单提交)Ӟ首先配置form名字Q例如,ajaxAnywhere.formName = "main"
在表单里调用“ajaxAnywhere.submitAJAX();”或者干脆设|一个能够自动submit
的input按钮例如<intput type="image"><input type="submit">׃么都不用写,也能提交?/p>
4Q具体用方法:
4.1 jsp面上:
定义h区域Q?lt;aa:zone name="xxxx">来定义一个区域?br /> 可以在jsp面上“指定”刷新区域,他和“定义”刷新区域的区别在于Q定义了不一定会被刷斎ͼ定义?br /> 又被指定的刷新区域才能被h。通过覆盖js中AjaxAnywere对象的ajaxAnywhere.getZonesToReload
Ҏ来指定刷新区域。例如,
ajaxAnywhere.getZonesToReload = function () {
return "zone,1"
};
指定了两块刷新区域?br /> 在刷新区域显C新的内容:
h区域里面Q用动态脚本(scripletQjstlQ从requestQ或其他范围Q获得服务端q回的新的数据,
q显C。(推荐使用jstl比scriptlet更简z)?/p>
4.2 服务端:
不论是Servletq是Actionq是直接使用jsp做服务端Q代码都是一L?br /> 必须有的几行代码是:
if (AAUtils.isAjaxRequest(request)){
AAUtils.addZonesToRefresh(request, "xxxx");//q句话也可以不写如果jsp面已经指定了刷新区?br /> }
然后q回一个List攑ֈrequest或者其他范围内Q供面昄?br />
注意Q?br /> 服务端代码不必用设|context-type为xmlQ没有必要。因为通过ajaxanywhere filter可以做到q一炏V?br />
5Q定制js
5.1 如何在response未q回期间不显C默认的“loading...”(蓝色囑ֱQ?
通过在jsp面里覆?ajaxAnywhere.showLoadingMessage = function() {}q设|ؓI?br />
5.2 如何修改默认的loading。。。图片ؓ其他囄Q?br /> 通过在jsp面里覆?ajaxAnywhere.showLoadingMessage QhideLoadingMessage,Ҏ?br /> 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";
}
好,q样把把默认图片替换成其他囄了?br />
5.3 如何修改loading囄的显CZؓ之ؓ相对位置Q?br /> 只需要配|topQleftQ例?
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";
}
//注意Q如果alink没有定义Q那么就始终昄q度条了。有时抱错,有时不抱错?br /> div.style.top = document.all.alink.offsetTop;
div.style.left =document.all.alink.offsetWidth-170; // 如果不减Q在屏幕上就看不C?br /> 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 如果讄默认的弹出框。在上次h被忽略后Q默认会弹出一个框Q如果让不让他出来?
只需要覆盖或者直接在aa。js中修?br /> ajaxAnywhere.handlePrevousRequestAborted = function() {
// alert("攑ּ上一ơ的提交");//或者什么都不作
}
5.5 如何处理异常弹出框?
只需要覆?br /> ajaxAnywhere.handleException = function(type, details) {
alert("出异怺: \n\n\n ***************\n"+details.substring(0,350)+"\n...\n\n ***************");
}
5.6 如何处理错误弹出框?
只需要覆?br /> ajaxAnywhere.handleHttpErrorCode = function(code) {
alert("q回错误: \n \n \n ***************\n错误?" + code+"\n\n ***************");
}
5.7 如何定时h指定区域Q?br /> ajax定时h执行得更象普通的jsQ?br /> // 指定定期执行的刷新所指向的url
function go() {
ajaxAnywhere.getAJAX('demo.jsp');
}
//指定h区域
ajaxAnywhere.getZonesToReload = function () {
return "zone,1"
};
//指定h之后的动?br /> ajaxAnywhere.onAfterResponseProcessing = function () {
window.setTimeout("go();", 1000);
//setInterval("go()",1000);
}
//隐藏loading囄
ajaxAnywhere.showLoadingMessage = function(){};
//调用h后的动作
ajaxAnywhere.onAfterResponseProcessing();
q样构成了一个@环?/p>
与普通的js定时执行某个操作q没有什么不同,只不q通过在定时操作中使用ajaxQ可以调用非客户端的E序Q即后台E序。而普通的定时执行却做不来?br />
6Q一些与ajaxanywhere无关的技术?br /> 6.1 struts动态form
ajaxanywhere
不是必须指定formNameQ因为它默认使用forms[0]当作提交的formQ这q不保险Q一个页面可能有多个formQ,所以有必要指定
formNameQstruts?lt;html:form>标签Q必struts-config配置了form时才行,没有必要使用
ActionForm时可以定义一个空的DynaActionForm,例如Q?br /> <form-bean name="localeform" type="org.apache.struts.action.DynaActionForm">
<form-property name="nnn" type="java.lang.String"/> //q句话也可以没有。即没有属性的form
</form-bean>
q样׃必多定义一个类了,动态form与ajaxanywhere配合得很好?/p>
6.2 struts DispatchAction
ajax与strutsDispatchAction配合得也很好?/p>
ȝQ?br /> 比较ajax tagsQstruts ajaxtagQ还是ajaxanywhere比较好些?br /> ajaxtags是基于组件的Q能实现的功能有限。struts ajaxtags我用了之后感觉复杂。好了,暂时写q么多,以后的实늻验就在ajaxanywhere的补充了?br /> 下蝲地址Q?a >http://ajaxanywhere.sourceforge.net/index.html
~省模块的index.html包括两个链接Q分别连接两个模块的index.jsp资源Qregistration模块的index.jsp?
交后Q如果验证失败会重新q回到该模块的index.jspQ否则用资源resultok.jsp昄注册成功的结果。模块approval?
index.jsp提交后进入到resultok.jsp的界面,昄批准与否的结果?
我们从应用程序的文gl成和交互两斚w的模块情况对我们要实现的例子q行了比较清晰的l织Q下面我们讲解如何在struts中实现模块化~程?
3、STRUTS的模块化机制
我们讲解STRUTS的相关配|,q些配置大部分与模块化编E有关系Q有些没关系但对理解STRUTSE序有利?
3.1 ActionServlet参数
ActionServlet有好多参数可供设|,STRUTS在WEB应用部v描述W中定义q些参数Q?
·Config——逗号盔R的应用上下文相对的配|文件的路径Q这些配|文件包含了STRUTS WEB应用的缺省模块的讄。缺省gؓ /WEB-INF/struts-config.xmlQ?
·config/${module} -逗号盔R的应用上下文相对的配|文件的路径Q这些配|文件包含了STRUTS
WEB应用?{module}模块的设|。这个模块的前缀?${module}Q多个config/${module}参数定义了多个STRUTS
WEB应用模块Q?
·convertNull - 如果q个参数的gؓ true, 数值型Java 包装c(比如java.lang.IntegerQ的初始值将会是nullQ而不?。缺省值[false]
·rulesets-逗号盔R的附加的org.apache.commons.digester.RuleSet列表QDigester在分析配|文件时Q除了针Ҏ准的配置元素的RuleSet之外Q还会利用这些对象来分析配置文gQ这h供了一个配|扩展机制?
·validatin - 指示我们是否使用验证型的XML分析器来处理配置文gQ缺省gؓ [true]
3.2 配置文g
我们说STRUTS针对每个模块可以有一个或多个配置文gQ这些配|文件用XML来书写,下面是标准的配置文gXML的元素解释?
3.2.1 元素 action
q个元素描述了一个ActionMapping 对象Q这个对象将用来处理用户针对某个模块相对应的URI 的请求?
3.2.2元素 action-mappings
q个元素描述了一个ActionMapping
对象集,cd是org.apache.struts.action.ActionMapping。与STRUTS的ActionServlet
注册的URL模式匚w的用戯求将具体地被q些ActionMapping 对象处理。子元素定义了各个ActionMapping对象?
3.2.3元素 controller
q个元素描述了一个struts模块q行环境的配|——ControllerConfig bean
3.2.4 元素 data-source
q个元素描述了一个DataSource 对象——JDBC 2.0 标准扩展。这个对象将被保存在应用上下文中Q而且可以象JavaBean 一栯讄?
3.2.5 元素 exception
q个元素向strutspȝZ个exceptioncd注册了一个ExceptionHandler?
3.2.6 元素 form-bean
q个元素定义了一个ActionForm[org.apache.struts.action.ActionForm子类Q这个定义被"action"元素所引用?
3.2.7 元素 form-property
q个元素描述了一个配|DynaActionForm 或其子类的JavaBean属性。当q个元素的父元素"form-bean"
?type" ?[org.apache.struts.action.DynaActionForm]
或其子类时有效。如果用了一个定制的DynaActionForm 子类Q父元素"form-bean" ?dynamic"属性必设?
"true"?
3.2.8 元素 forward
q个元素描述了一个ActionForward
对象Q这个对象将被Action的doPerformq回。在代码中一般用一个逻辑名字来引用ActionForward
对象。一?forward" 可以用来描述全局或局部ActionForwards. 全局?forwardsҎ块内所有的Action
对象有效Q局部forwards 嵌套?action> 元素内,只能被相应的ActionMapping 中的Action讉K?
3.2.9元素 message-resources
3.2.10元素 plug-in
3.2.11 元素 set-property
目录Q?
4、模块定?/a>
5、模块选择
6、ȝ
4、模块定?/b>
通过上面对STRUTS的模块化机制的讲解,我们现在可以开始实现我们的模块化例子程序了?
4.1 Actionservlet参数
我们在struts的web.xml中定义模块。下面的代码定义了三个模块:~省模块Qapproval和registration模块Q前~分别是”?/approval?registration?
|
4.2 approval模块配置文g
下面是approval模块的配|文Ӟ定义了form和actionQ以及相应的forward?
|
|
|
|
|
|
|
|