stuts1:(Struts)Action类及其相关类

时间:2023-03-09 16:36:38
stuts1:(Struts)Action类及其相关类

org.apache.struts.action.Action类是Struts的心脏,也是客户请求和业务操作间的桥梁。每个Action类通常设计为代替客户完成某种操作。
一旦正确的Action实例确定,就会调用RequestProcessor类的execute()方法。该方法的结构如下:

stuts1:(Struts)Action类及其相关类//摘自org.apache.struts.action.Action类
stuts1:(Struts)Action类及其相关类     public ActionForward execute(ActionMapping mapping, ActionForm form,ServletRequest request,ServletResponse response) throws Exception 
stuts1:(Struts)Action类及其相关类     {
stuts1:(Struts)Action类及其相关类        try
stuts1:(Struts)Action类及其相关类        {
stuts1:(Struts)Action类及其相关类            return execute(mapping, form,(HttpServletRequest) (Object) request,(HttpServletResponse) (Object) response);
stuts1:(Struts)Action类及其相关类        } catch (ClassCastException e) {
stuts1:(Struts)Action类及其相关类            return null;
stuts1:(Struts)Action类及其相关类        }
stuts1:(Struts)Action类及其相关类    }
stuts1:(Struts)Action类及其相关类
stuts1:(Struts)Action类及其相关类    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,HttpServletResponse response) throws Exception 
stuts1:(Struts)Action类及其相关类    {
stuts1:(Struts)Action类及其相关类        return null;
stuts1:(Struts)Action类及其相关类    }
stuts1:(Struts)Action类及其相关类

在Struts应用程序中,具体的Action子类需要扩展Action类,以提供execute()方法的实现。execute()方法有四个参数:ActionMapping对象,ActionForm对象,HttpServletRequest对象和HttpServletResponse对象。ActionForm对象封装了表单数据,因此Action类可以通过getter方法从该对象中获得表单数据,然后调用模型组件处理这些数据。Action类又通过ActionMapping对象的findForward()方法获得一个ActionForward对象,然后把处理结果转发到ActionForward对象所指的目标。
 Action示例:

stuts1:(Struts)Action类及其相关类package struts.action;
stuts1:(Struts)Action类及其相关类
stuts1:(Struts)Action类及其相关类import java.util.ArrayList;
stuts1:(Struts)Action类及其相关类
stuts1:(Struts)Action类及其相关类import javax.servlet.http.HttpServletRequest;
stuts1:(Struts)Action类及其相关类import javax.servlet.http.HttpServletResponse;
stuts1:(Struts)Action类及其相关类import javax.servlet.http.HttpSession;
stuts1:(Struts)Action类及其相关类
stuts1:(Struts)Action类及其相关类import model.LoginHandler;
stuts1:(Struts)Action类及其相关类
stuts1:(Struts)Action类及其相关类import org.apache.struts.action.Action;
stuts1:(Struts)Action类及其相关类import org.apache.struts.action.ActionForm;
stuts1:(Struts)Action类及其相关类import org.apache.struts.action.ActionForward;
stuts1:(Struts)Action类及其相关类import org.apache.struts.action.ActionMapping;
stuts1:(Struts)Action类及其相关类import org.apache.struts.action.DynaActionForm;
stuts1:(Struts)Action类及其相关类
stuts1:(Struts)Action类及其相关类import struts.form.LoginHandlerForm;
stuts1:(Struts)Action类及其相关类
stuts1:(Struts)Action类及其相关类public class LoginHandlerAction extends Action {
stuts1:(Struts)Action类及其相关类
stuts1:(Struts)Action类及其相关类    public ActionForward execute(ActionMapping mapping, ActionForm form,
stuts1:(Struts)Action类及其相关类            HttpServletRequest request, HttpServletResponse response) {
stuts1:(Struts)Action类及其相关类                
stuts1:(Struts)Action类及其相关类        LoginHandlerForm loginHandlerForm = (LoginHandlerForm) form;        
stuts1:(Struts)Action类及其相关类        //从Form中取得表单数据
stuts1:(Struts)Action类及其相关类        String userName = loginHandlerForm.getUserName();
stuts1:(Struts)Action类及其相关类        String userPwd = loginHandlerForm.getUserPwd();
stuts1:(Struts)Action类及其相关类        
stuts1:(Struts)Action类及其相关类        //生成一个Session对象
stuts1:(Struts)Action类及其相关类        HttpSession session = request.getSession(true);
stuts1:(Struts)Action类及其相关类        session.removeAttribute("userName");
stuts1:(Struts)Action类及其相关类        session.setAttribute("userName", userName);
stuts1:(Struts)Action类及其相关类        
stuts1:(Struts)Action类及其相关类        //生成一个ArrayList 
stuts1:(Struts)Action类及其相关类        ArrayList arr = new ArrayList();
stuts1:(Struts)Action类及其相关类        arr.add(userName);
stuts1:(Struts)Action类及其相关类        arr.add(userPwd);
stuts1:(Struts)Action类及其相关类        
stuts1:(Struts)Action类及其相关类        String forward;
stuts1:(Struts)Action类及其相关类        
stuts1:(Struts)Action类及其相关类        //调用模型组件
stuts1:(Struts)Action类及其相关类        LoginHandler login = new LoginHandler();
stuts1:(Struts)Action类及其相关类        boolean flag = login.checkLogin(arr);
stuts1:(Struts)Action类及其相关类        if(flag)
stuts1:(Struts)Action类及其相关类            forward = "success";
stuts1:(Struts)Action类及其相关类        else
stuts1:(Struts)Action类及其相关类            forward = "fail";
stuts1:(Struts)Action类及其相关类        
stuts1:(Struts)Action类及其相关类        //转向
stuts1:(Struts)Action类及其相关类        return mapping.findForward(forward);
stuts1:(Struts)Action类及其相关类        
stuts1:(Struts)Action类及其相关类    }
stuts1:(Struts)Action类及其相关类}

