Ajax 请求时莫明执行其它未调用的 Action 的原因及解决方式
2014-12-24 13:33
453 查看
最近在一个项目中使用了 Ajax ,后台代码采用了 Annotation 的方式进行注解,为了方便,我把相关的 Ajax 请求的 Action 方法都封到了一个类里面,如下:
当我调用到 isneedcapcha 这个 Action 时,我发现 getallserversessionmodel 对应的方法也被执行了,但我排查了很久,getallserversessionmodel 这个 Action 我并没有去调用啊,而且当我调用 delserversession 时,getallserversessionmodel 一样也被调用了。但是当我把 getallserversessionmodel 独立成一个类时,这个问题就有莫明奇妙地解决了。独立出来后的类如下:
虽然问题就这样勉强消失了,但这个问题还是让人纳闷,后来查了资料,发现在 Struts2 中使用 json 插件时, Action 类中所有的以"get"开头的方法默认都会被序列化,要避免方法被序列化,可以修改方法名不用“get”开头,或者在方法上加上注解@JSON(serialize = false)声明不要序列化,问题解决,如下:
@Controller @Namespace(value = "/session") @Scope("prototype") @ParentPackage("json-default") public class AjaxAction extends ActionSupport { // 此处省略属性的定义及 get/set 方法 /** * 根据用户名检测用户是否需要验证码 * * @return */ @Action(value = "isneedcapcha", results = { @Result(name = "success", type = "json", params = { "noCache", "true", "contentType", "text/html" }) }, interceptorRefs = { @InterceptorRef(value = "defaultStack"), @InterceptorRef(value = "json") }) public String checkNeedCapcha() { // 省略方法具体业务逻辑 return SUCCESS; } @Action(value = "delserversession", results = { @Result(name = "success", type = "json", params = { "noCache", "true", "contentType", "text/html" }) }, interceptorRefs = { @InterceptorRef(value = "defaultStack"), @InterceptorRef(value = "json") }) public String delServerSessionBySid() { // TODO Auto-generated method stub // 省略方法具体业务逻辑 return SUCCESS; } @Action(value = "getallserversessionmodel", results = { @Result(name = "success", type = "json", params = { "noCache", "true", "contentType", "text/html" }) }, interceptorRefs = { @InterceptorRef(value = "defaultStack"), @InterceptorRef(value = "json") }) public String getAllServerSession() throws Exception { // TODO Auto-generated method stub // 省略方法具体业务逻辑 return SUCCESS; } }
当我调用到 isneedcapcha 这个 Action 时,我发现 getallserversessionmodel 对应的方法也被执行了,但我排查了很久,getallserversessionmodel 这个 Action 我并没有去调用啊,而且当我调用 delserversession 时,getallserversessionmodel 一样也被调用了。但是当我把 getallserversessionmodel 独立成一个类时,这个问题就有莫明奇妙地解决了。独立出来后的类如下:
@Controller @Namespace(value = "/session") @Scope("prototype") @ParentPackage("json-default") public class AjaxAction1 extends ActionSupport { // 此处省略属性的定义及 get/set 方法 /** * 根据用户名检测用户是否需要验证码 * * @return */ @Action(value = "isneedcapcha", results = { @Result(name = "success", type = "json", params = { "noCache", "true", "contentType", "text/html" }) }, interceptorRefs = { @InterceptorRef(value = "defaultStack"), @InterceptorRef(value = "json") }) public String checkNeedCapcha() { // 省略方法具体业务逻辑 return SUCCESS; } @Action(value = "delserversession", results = { @Result(name = "success", type = "json", params = { "noCache", "true", "contentType", "text/html" }) }, interceptorRefs = { @InterceptorRef(value = "defaultStack"), @InterceptorRef(value = "json") }) public String delServerSessionBySid() { // TODO Auto-generated method stub // 省略方法具体业务逻辑 return SUCCESS; } }
@Controller @Namespace(value = "/session") @Scope("prototype") @ParentPackage("json-default") public class AjaxAction2 extends ActionSupport { // 此处省略属性的定义及 get/set 方法 @Action(value = "getallserversessionmodel", results = { @Result(name = "success", type = "json", params = { "noCache", "true", "contentType", "text/html" }) }, interceptorRefs = { @InterceptorRef(value = "defaultStack"), @InterceptorRef(value = "json") }) public String getAllServerSession() throws Exception { // TODO Auto-generated method stub // 省略方法具体业务逻辑 return SUCCESS; } }
虽然问题就这样勉强消失了,但这个问题还是让人纳闷,后来查了资料,发现在 Struts2 中使用 json 插件时, Action 类中所有的以"get"开头的方法默认都会被序列化,要避免方法被序列化,可以修改方法名不用“get”开头,或者在方法上加上注解@JSON(serialize = false)声明不要序列化,问题解决,如下:
@Controller @Namespace(value = "/session") @Scope("prototype") @ParentPackage("json-default") public class AjaxAction extends ActionSupport { // 此处省略属性的定义及 get/set 方法 /** * 根据用户名检测用户是否需要验证码 * * @return */ @Action(value = "isneedcapcha", results = { @Result(name = "success", type = "json", params = { "noCache", "true", "contentType", "text/html" }) }, interceptorRefs = { @InterceptorRef(value = "defaultStack"), @InterceptorRef(value = "json") }) @JSON(serialize = false) public String checkNeedCapcha() { // 省略方法具体业务逻辑 return SUCCESS; } @Action(value = "delserversession", results = { @Result(name = "success", type = "json", params = { "noCache", "true", "contentType", "text/html" }) }, interceptorRefs = { @InterceptorRef(value = "defaultStack"), @InterceptorRef(value = "json") }) @JSON(serialize = false) public String delServerSessionBySid() { // TODO Auto-generated method stub // 省略方法具体业务逻辑 return SUCCESS; } @Action(value = "getallserversessionmodel", results = { @Result(name = "success", type = "json", params = { "noCache", "true", "contentType", "text/html" }) }, interceptorRefs = { @InterceptorRef(value = "defaultStack"), @InterceptorRef(value = "json") }) @JSON(serialize = false) public String getAllServerSession() throws Exception { // TODO Auto-generated method stub // 省略方法具体业务逻辑 return SUCCESS; } }
相关文章推荐
- html 解决表单提交时调用jquery ajax出现执行了请求,但进入了error方法里面
- struts2 ajax请求发现执行action两次原因
- 动态方法调用 在Struts2中动态方法调用有三种方式,动态方法调用就是为了解决一个Action对应多个请求的处理,以免Action太多 第一种方式:指定method属性 这种方式我们前面已经用到过
- 在ASP.NET中使用IHttpHandler处理请求(如自实现AJAX)时,无法获得Session(或者说是Session 为 null)的原因及解决方法
- 解决Ajax在兼容模式下后台调用执行两次结果不变的问题(已解决)!
- 一般$.ajax无法调用action的原因
- 关于调用系统照相机不执行OnActivityResult的解决方式
- Struts2 请求一次Action,却执行两次方法的解决
- FireFox下Ajax同步请求onReadyStateChange不执行问题解决
- 使用<a>标签提交action会执行两次后台方法的原因(反射机制小实例问题的解决)
- MVC学习笔记之使用JQuery方式发送Ajax请求调用后台Controller
- FireFox下Ajax同步请求onReadyStateChange不执行问题解决
- spring MVC中一次url请求却执行目标action两次的解决办法
- 调用RadioGroup的check(id)方法,监听onCheckedChanged方法被执行多次;调用clearCheck(),onCheckedChanged方法仍被执行的原因和解决办法
- php检测ajax方式的调用请求
- ajax动态为a标签href赋值不执行跳转的原因分析及解决
- go调用其它C库,若采用命令行方式,不支持重定向的输出解决;smp协议未打开,发送信息到对方,没人响应
- ajax跨域请求的解决方式
- IE8浏览器缓存问题导致Ajax的GET请求只能执行一次的解决办法
- ajax请求跨域问题-通过jsonp方式解决