`
ithero
  • 浏览: 143446 次
社区版块
存档分类
最新评论

Struts2 Action方法执行两次的问题?model-driven奇怪现象

阅读更多
项目采用的支撑框架Struts2.09,Spring2 Hibernate3.2.在项目开发过程中.采用Struts2.09开发中采用model-driven的方式来获取对象产生了一些奇怪的问题.第一个问题:
我在action中如果只配置:
<interceptor-ref name="model-driven"/>
例如在我的UserAction就获取不到User对象.user.jsp页面我是按照model-driven的写法如:
user.userName user.userPasswd用的也是strtus2的标签.在Action中同样写了对应的
private User user = new User();
private User getUser(){...}
private void setUser(User user){...}

奇怪的是获取不了页面传来的user对象属性,如果用getParemeter("user.userName")是可以获得值的.
但是在Action中再增加其它的拦截器如:
<interceptor-ref name="validationWorkflowStack" />
或者干脆增加:
<interceptor-ref name="defaultStack"/>
这样Action中的User对象就能顺利获取页面传来的属性值了.
	<package name="userManger" extends="struts-default">
         <action name="albumAction" class="com.xx.struts.action.UserAction">
		      	<result name="success" type="dispatcher">
		      	 	<param name="location">/userinfo.jsp</param>
		      	</result>
		<interceptor-ref name="model-driven"/>
		<interceptor-ref name="validationWorkflowStack" />
	  	 </action>
	</package>
但是这样又出现一个奇怪的问题.就是我的Action中的代码会多执行一次.例如
我的Action中默认的execute()方法中有一段:
user.setCreateTime(new Date())
user.setUserStatus(Constans.IS_LEGALITY);
.....
UserManager.save(user);

这段在execute()方法中的代码会在第一次保存完之后又返回重新执行一次.
这个时候程序当然就会报异常了,有些需要从页面上获得的属性在数据库中是必填的就会报值不能空的异常了.但是事实上是通过Debug可以发现程序的execute的方法重复执行了一次.且控制台也打印出两条insert语句了.刚开始我还以为是hibernate invert配置问题.后来通过debug排除这种问题.不知道这种原因有谁有较深入的了解.或者也同样出现个,请指教一下,谢谢
分享到:
评论
19 楼 kjj 2008-08-16  
# <interceptor-ref name="modelDriven"/> 
#             <interceptor-ref name="validationWorkflowStack"/>

可能是你这个拦截器重复了
18 楼 xuhuasen 2008-08-15  
我工程只是在ajax异步发送action方法时才执行了两次,检查后排除了页面重复提交可能,后来把action方法名改了即可(get*命名改成其他dddd*)。不知道是不是ActionSupport是否对get开头的方法有特殊处理?
17 楼 azure1898 2008-07-11  
可能是你的提交按钮是submit类型,并且在按钮的onclick事件里也有submit()操作导致的。如果是这种情况,请将按钮类型改为button或者去掉onclick事件里的提交操作试试。
16 楼 franktony 2008-06-25  
franktony 写道
我也碰到了这个问题
我的是有时候执行两次,有时候执行三次
继承ActionSupport或者实现Preparable接口
一样执行多次


查了半天,解决了,超级奇怪!!

我用的是struts2+spring2.5+ibatis
前端用的是velocity

action会执行两次或三次

问题在于页面上的img元素

<img src='$user.picUrl'/>

当$user.picUrl等于空字符串的时候,就会引起action方法调用多次!!!

我在model里判断,当picUrl==""的时候,赋个非空字符串值就可以了

为什么?我不知道,但问题就是在这里。



15 楼 franktony 2008-06-25  
我也碰到了这个问题
我的是有时候执行两次,有时候执行三次
继承ActionSupport或者实现Preparable接口
一样执行多次
14 楼 usiboy 2008-06-05  
我也碰到了这个问题,但是最后我找到了方法,如果此action做多种处理,不要继承ActionSupport或者实现Preparable接口,并将execute方法去除掉,每个Action方法就返回个字符串就行。
13 楼 sinosaga 2008-05-07  
我碰到过这个问题,经过n次试验,发现是sitemesh和struts2集成的问题,把layout.ftl里的<body ****>改成<body>就好了
12 楼 kjj 2008-05-05  
跟踪调试以下,调试调试,一般这个都是页面引起的
对了,你把你的html页面发过来!
11 楼 lllyq 2008-04-29  
你要仔细看看xwork的关于model driven的文档,用model driven interceptor需要实现对应的ModelDriven接口,这个接口方法还会用在很多地方被自动调用,例如validation, i18n,
10 楼 mreay 2008-04-29  
我也有相同的问题。
9 楼 xieke 2008-04-24  
我知道啊,你是不是用js脚本提交的?可是你的图片按钮还提交了一次,所以重复了。
structs2 怎么可能有这么大的bug呢
8 楼 bit_run 2008-04-23  
我也有这样的问题,action方法被执行两次,有哪位大侠 知道原因呢?
7 楼 caritasem 2008-04-02  
我也遇到过,我的情况是jsp页面用 a href 提交给action处理,结果action方法被执行两次,jsp页面换成提交表单给action处理,就被执行一次,郁闷中
6 楼 biaoming 2008-01-01  
我也遇多次执行的问题,不过没有用Model-driven,我的是这样,在Action提供一个User,提交form之后就执行两次setUest,而且只有username有值,password为空,不知道什么原因?
5 楼 My_world 2007-12-16  
估计是版本的问题?
4 楼 keqin 2007-12-16  
我也有这样的问题,郁闷了好些天了!
3 楼 ithero 2007-09-10  
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <!-- Constants -->
    <constant name="struts.devMode" value="false"/>
    <constant name="struts.i18n.encoding" value="UTF-8"/>
    <constant name="struts.action.extension" value="shtml"/>
    <constant name="struts.objectFactory" value="spring"/>
    <constant name="struts.custom.i18n.resources" value="ApplicationResources,errors"/>
    <constant name="struts.multipart.maxSize" value="5097152"/>

    <!-- Include Struts defaults -->
    <include file="struts-default.xml"/>
    <include file="struts-space.xml"/>

    <!-- Configuration for the default package. -->
    <package name="default" extends="struts-default">
        <interceptors>
            <!-- Copied from struts-default.xml and changed validation exclude methods -->
            <interceptor-stack name="defaultStack">
                <interceptor-ref name="exception"/>
                <interceptor-ref name="alias"/>
                <interceptor-ref name="servlet-config"/>
                <interceptor-ref name="prepare"/>
                <interceptor-ref name="i18n"/>
                <interceptor-ref name="chain"/>
                <interceptor-ref name="debugging"/>
                <interceptor-ref name="profiling"/>
                <interceptor-ref name="scoped-model-driven"/>
                <interceptor-ref name="model-driven"/>
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="checkbox"/>
                <interceptor-ref name="static-params"/>
                <interceptor-ref name="conversionError"/>
                <interceptor-ref name="validation">
                    <param name="excludeMethods">cancel,execute,delete,edit,list</param>
                </interceptor-ref>
                <interceptor-ref name="workflow">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
            </interceptor-stack>
            <interceptor-stack name="fileUploadStack">
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>

     </package>
</struts>


这是我的struts2的struts2.xml配置文件
user的配置struts2-space.xml配置文件为:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>

	<package name="space" extends="default" namespace="/space">
         <action name="albumAction" class="com.xx.action.UserAction">
		    <interceptor-ref name="modelDriven"/>
		    <interceptor-ref name="validationWorkflowStack"/>
		      	<result name="success" type="dispatcher">
		      	 	<param name="location">/userinfo.jsp</param>
		      	</result>

	  	 </action>
      </package>
</struts>
现在的问题就是:Action中的方法体中的内容会执行两次.配置文件改了好几种了,还是这种问题.为什么会执行两次呢?
2 楼 xiang 2007-09-10  
要看你的struts.xml是怎么配置的

一般来说,使用默认的配置 就可以了,不需要特别的配置
1 楼 ithero 2007-09-10  
现在最让人不得及解的是Action中的方法体的内容会多执行一次.请问大家这主要是由什么原因产生的?排除js提交button submit的可能性,这个我检查过.不会是由这么低级的问题引起的

相关推荐

Global site tag (gtag.js) - Google Analytics