Struts2问题还真不少,哎,无耐已经上了这条船。
现在公开这个由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标签,这样,就不需要在每个可能有问题的页面中单独对应了。
- 大小: 32.3 KB
- 大小: 38 KB
分享到:
相关推荐
struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别...
struts2配置过滤器 示例代码
Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)
Struts2教程:处理一个form多个submit
struts2 资料struts2 资料struts2 资料struts2 资料
struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全...
struts2向服务器返回json数据的一个简单Demo,便于理解
struts2-core-2.0.1.jar, struts2-core-2.0.11.1.jar, struts2-core-2.0.11.2.jar, struts2-core-2.0.11.jar, struts2-core-2.0.12.jar, struts2-core-2.0.14.jar, struts2-core-2.0.5.jar, struts2-core-2.0.6.jar,...
Struts2是一套非常优秀的Java WEB应用框架,实现优雅、功能强大、使用简洁。目前已有大量的企业项目采用Struts2来作为Web框架进行开发,掌握Struts2是每个进行Web开发的Java程序员的一项必备技能。 本视频对Struts2...
struts2的概述struts2下的HelloWord struts2基础 struts2做好准备 struts2的标志 struts2的Action讲解 struts2中的国际化 struts2转化器 struts2实现表单数据校验 struts2的基石-拦截器 struts2中实现IOC struts2中...
NULL 博文链接:https://cdxs2.iteye.com/blog/1926357
struts2源码 struts2案例 struts2使用包
一个很好的关于Struts2的讲义!struts2讲义struts2讲义struts2讲义struts2讲义struts2讲义struts2讲义
Struts2 Struts2 超好的Struts2 pdf 文档 Struts2 Struts2 超好的Struts2 pdf 文档 Struts2.pdf文档
struts2例子struts2例子struts2例子struts2例子struts2例子struts2例子struts2例子struts2例子
《Struts2技术内幕:深入解析Struts2架构设计与实现原理》由国内极为资深的Struts2技术专家(网名:downpour)亲自执笔,iteye兼CSDN产品总监范凯(网名:robbin)以及51CTO等技术社区鼎力推荐。《Struts2技术内幕:深入...
Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.
Struts2漏洞(struts2-032,struts2-045)2016年引发的银行大动作及修复办法
struts2校验器,字段,非字段校验器的语法规则……
Struts2Struts2Struts2Struts2Struts2Struts2Struts2Struts2Struts2Struts2Struts2Struts2Struts2Struts2Struts2Struts2Struts2Struts2Struts2Struts2Struts2Struts2Struts2Struts2Struts2Struts2Struts2Struts2...