困惑的Struts将页面参数填充到操作成员变量

时间:2016-03-19 10:40:34

标签: struts2

Struts web项目,后期表单中有查询条件

compile 'com.google.android.gms:play-services:8.4.0'

并且有一个成员变量在行动

<input type="text" name="artsianTime" value="16-3-19" readonly="readonly" 
         id="artsianTime" class="Wdate1" style="width: 100px" 
    onclick="WdatePicker({dateFmt:'yyyy-MM-dd'})">

并在private Date artsianTime = new Date(); public void setArtsianTime(Date artsianTime) { System.out.println(this); System.out.println(artsianTime); this.artsianTime = artsianTime; } 中设置断点,在执行查询调用setArtsianTime时找到三次,所以我很困惑为什么要打三次,为什么不只是一次?

setArtsianTime

eclipse调试透视图中的完整堆栈跟踪

第一次打电话 enter image description here

第二次电话 enter image description here

第三个电话 enter image description here

struts.xml中

com.foo.artisan.web.ArtisanDateQueryAction@6cc039da
Sat Mar 19 00:00:00 CST 2016
com.foo.artisan.web.ArtisanDateQueryAction@6cc039da
Sat Mar 19 00:00:00 CST 2016
com.foo.artisan.web.ArtisanDateQueryAction@6cc039da
Sat Mar 19 00:00:00 CST 2016

支柱-artisan.xml

<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <constant name="struts.devMode" value="false" />
    <constant name="struts.objectFactory" value="spring" />
    <constant name="struts.action.extension" value="do,action"/>
    <include file="struts-artisan.xml"/>    
</struts>

2 个答案:

答案 0 :(得分:1)

如果你检查堆栈跟踪,你会看到Set<Name> names = new HashSet<>(); names.add(new Name("John","Smith")); names.add(new Name("John","Smith")); System.out.println(names.size()); 拦截器在params拦截器之间被调用两次。

这是因为您使用了结果类型chain

链结果创建一个具有相同操作bean的新值堆栈,并从旧堆栈中填充它。

当调用链式操作时,它在堆栈上有一个chain拦截器。

当调用params拦截器时,它会从操作上下文参数填充操作bean。

因此,您可以计算两个params拦截器调用和一个params拦截器调用。

答案 1 :(得分:1)

  

我很困惑为什么要打三次次,为什么不只是一次

好吧,我不确定你的第二次电话,但我可以解释第一个第三个​​

根据struts-default.xml的配置,defaultStack为:

    <interceptor-stack name="defaultStack">
        <interceptor-ref name="exception"/>
        <interceptor-ref name="alias"/>
        <interceptor-ref name="servletConfig"/>
        <interceptor-ref name="i18n"/>
        <interceptor-ref name="prepare"/>
        <interceptor-ref name="chain"/>
        <interceptor-ref name="scopedModelDriven"/>
        <interceptor-ref name="modelDriven"/>
        <interceptor-ref name="fileUpload"/>
        <interceptor-ref name="checkbox"/>
        <interceptor-ref name="datetime"/>
        <interceptor-ref name="multiselect"/>
        <interceptor-ref name="staticParams"/>
        <interceptor-ref name="actionMappingParams"/>
        <interceptor-ref name="params"/>
        <interceptor-ref name="conversionError"/>
        <interceptor-ref name="validation">
            <param name="excludeMethods">input,back,cancel,browse</param>
        </interceptor-ref>
        <interceptor-ref name="workflow">
            <param name="excludeMethods">input,back,cancel,browse</param>
        </interceptor-ref>
        <interceptor-ref name="debugging"/>
    </interceptor-stack>

由于您将defaultStack包含在堆栈中,因此大多数拦截器都会加倍。这就是你用来拦截你行为的真正原因:

<interceptor-stack name="basicStack">
    <interceptor-ref name="createSession" />

    <!-- DEFAULT STACK EXPLODED -->
        <interceptor-ref name="exception">
            <param name="logEnabled">true</param>  
            <param name="logLevel">error</param>  
        </interceptor-ref>
        <interceptor-ref name="alias"/>
        <interceptor-ref name="servletConfig"/>
        <interceptor-ref name="i18n"/>
        <interceptor-ref name="prepare"/>
        <interceptor-ref name="chain"/>
        <interceptor-ref name="scopedModelDriven"/>
        <interceptor-ref name="modelDriven"/>
        <interceptor-ref name="fileUpload"/>
        <interceptor-ref name="checkbox"/>
        <interceptor-ref name="datetime"/>
        <interceptor-ref name="multiselect"/>
        <interceptor-ref name="staticParams"/>
        <interceptor-ref name="actionMappingParams"/>
        <interceptor-ref name="params"/>
        <interceptor-ref name="conversionError"/>
        <interceptor-ref name="validation">
            <param name="excludeMethods">input,back,cancel,browse</param>
        </interceptor-ref>
        <interceptor-ref name="workflow">
            <param name="excludeMethods">input,back,cancel,browse</param>
        </interceptor-ref>
        <interceptor-ref name="debugging"/>
    <!-- END OF DEFAULT STACK EXPLODED -->

    <interceptor-ref name="alias" />
    <interceptor-ref name="servletConfig" />
    <interceptor-ref name="prepare" />
    <interceptor-ref name="i18n" />
    <interceptor-ref name="chain" />
    <interceptor-ref name="modelDriven" />
    <interceptor-ref name="checkbox" />
    <interceptor-ref name="params" />
    <interceptor-ref name="conversionError" />
    <interceptor-ref name="validation">
            <param name="excludeMethods">input,back,cancel,browse</param>
            <param name="validateAnnotatedMethodOnly">true</param>
    </interceptor-ref>
    <interceptor-ref name="exception">
        <param name="logEnabled">true</param>
        <param name="logLevel">warn</param>
    </interceptor-ref>
</interceptor-stack>

正如你所看到的,你有两次调用参数拦截器,加上副作用可能会产生第二次调用。

只需删除堆栈中的defaultStack声明,然后查看它是否解决了问题。