标准的struts是同步交互的,客户端提交请求到Action,服务端处理后findforward()刷新整个页面,ajax是异步交互,页面通过
xmlHttpRequest提交一个后台线程到服务端,服务端处理后将xml或者html写回客户端,客户端回调函数随即刷新内存中的dom树.
由于ajax不用刷新整个页面,且每次回调函数直接更新内存,所以速度非常快,且客户体验很丰富,比如用ajax可以很容易实现菜单联动(因为它只更新下
级菜单,上一级菜单根本不会受影响,在jsp中意味着不用关心页面刷新时其它表单元素的选择值),另外还有一点ajax是客户端的技术,对struts的
架构不会影响(客户端的提交可以用ajax提交到servlet,也可以沿用struts方式提交到Action中),因此很容易想到将ajax和
Struts结合起来,共用两者的优势.
用ajax+struts的架构有一些需要注意的问题,这是我在项目中的一些感受,在这里写出来,供各位同仁参考:
1:设计页面跳转的操作不要用ajax.ajax主要是用于异步交互,所以它是同一个页面的操作,在xmlHttpRequest.open()方法中,
"get"方法明确表示是从服务端获取,"post"方法虽然表示提交,但主要用于浏览器url隐藏参数的具体值,在ajax的servlet中用
response.sendRedirect()方法是无效的,原页面会傻等后台servlet的相应.因此MIS系统中的新增,修改等需要到另一个页面
的操作都应该用传统的form.submit()的方式提交页面.
2:在ajax传参时要特别注意\",\'这些字符,尤其是一个参数中含多个字段的情况,尽量不要用'$','%'等特殊字符来分割.在servlet端
getParameter()的时候会出问题,比如你的参数是param1="dkfjdslf"+form1.text1.value;而你的
text1中的字符串含有\"字符,那\"后面的
就都传不过去了.我们项目中遇到过这种情况,找了很久才发现参数只传了一部分.建议如果参数不全的情况首先检查其中是否有特殊字符.
3:struts和ajax合用时有时会出现struts刷新整个页面结果把ajax效果覆盖了的情况,比如我们的翻页组件是会提交整个表单到原页面,这
时如果客户做了ajax的其它操作,翻页返回时这些效果就都没有了.我的建议是在页面中用<input
type=hidden>元素保留ajax的主要效果,每次ajax回调函数返回时更新该元素,这样即时重新提交了该页面也可以通过
request.getParameter()取到ajax效果元素的值.在我们项目中是把每次的查询sql语句做为hidden元素保存了的,因此每次
翻页后下级表格或者其它表单元素仍可以通过该sql取得.
4:ajax大部分是js脚本,js脚本的调试比较麻烦,主要的办法就是alert()和iE左下脚的错误提示,一般来说大部分的脚本错误都在语法上,比
如select1.options[1]写成了select1.option[1]什么的,看资料上有IE有Dom
Inspector可以查看内存中的dom树结构(在google上搜Internet Explorer developer
toolbar),用这些第三方的工具可以帮我们调试ajax
5:有时候strust在request中setAttribute的东西会跟ajax传的parameter冲突(比如上头提到的sql,在新增操作完
后返回查询页面时,struts会在request.setAttribute("sql",sql),
而原查询页面的下级菜单查询等ajax操作会传以"sql="+sql的方式传参,这样两个sql会冲突,我的建议是
request.getParameter("sql")==null?request.getAttribute("sql"):request.getParameter
("sql"),首先保证本页面的异步操作,再考虑其它页面的跳转操作.
好了,暂且写这些吧,其中有些可能各位高人看起来是废话,那请毫不留情的斧正!在此祝各位同仁中秋国庆愉快,祝和我一样国庆加班的同事们身体健康,万事如意.