Action是struts中的一个抽象类,它其实是Struts的心脏部分,前面提到的ActionServlet和ActionForm进过处理获取的请求和数据,都会到达Action中得到分发。
<actionpath="/aFullAction" type="somePackage.someActionClass"> name="someForm" input="someJSP.jsp" <forwardname="successful" path="someJSP.jsp"/> <forwardname="failed" path="someOtherJSP.jsp"/> </action>
Action执行流程
首先,Struts的ActionServlet接收到一个请求,然后根据struts-config.xml的配置定位到相应的mapping(映射);接下来如果form的范围是request或者在定义的范围中找不到这个form,创建一个新的form实例;取得form实例以后,调用其 reset()方法,然后将表单中的参数放入form,如果validate属性不为false,调用validate()方法;如果validate()返回非空的ActionErrors,将会被转到input属性指定的URI,如果返回空的ActionErrors,那么执行Action的 execute()方法,根据返回的ActionForward确定目标URI。
这样做的效果是:execute()仅当validate()成功以后才执行;input属性指定的是一个URI。
由于当业务太多的时候,每个业务都要创造一个Action,这样会大大增加Action的数量,而且也会造成浪费。
它的主要好处就是把所有的Action放到一个类里面,通过传过来的参数决定调用那个Action操作。
DispatchAction类是一个抽象类,它实现了父类(Action)的execute()方法,所以它的子类就不用来实现这个方法了,只需要专注与实际操作的方法。
public class AccountAction extends DispatchAction { public ActionForward login(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { // 進行一些Login的逻辑 return mapping.findForward("success"); } public ActionForward logout(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { // 進行一些Logout的逻辑 return mapping.findForward("success1"); } public ActionForward method1(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { // 進行一些method1的逻辑 return mapping.findForward("success"); } }
一定要注意在DispatchAction中你想执行的操作,都必须要有统一的参数(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse),是一个规定.
<action path="/login" type="examples.AccountAction" name="logonForm" scope="request" parameter="action" input="/pages/dispatch1.jsp"> <forward name="success" path="/pages/success.jsp" /> </action> <action path="/logout" type="examples.AccountAction" name="logonForm" scope="request" parameter="action" input="/pages/dispatch1.jsp"> <forward name="success1" path="/pages/success1.jsp" /> </action>
这里需要注意的就是parameter属性的值,因为这个值要和页面传来的参数对应.
<%@ taglib uri="/tags/struts-html" prefix="html" %> <html:link href="/DispathActionTest/login.do?action=login">login</html:link><br> <html:link href="/DispathActionTest/logout.do?action=logout">logout</html:link>
这里要注意几点,首先?后面的KEY要和struts-config.xml中的parameter相同,还有它的VALUE要是你在action的一个方法名字,这里方法名为login,那么在程序运行时就是调用login的操作,如果是logout,那程序就调用logout的操作.