ActionMapping存储了与特定用户请求对应的特定Action的相关信息,例如输入页面,转发页面等。ActionServlet将ActionMapping传送到Action类的execute()方法,然后Action将调用ActionMapping的findForward()方法,此方法返回一个指定名称的ActionForward,这样Action就完成了本地转发。若没有找到具体的ActionForward,就返回一个null。ActionMapping类的源代码如下:

stuts1:(Struts)Action类及其相关类package org.apache.struts.action;
stuts1:(Struts)Action类及其相关类import java.util.ArrayList;
stuts1:(Struts)Action类及其相关类
stuts1:(Struts)Action类及其相关类import org.apache.struts.config.ActionConfig;
stuts1:(Struts)Action类及其相关类import org.apache.struts.config.ForwardConfig;
stuts1:(Struts)Action类及其相关类
stuts1:(Struts)Action类及其相关类public class ActionMapping extends ActionConfig
stuts1:(Struts)Action类及其相关类{
stuts1:(Struts)Action类及其相关类    public ActionForward findForward(String name)
stuts1:(Struts)Action类及其相关类    {
stuts1:(Struts)Action类及其相关类        ForwardConfig config = this.findForwardConfig(name);
stuts1:(Struts)Action类及其相关类        if (config == null)
stuts1:(Struts)Action类及其相关类            config = this.getModuleConfig().findForwardConfig(name);
stuts1:(Struts)Action类及其相关类        return (ActionForward) config;
stuts1:(Struts)Action类及其相关类    }
stuts1:(Struts)Action类及其相关类    
stuts1:(Struts)Action类及其相关类    public String[] findForwards() 
stuts1:(Struts)Action类及其相关类    {
stuts1:(Struts)Action类及其相关类        ArrayList results = new ArrayList();
stuts1:(Struts)Action类及其相关类        ForwardConfig[] fcs = this.findForwardConfigs();
stuts1:(Struts)Action类及其相关类        for (int i = 0; i < fcs.length; i++)
stuts1:(Struts)Action类及其相关类            results.add(fcs[i].getName());
stuts1:(Struts)Action类及其相关类        return (String[]) results.toArray(new String[results.size()]);
stuts1:(Struts)Action类及其相关类    }
stuts1:(Struts)Action类及其相关类    
stuts1:(Struts)Action类及其相关类    public ActionForward getInputForward() 
stuts1:(Struts)Action类及其相关类    {
stuts1:(Struts)Action类及其相关类        if (this.getModuleConfig().getControllerConfig().getInputForward())
stuts1:(Struts)Action类及其相关类            return findForward(this.getInput());
stuts1:(Struts)Action类及其相关类        return new ActionForward(this.getInput());
stuts1:(Struts)Action类及其相关类    }
stuts1:(Struts)Action类及其相关类}

ActionForward类
从以上的Action类的讨论中可知,execute()方法返回一个ActionForward对象。ActionForward对象代表一个Web资源的逻辑抽象表示形式。这里的Web资源通常就是JSP页面或Java   Servlet。
ActionForward是该资源包的包装类,所以应用程序和实际资源之间并无多少瓜葛。实际的Web资源只在配置文件struts-config.xml中指定,并非在程度代码中写入。RequestDispatcher会根据redirect属性的值,来决定ActionForward实例要进行转发还是重定向。
要从一个Action实例返回一个ActionForward实例,可以在Action类内动态地创建一个ActionForward实例,或者更常见的做法是使用ActionMapping的findForward()方法找出配置文件中预先配置的一个ActionForward实例,如下所示:
return mapping.findForward("Success");
其中,mapping是一个ActionMapping实例。该程序片断能够返回一个参数"Success"对应的ActionForward实例。以下代码是在配置文件struts-config.xml中定义的forward元素:

stuts1:(Struts)Action类及其相关类 <action
stuts1:(Struts)Action类及其相关类      attribute="studentForm"
stuts1:(Struts)Action类及其相关类      input="/register.jsp"
stuts1:(Struts)Action类及其相关类      name="studentForm"
stuts1:(Struts)Action类及其相关类      path="/student"
stuts1:(Struts)Action类及其相关类      scope="request"
stuts1:(Struts)Action类及其相关类      validate="true"
stuts1:(Struts)Action类及其相关类      type="struts.action.StudentAction" >
stuts1:(Struts)Action类及其相关类      <forward name="Success" path="/registerOK.jsp" />
stuts1:(Struts)Action类及其相关类      </action>

ActionMapping类的findForward()方法首先会调用findForwardConfig()方法,以查看在<action>元素中是否包含<forward>子元素。如果有,就会检查<global-forwards>元素片断。一旦找到匹配的ActionForward实例,就会从execute()方法将其返回给RequestProcessor。下面是ActionMapping类的findForward()方法:

stuts1:(Struts)Action类及其相关类public ActionForward findForward(String name)
stuts1:(Struts)Action类及其相关类        {
stuts1:(Struts)Action类及其相关类            ForwardConfig config = this.findForwardConfig(name);
stuts1:(Struts)Action类及其相关类            if (config == null)
stuts1:(Struts)Action类及其相关类                config = this.getModuleConfig().findForwardConfig(name);
stuts1:(Struts)Action类及其相关类            return (ActionForward) config;
stuts1:(Struts)Action类及其相关类        }