2016-03-19 3 views
2

Struts Web-Projekt bevölkern, gibt es eine Abfragebedingung in der Post FormVerwirrt von Struts eine Seite Parameter Aktion Membervariable

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

und es gibt eine Membervariable in Aktion

private Date artsianTime = new Date(); 
public void setArtsianTime(Date artsianTime) { 
    System.out.println(this); 
    System.out.println(artsianTime); 
    this.artsianTime = artsianTime; 
} 

und eingestellt ein Haltepunkt in setArtsianTime, gefunden, wenn Abfrage setArtsianTime dreimal ausführen, so bin ich sehr verwirrt, warum müssen dreimal anrufen, warum nicht nur einmal?

[email protected] 
Sat Mar 19 00:00:00 CST 2016 
[email protected] 
Sat Mar 19 00:00:00 CST 2016 
[email protected] 
Sat Mar 19 00:00:00 CST 2016 

Voll Stack-Trace in Eclipse Debug-Perspektive

ersten Anruf enter image description here

zweiten Anruf enter image description here

dritten Anruf enter image description here


struts.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> 

struts- artisan.xml

<package name="artisan" namespace="/artisan" extends="struts-default"> 
    <interceptors> 
    <interceptor-stack name="basicStack"> 
     <interceptor-ref name="createSession" /> 
     <interceptor-ref name="defaultStack"> 
      <param name="exception.logEnabled">true</param> 
      <param name="exception.logLevel">error</param> 
     </interceptor-ref> 
     <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> 
</interceptors> 
<default-interceptor-ref name="basicStack" /> 
    <default-action-ref name="notFound" /> 
<global-results> 
    <result name="ERROR">/exception.jsp</result> 
    <result name="error">/exception.jsp</result> 
    <result name="INPUT">/input_exception.jsp</result> 
    <result name="input">/input_exception.jsp</result> 
    <result name="INDEX_PAGE">/index.jsp</result> 
    <result name="no_priviledge">/no_priviledge.jsp</result> 
    <result name="no_login">/no_login.jsp</result> 
</global-results> 

<action name="artisanDateQueryAction" class="artisanDateQueryAction"> 
    <result name="query_work_success">/adminsys/artisan/search_artisan_work.jsp</result> 
    <result name="artisan_date_list">/adminsys/artisan/date/artisan_date_list.jsp</result> 
</action> 
</package> 
+0

Kann ich Ihnen sagen, wenn Sie full stacktraces für alle Fälle veröffentlichen. –

+0

Hallo @RomanC ist Bild in Ordnung? – zhuguowei

+0

Bild ist in Ordnung, aber auf SO besser, um Text anstelle von Bild zu posten. –

Antwort

1

Ich bin sehr verwirrt, warum haben drei mal nennen, warum nicht nur einmal?

Nun, ich bin mir nicht sicher über Ihren Sekunden Anruf, aber ich kann die ersten und die dritt diejenigen erklären:

Wie in den struts-default.xml konfiguriert, die defaultStack ist:

<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> 

Und da Sie diedarunter sindin Ihren Stack, haben Sie die meisten der Interzeptoren verdoppelt. Dies ist, was Sie wirklich Ihre Aktionen verwenden abfangen:

<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> 

Wie Sie sehen können, haben Sie die Parameter Interceptor zweimal aufgerufen, und Nebenwirkungen haben könnten den zweiten Anruf erzeugt.

Entfernen Sie einfach die defaultStack Erklärung in Ihrem Stapel, und sehen Sie, ob es das Problem behebt.

+0

vielen dank! ja, du hast recht. Nach dem Kommentar 'defaultStack' Interceptor, nur einmal aufrufen, wenn Sie auf Abfrage klicken. – zhuguowei

1

Wenn Sie stacktraces untersuchen, werden Sie sehen, dass params Abfangjäger zweimal zwischen einem chain Interceptor aufgerufen wird.

Dies liegt daran, dass Sie den Ergebnistyp chain verwendet haben.

Das Kettenergebnis erstellt einen neuen Wertestapel mit derselben Aktions-Bean und füllt es aus dem alten Stapel.

Wenn die verkettete Aktion aufgerufen wird, hat sie einen params Interceptor auf dem Stapel.

Wenn der Interceptor params aufgerufen wird, füllt er die Action-Bean aus Aktionskontextparametern.

So können Sie zwei Anrufe für params Interceptor und einen für chain Interceptor zählen.

+0

Danke! aber zweifellos ist es sehr kompliziert, dies zu verkünden, und muss es dreimal anrufen? – zhuguowei

+1

und ich bezweifle struts tut zu viele Duplizierung funktioniert wie folgt – zhuguowei

+1

Wenn Sie was zu klären, müssen Sie die 'struts.xml 'veröffentlichen. Kein Zweifel, es handelt sich nicht um ein Duplikat, da Sie während der Anfrage zwei verschiedene Aktionen miteinander verkettet haben. –

Verwandte Themen