Red > Green > Refactor > Red

cycle is based on desire

struts.xml default-interceptor-ref 要素とは何か

default-interceptor-stack 要素とは何か

package 内で定義した interceptor-stack の内

package の各アクションにてデフォルトで参照させたい

interceptor を定義する

具体的に

下記 struts.xml より interceptor-stack に ロギングが定義されている

(action はまだ interceptor を参照していない)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>
  <constant name="struts.devMode" value="true" />
  <constant name="struts.ui.theme" value="simple" />
  <package name="top" extends="struts-default">
    <interceptors>
      <interceptor name="myLogging" class="jp.ymatsukawa.interceptors.Logger" />
      <interceptor-stack name="myStackLogging">
        <interceptor-ref name="myLogging" />
      </interceptor-stack>
    </interceptors>
    <action name="index" class="jp.ymatsukawa.top.Index">
      <result name="success">/index.jsp</result>
    </action>
  </package>
</struts>

actionpackage.interceptors.interceptor-stack#name="mystackLogging"

が参照されることになったので default-interceptor-ref を使い、目的を達成する

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>
  <constant name="struts.devMode" value="true" />
  <constant name="struts.ui.theme" value="simple" />
  <package name="top" extends="struts-default">
    <interceptors>
      <interceptor name="myLogging" class="jp.ymatsukawa.interceptors.Logger" />
      <interceptor-stack name="myStackLogging">
        <interceptor-ref name="myLogging" />
      </interceptor-stack>
    </interceptors>
    <default-interceptor-ref name="myStackLogging" />
    <action name="index" class="jp.ymatsukawa.top.Index">
      <result name="success">/index.jsp</result>
    </action>
  </package>
</struts>

interceptors を定義した後に

default-interceptor-ref#name="共通参照したい interceptor-stack" を定義する

action 要素の下には interceptor-ref の記載は入れない

default-interceptor-ref 定義後に
各 action で interceptor-ref を定義した時の挙動

default-interceptor-ref を定義した後、各 action

interceptor-ref を定義するとどうなるか

先に要約すると default-interceptor-ref は実行されず

action で定義された interceptor-ref が実行される

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>
  <constant name="struts.devMode" value="true" />
  <constant name="struts.ui.theme" value="simple" />
  <package name="top" extends="struts-default">
    <interceptors>
      <interceptor name="myLogging" class="jp.ymatsukawa.interceptors.Logger" />
      <interceptor name="myOtherLogging" class="jp.ymatsukawa.interceptors.OtherLogger" />
      <interceptor-stack name="myStackLogging">
        <interceptor-ref name="myLogging" />
      </interceptor-stack>
    </interceptors>
    <default-interceptor-ref name="myStackLogging" />
    <action name="index" class="jp.ymatsukawa.top.Index">
      <interceptor-ref name="myOtherLogging" />
      <result name="success">/index.jsp</result>
    </action>
  </package>
</struts>

default-interceptor-ref(myLogging) > action.interceptor-ref(myOtherLogging) が実行されると思いきや

action.interceptor-ref(myOtherLogging) のみ実行される

[参考元]

https://struts.apache.org/docs/how-do-we-configure-an-interceptor-to-be-used-with-every-action.html