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调试透视图中的完整堆栈跟踪
第二次电话 第三个电话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>
答案 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
声明,然后查看它是否解决了问题。