浏览 4424 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (7) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-01
最后修改:2008-12-01
现在公开这个由IE浏览器引起的Bug,希望引起大家的注意。 下文也将给出一个简单的解决方案。 另注:如果觉得本文还点价值,请顺便帮忙解决一下以下的问题,不胜感激。 (问题放到“问答”里,没人理啊,无耐再次被扔到“问答”里,javaeye管理员的某些倾向性实在无法理解) http://www.iteye.com/problems/7876 测试环境:IE(6和7均可)、Struts2(struts2-core-2.1.2.jar) 背景及现象描述 写一个基于Struts2的页面,使用Struts2的动态方法调用(struts.enable.DynamicMethodInvocation设为true)。 注意在这个页面上只有一个输入框,其他的标签只要不是输入框均可以加上去,加上submit标签,给这个submit标签增加一个method属性,或是将name属性定义为:method:xxxx,即使用动态方法提交。 通过IE访问刚刚写的页面,将光标放到页面唯一的一个输入框中,回车,你会发现,你的页面并不会提交到我们指定的动态方法中,搞不好在页面上还会出现异常信息。但是,如果是通过鼠标点击那个submit标签生成的提交按钮,就没有任何问题;或是换用Firefox浏览器,也没有任何问题。 后来经过测试,如果页面上有两个输入框,通过IE提交,也没有任何问题。 具体代码 <h3>修改个人信息</h3> <div class="sect-content"> <@s.form cssClass="nf" validate="true"> <#if (fieldErrors?exists && fieldErrors?size > 0)> <div class="msg-error"><@s.fielderror /></div> </#if> <p> <label class="f-label">用户名</label> <span> ${user.username} <@s.hidden name="user.id" /> <@s.hidden name="user.username" /> </span> </p> <p> <label class="f-label" for="user.occupation">职业</label> <@s.select cssClass="f-select" id="user.occupation" name="user.occupation" list=util.occupationMap required="true" /> </p> <p> <label class="f-label" for="user.email">电子邮箱</label> <@s.textfield cssClass="f-text" id="user.email" name="user.email" required="true" /> </p> <p class="act"> <@s.submit cssClass="f-button" value="修改" method="iEdit" /> </p> </@s.form> </div> 注意,上面的代码中,只有电子邮箱一个输入框textfield,其他的有hidden、select、submit。 IE浏览器下,当将光标放到电子邮箱的输入框后,直接回车,将无法提交到action的“iEdit”方法,而会重复提交到当面页面action对应的方法。 页面截图: 原因分析 还得对Struts2的源代码进行Debug。 发现org.apache.struts2.dispatcher.mapper.DefaultActionMapper类的handleSpecialParameters方法中会调用request的getParameterMap()方法,然后从中提出submit的name,然后分离出要调用的method名。 不幸的是,IE这个大垃圾并没有象struts2的开发者所预期的那样,只要给submit起了名就会通过request向服务器端提交。当页面上只有一个textfield时,直接在这个输入框下按下回车时,submit这个按钮的name是传不到后台的。 另外,如果页面上有两个输入框,通过IE浏览器提交时,不会有这个Bug。 下面是通过鼠标点提交按钮时的Debug截图。此时,submit的name是可以传到服务器端的。 解决方法 明白了出现这个Bug的原因,其实解决方案可以有好多种。这里说一个简单点的。 可以在定义submit标签时,不要定义method属性;当然也不要定义如name="method:xxxx"这样的属性。 在页面上加一个html的hidden标签,name属性可以定义为如:name="method:xxxx"(xxxx是对应Action类中的方法名)这样,即可解决因为IE引发的Bug。 解决方案的具体代码如下 <p class="act"> <@s.submit cssClass="f-button" value="修改" /> <input type="hidden" name="method:iEdit" /> </p> 其他的方法大家自己想吧,我还能想到的是重定义一下submit标签,当带有method属性时,生成的html代码中,顺便加一个html的hidden标签,这样,就不需要在每个可能有问题的页面中单独对应了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-05-21
我在IE6下发现另外一个怪异的问题,还不知道咋解决
如果有两个Submit控件,method是不同的方法,IE7只会提交点击的那个,而IE6会把两个方法都提交上去,结果服务器始终执行一个方法A,即使我点击的是B的按钮。真晕 |
|
返回顶楼 | |
发表时间:2009-05-21
仔细看了文档,原来Submit控件的Button样式就是在IE6下有问题,只能换Input了。
|
|
返回顶楼 | |
发表时间:2009-05-22
你那个cglib的问题,
异常信息中有一句: Superclass has no null constructors but no arguments were given |
|
返回顶楼 | |
发表时间:2009-06-24
请问一下楼主,debug的时候,怎样可以去看Jar包里的内容。
|
|
返回顶楼 | |
发表时间:2009-06-24
好久不搞java了,eclipse好久不开了。
可以通过eclipse把jar包跟源码关联起来,如果不太明白,google一下吧。 |
|
返回顶楼 | |
发表时间:2009-07-27
就不会变通一下么,非得跟ie对这干!!
|
|
返回顶楼 | |
发表时间:2009-08-13
向楼主学习了,至今我还没跟踪到源码里去哈,个破IE。。。
|
|
返回顶楼 | |