您的位置:首页 > 编程语言 > Java开发

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

2009-01-07 18:14 435 查看
其实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就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: