子classing struts 动作class
Sub-classing struts Action class
如果操作 class 被子 class 编辑并且子 class 不包含 'execute' 方法,将 struts 自动查找'execute' 方法的 super-class?如果动作子class的父class是Action本身的子class并且不包含'execute'方法,struts会继续查找层次结构,直到找到包含 'execute' 方法的超级 class? struts 是否总是首先寻找 运行 'execute' 方法?下面是一些代码,希望能澄清我的问题。
超级class:
public class BaseXHRAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
String page = mapping.getParameter();
String actionName = mapping.getPath();
return mapping.findForward(page);
}
}
子class:
public class OdonohueTestInitXHRAction extends BaseXHRAction {
//this class does not contain an 'execute' method
//it contains some other method(s) below
public ScreenConfigurationRes getResponse(ActionForm form, HttpServletRequest request, Context ctx) throws Exception {
//return ScreenConfigurationRes
}
}
struts-config.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<form-beans>
<form-bean name="screenConfigurationForm" type="com.saic.ct.sys.presentation.forms.screenconfiguration.ScreenConfigurationForm"/>
<form-beans>
<!-- Global Forwards -->
<global-exceptions>
<exception type="java.lang.Exception" key="Test" path="/errorAction.do"/>
</global-exceptions>
<global-forwards>
<forward name="home" path="/home.do"/>
<forward name="error" path="/errorAction.do"/>
<forward name="logoutError" path="/loginInit.do"/>
</global-forwards>
<!-- Action Mappings -->
<action-mappings>
<action
path="/OdonohueTestInitXHR"
name="screenConfigurationForm"
type="com.saic.ct.sys.presentation.actions.schedule.OdonohueTestInitXHRAction"
parameter="home"/>
</action-mappings>
<controller locale="true"/>
<plug-in className="com.oroad.stxx.plugin.StxxPlugin">
<set-property property="pipeline-config" value="/WEB-INF/stxx-pipelines.xml"/>
</plug-in>
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>
</struts-config>
execute()
方法被覆盖。
当 Struts 执行一个动作时,它已经有一个 Action
的实例。它正在使用该实例来调用 execute()
方法。这是一个 public
方法。
在Java中所有public方法都被继承。如果您的操作没有覆盖 execute()
方法,那么它将使用继承的方法。否则如果你有重写的方法并且想调用它的 superclass 的方法你可以使用 super
。
即使 Struts 使用 Action
类型来调用 execute()
方法,由于多态性,也会使用操作 class 的虚方法。
当然它会在对象类型的层次结构中按照从subclass到superclass的顺序搜索虚方法。这是Java性质,而Struts只是调用了Action
对象的一个方法。
如果操作 class 被子 class 编辑并且子 class 不包含 'execute' 方法,将 struts 自动查找'execute' 方法的 super-class?如果动作子class的父class是Action本身的子class并且不包含'execute'方法,struts会继续查找层次结构,直到找到包含 'execute' 方法的超级 class? struts 是否总是首先寻找 运行 'execute' 方法?下面是一些代码,希望能澄清我的问题。
超级class:
public class BaseXHRAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
String page = mapping.getParameter();
String actionName = mapping.getPath();
return mapping.findForward(page);
}
}
子class:
public class OdonohueTestInitXHRAction extends BaseXHRAction {
//this class does not contain an 'execute' method
//it contains some other method(s) below
public ScreenConfigurationRes getResponse(ActionForm form, HttpServletRequest request, Context ctx) throws Exception {
//return ScreenConfigurationRes
}
}
struts-config.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<form-beans>
<form-bean name="screenConfigurationForm" type="com.saic.ct.sys.presentation.forms.screenconfiguration.ScreenConfigurationForm"/>
<form-beans>
<!-- Global Forwards -->
<global-exceptions>
<exception type="java.lang.Exception" key="Test" path="/errorAction.do"/>
</global-exceptions>
<global-forwards>
<forward name="home" path="/home.do"/>
<forward name="error" path="/errorAction.do"/>
<forward name="logoutError" path="/loginInit.do"/>
</global-forwards>
<!-- Action Mappings -->
<action-mappings>
<action
path="/OdonohueTestInitXHR"
name="screenConfigurationForm"
type="com.saic.ct.sys.presentation.actions.schedule.OdonohueTestInitXHRAction"
parameter="home"/>
</action-mappings>
<controller locale="true"/>
<plug-in className="com.oroad.stxx.plugin.StxxPlugin">
<set-property property="pipeline-config" value="/WEB-INF/stxx-pipelines.xml"/>
</plug-in>
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>
</struts-config>
execute()
方法被覆盖。
当 Struts 执行一个动作时,它已经有一个 Action
的实例。它正在使用该实例来调用 execute()
方法。这是一个 public
方法。
在Java中所有public方法都被继承。如果您的操作没有覆盖 execute()
方法,那么它将使用继承的方法。否则如果你有重写的方法并且想调用它的 superclass 的方法你可以使用 super
。
即使 Struts 使用 Action
类型来调用 execute()
方法,由于多态性,也会使用操作 class 的虚方法。
当然它会在对象类型的层次结构中按照从subclass到superclass的顺序搜索虚方法。这是Java性质,而Struts只是调用了Action
对象的一个方法。