子类struts Action类

时间:2016-04-13 14:56:48

标签: java inheritance model-view-controller struts

如果Action类是子类,并且子类不包含'执行'方法,将struts自动查找超类以执行'执行'方法?如果action子类的父类是Action本身的子类,并且不包含' execute'方法,struts会继续查找层次结构,直到找到包含' execute'的超类。方法? Struts总是寻找并运行“执行”。方法第一?下面是一些有希望澄清我的问题的代码。

超类

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);
    }
}

子类

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>

1 个答案:

答案 0 :(得分:1)

重写了break方法。

当Struts执行某个操作时,它已经拥有execute()的实例。它正在使用该实例调用Action方法。这是一种execute()方法。

在Java中,所有公共方法都是继承的。如果您的操作没有覆盖public方法,那么它会使用继承的方法。否则,如果您有重写方法并想要调用其超类的方法,则可以使用execute()

即使Struts使用super类型来调用Action方法,也会因为多态而使用动作类的虚方法。

当然,它将按从子类到超类的顺序在对象类型的层次结构中搜索虚方法。它是Java的特性,而Struts只是调用execute()对象的方法。