prototype的Ajax向Struts2发送'&_='的小bug
(by goodhumor)
前段时间调J2EE程序时打开Struts2开发模式(<constant name="struts.devMode" value="true"/>),
Tomcat经常显示log的如下的错误:
[ERROR][http-8080-12]com.opensymphony.xwork2.interceptor.ParametersInterceptor
(ParametersInterceptor.java:204)- ParametersInterceptor - [setParameters]:
Unexpected Exception caught setting '_' on 'class cdbp.action.admin.RegistAction:
Error setting expression '_' with value '[Ljava.lang.String;@3744bc'
刚开始从jsp页面找错,愣是没找到哪有个'_'参数,而且这个小bug也不影响程序正确执行,
因而扔在一边不管了。今天心血来潮再细查一遍,终于查到原因。
原来某个JSP页面中用到prototype-1.4.0.js的Ajax.Request发送请求,而prototype-1.4.0.js
中的631行加上了'_'参数,如下:
request: function(url) {
var parameters = this.options.parameters || '';
if (parameters.length > 0) parameters += '&_=';//(1)就是这了
……
把该行屏蔽掉,Struts2再也不报以上错误了。
prototype-1.6.0.js也有类似语句(1222行):
if (params = Object.toQueryString(params)) {
// when GET, append parameters to URL
if (this.method == 'get')
this.url += (this.url.include('?') ? '&' : '?') + params;
else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
params += '&_='; //(2)就是这了
}
不知prototype为何非要加上这个请求参数,难道"Konqueror|Safari|KHTML"要求的?
反正用IE和FF的人较多,把该句屏蔽掉不管了。