struts中使用DispatchAction可能会遇到的一个问题

本文介绍了Struts中DispatchAction的工作原理,以及如何解决因URL参数导致的方法调用错误问题。当用户请求带有特定参数时,DispatchAction将根据该参数调用相应方法。文章还提供了一种解决方案,即直接在form的action中指定参数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实DispatchAction的原理说起来也很简单。
在struts-config.xml中配置Action的时候,加一个parameter的属性,并且起一个名字,通常为"method"。
用户在浏览器端发起请求的时候,一般都会带这个参数的。请求发送到服务器端之后,相应的DispatchAction会先判断这个参数是否存在,存在的话,值又是什么。然后根据浏览器端传过来的method的值,去调用相应的method,调用失败就抛异常。
任何项目都可以根据项目需求写一个自定义的DispatchAction,只要符合项目的需求就好,不过原理都是一样的。
#method参数的传递,可以用Get方式,也可以用post方式。

对于一些业务逻辑相对复杂点的画面来说,这个DispatchAction的存在确实是非常有必要的。

不过,在使用的时候,可能会遇到一个问题。
有时候,你会发现程序走到了一个错误的method里面去。本来是想到B method里面去的,可是却走到了之前的A method。

什么原因呢?
因为DispatchAction读到的method的值还是你之前传的A,而不是你在客户端设置的B,所以它依然会跳到A method去执行。

这主要是因为客户端有两个地方传同一个参数的不同的值。
一个是URL,当你前面一次是通过Get方式访问的时候,使用的是类似于"http://xxxxx/xxx.do?method=A"之类的方式,然后这个URL就保持在了浏览器的地址栏里面。接下来用户点击某一个button或者link要去执行B method的时候,我们一般会使用javascript来实现,把表单中的一个隐藏变量叫做method的值设置为B,然后通过POST方式,传回到了服务器端。

这时,DispatchAction中通过request.getAttribute()读到的method的值一定是A,而不是B。
# 具体原因到底是B被A覆盖了,还是因为A在B之前,记得不清楚了,什么时候确认一下。

所以,如果你在写类似的代码调试时(不一定是Struts),遇到了类似的问题,可以确认一下是不是上面说的这个原因。

 

---------------------------------------------------------------------------------------------------------

2009/07/05 补充

一种可行的办法是:要跳转到B method时,不要去设置那个隐藏变量method的值了,而是直接在form的action后面加上参数method=B就可以了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值