2016-03-19 10 views
2

StrutsのWebプロジェクトにページパラメータを取り込むの混乱、クエリ条件は投稿フォームStrutsのアクションメンバ変数

<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が3回見つかるので、3回コールする必要があります。 Eclipseのデバッグパースペクティブの

[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 

フルスタックトレース

最初の呼び出し enter image description here

第2の呼 enter image description here

第コール

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> 

ストラット-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

すべてのケースでスタックトレースを完全に投稿するかどうかを教えてください。 –

+0

こんにちは@RomanCはイメージですか? – zhuguowei

+0

画像は大丈夫ですが、画像の代わりにテキストを投稿する方が良いです。 –

答えて

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> 

そして、あなたはを含めているので、をスタックに追加すると、ほとんどのインターセプタが倍増します。

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

あなたが見ることができるように、あなたはパラメータインターセプタは二回と呼ばれる、プラスの副作用が2回目の呼び出しを生成している可能性があります。これは、あなたが本当にあなたの行動を傍受するために使用しているものです。

スタック内のdefaultStack宣言を削除し、問題が解決されているかどうかを確認します。

+0

ありがとうございます!ええ、そうです。コメント 'defaultStack'インターセプタの後、クリッククエリを呼び出すだけでよい。 – zhuguowei

1

あなたはスタックトレースを調べる場合は、paramsインターセプタがchainインターセプターの間で2回呼び出されていることがわかります。

これは、結果タイプchainを使用したためです。

チェーン結果は、同じアクションBeanで新しい値のスタックを作成し、古いスタックから値を取り込みます。

チェーンアクションが呼び出されると、スタック上にparamsインターセプタがあります。

paramsインターセプターが呼び出されると、アクションコンテキストパラメーターからアクションBeanが取り込まれます。

したがって、paramsインターセプタとchainインターセプタの2つのコールをカウントできます。

+0

ありがとう!しかし、これを明らかにすることは非常に複雑であり、3回呼び出さなければならないのは間違いないでしょうか? – zhuguowei

+1

と私はstrutsがこのように多くの重複が働くかどうか疑問に思う – zhuguowei

+1

これを明確にするには、 'struts.xml'を投稿する必要があります。間違いなく、重複しているわけではありません。リクエスト中に2つの異なるアクションが結ばれているためです。 –

関連する問題