Struts 的入口是 ActionServlet.此类在 Struts 应用程序中负责拦截工作。ActionServlet 的一个实例接受到一个 HttpRequest 对象时,无论这是通过 doGet() 方法还是 doPost() 方法收到的 , 都会调用 process() 方法来处理该请求。 ActionServlet组件:充当Struts框架的中央控制器
ActionServlet的process方法
protected void process(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
//根据request里的信息从servlet Context里找到相应的子模块Module Config,和它下面的Message Resources,并放到request里,使其他组件可以方便的供request里取得应用配置信息和消息资源.
ModuleUtils.getInstance().selectModule(request, getServletContext());
//取出MoudleConfig实例config ModuleConfig config = getModuleConfig(request);
//根据config里这个子模块的信息,从servletcontext里,取出这个子模块的RequestProcessor实例
RequestProcessor processor = getProcessorForModule(config);
//如果processor实例为空,就新建一个.同时放到servletcontext里.
if (processor == null) {
processor = getRequestProcessor(config);
}
//调用RequestProcessor的process方法处理,
processor.process(request, response);
}
struts Action 方法分发dispatch
在struts1中,我们知道在客户端发送“url.do”时由前端控制器ActionServlet分派给RequestProcessor来处理客户请求,最后分发给相应的应用程序控制器Action来处理业务,那么在一个应用程序中,如果有n个业务请求就需要n个action来处理,相应就需要n个action类文件,一个Action中只有一个execute方法,如果我们把某一个功能模块的所有方法放在一个Action类文件中,把不同的业务放在不同的方法中,并且由ActionServlet统一进行分发,岂不妙哉!在struts1中DispatchAction给我们提供了解决方法。比如:
定义
public abstract class DispatchAction extends Action
这是一个抽象的Action,它会根据request 中的parameter来执行相应的方法。通个这个Action类可以将不同的Action集中到一个Action文件中来
Struts-config.xml:
<action path="/saveSubscription"
type="org.apache.struts.actions.DispatchAction"
name="subscriptionForm"
scope="request"
input="/subscription.jsp"
parameter="method"/>
在Action中要有相应的方法:
Public class TestAction extends DispatchAction{
public ActionForward delete(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response) throws Exception
public ActionForward insert(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response) throws Exception
public ActionForward update(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response) throws Exception
}
这样,我们就完成了action中方法的分发。可以大大减少action文件的数量。