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

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的可能性,这个我检查过.不会是由这么低级的问题引起的

相关推荐

    struts2 model-driven

    4. **请求处理**:当用户发送请求时,Struts2框架会自动将请求参数绑定到Action类中的模型对象,然后调用Action的execute方法执行业务逻辑。 **三、ModelDriven模式的优点** 1. **代码简洁**:Action类的代码量...

    Struts2SpringUnitDemo单元测试

    4. **Action和Service的测试**:在Struts2中,Action类是处理用户请求的实体,它通常调用Service层来执行业务逻辑。Service层封装了与数据库或其他外部资源的交互。在单元测试中,Action的测试主要检查其接收请求、...

    struts-2.5.14.1-apps struts2官方例程

    1. **Action配置**:了解如何在Struts2中创建Action类,定义Action的执行方法,并在struts.xml配置文件中进行映射。 2. **结果类型(Result Type)**:学习如何配置Result,特别是如何使用HTTP状态码和Content-Type...

    Struts2登录DEMO

    1. **Action类**:在Struts2中,Action类是业务逻辑的载体,通常继承自`org.struts2.StrutsAction`或实现`com.opensymphony.xwork2.Action`接口。在这个DEMO中,你会看到一个名为`LoginAction`的类,它负责处理用户...

    struts1和struts2的对比

    - Action的生命周期由容器管理,且执行方法为`execute()`。 - 测试Struts1的Action时,通常需要模拟整个Servlet环境,使用如StrutsTestCase等工具进行单元测试。 - **Struts2中的Action** - Struts2采用了更灵活...

    Struts-jar包

    5. **模型驱动(Model Driven)**:Struts2可以自动将请求参数绑定到Action的属性,实现模型驱动,简化了数据处理。 6. **值栈(Value Stack)**:Struts2使用值栈存储Action的属性,这些属性可以直接在JSP页面中...

    Struts2体系结构图例详解

    7. **Model Driven**:Struts2支持模型驱动模式,可以让Action直接引用业务对象,简化开发。 8. **Plug-in Architecture**:Struts2的插件架构使得扩展和集成其他功能变得容易,如Tiles、Hibernate等。 9. **OGNL...

    Struts2框架实例

    Struts2框架是一个基于Model-View-Controller(MVC)设计模式的Java Web应用程序框架,由Apache软件基金会维护。这个框架极大地简化了开发过程,提高了可维护性和可扩展性。Struts2通过整合多种优秀框架,如Tiles、...

    完整的Struts2源码

    Struts2是一个强大的Java web应用程序框架,它基于MVC(Model-View-Controller)设计模式,为开发者提供了构建可维护性、可扩展性极高的应用的解决方案。此压缩包文件"struts-2.2.3"包含了Struts2框架的源代码,这将...

    JSP上手struts2常用包2.3版

    Struts2是一个强大的Java web应用程序框架,用于构建和部署可维护、高性能的MVC(Model-View-Controller)架构的应用程序。它简化了MVC的实现,提供了丰富的特性集,使得开发者可以更专注于业务逻辑而不是繁琐的底层...

    Struts2学习笔记

    - **流程概述**:用户提交请求,Struts2核心过滤器接收并处理该请求,根据配置文件找到对应的Action,执行Action中的方法,然后根据返回的结果选择合适的视图进行展示。 1. **请求接收**:用户提交请求,Struts2的...

    webwork配置详解

    Action分为两种类型:Field-Driven Action 和 Model-Driven Action。 - **Field-Driven Action**:这种类型的Action是基于字段的,每个字段对应一个用户界面的输入。当Action被调用时,WebWork会自动将请求参数绑定...

    webwork学习资料

    动作有两种主要类型:Field-Driven Action 和 Model-Driven Action。Field-Driven Action更适合处理简单的表单提交,其中每个字段都直接映射到Action的属性。而Model-Driven Action则将整个业务对象(Model)作为...

    struts2知识总结.txt

    - 使用模型驱动(Model-Driven)方式时,需要实现`ModelDriven`接口并重写`getModel()`方法,以返回模型对象供框架使用。 - 在URL参数中可以通过`getter`/`setter`方法传递值,例如:`/action?field=value`或`/...

    struts2第一源代码11

    5. **模型驱动(Model Driven)**:Struts2的模型驱动模式使得Action可以直接与域对象(通常是业务实体类)绑定,简化了数据处理过程。 6. **值栈(Value Stack)**:值栈是Struts2中用于存储请求数据和视图展示...

    Struts2内置拦截器简介

    ### Struts2内置拦截器简介 #### 一、概述 Struts2框架是Apache软件基金会下的一个开源项目,它提供了一种基于MVC(Model-View-Controller)设计模式的Web应用开发框架。Struts2的核心是拦截器(Interceptor)机制...

    Struts2.3.15jar包

    Struts2.3.15jar包是Apache Struts框架的一个特定版本,它是Java Web开发中的一个关键组件,尤其在基于MVC(Model-View-Controller)架构的应用程序设计中。Struts2作为一款强大的开源框架,为开发者提供了构建动态...

    struts2中Action数据绑定几种方法.rar

    以下是关于Struts2中Action数据绑定的几种方法的详细说明: 1. **属性注解(Field Annotation)** Struts2支持使用JavaBeans的getter和setter方法进行数据绑定,但也可以通过在字段上添加注解来简化这一过程。例如...

    struts2学习代码

    Struts2是一个基于MVC(Model-View-Controller)设计模式的Java web应用程序框架,它在Java社区中广泛使用,特别是在构建企业级Web应用时。这个"struts2学习代码"压缩包提供了一些实例和练习,帮助开发者深入理解和...

Global site tag (gtag.js) - Google Analytics