ActionServlet类是Struts框架的内置核心控制器组件,它继承了javax.servlet.http.HttpServlet类。Struts的启动通常从

加载ActionServlet开始。Web容器会在首次启动或Struts应用的第一个请求到达时加载ActionServlet。一般情况下都

配置web容器比如tomcat启动的时候加载ActionServlet类,使用<load-on-startup>1</load-on-startup>标签配置启动

加载。

ActionServlet有如下这几个功能

 

1:读取配置文件Struts-config.xml

 

ActionServlet加载的时候读取Struts-config.xml文件,将文件对应的配置信息读取到内存中,ActionServlet 根据不同的模块来初始化 ModuleConfig 类,并在其中以XXXconfig 集合的方式保存该模块的各种配置信息,比如 ActionConfig,FormBeanConfig 等。

 

 比如配置文件中的 Action映射定义都保存在 ActionConfig 集合中。相应地有 ControlConfig 集合、FormBeanConfig 集合、ForwardConfig集合和 MessageResourcesConfig 集合等。

这里的模块是为了用于不同用户在同时使用struts-config.xml文件时冲突,每个用户可以定义自己的配置文件,由容器自动去整合配置,每个配置文件相当于一个模块。

 

2:截取客户端http请求,分发到相应的Action

 

初始化工作完成之后,ActionServlet准备接收客户请求。针对每个请求,方法 process(HttpServletRequest request, HttpServletResponseresponse) 将被调用。该方法指定具体的模块,然后调用该模块的 RequestProcessor 的 process 方法。

其实根据Servlet的原理,应该调用ActionServlet的doPost()或doGet()方法来处理用户请求,而它们实际上都是调用process()方法具体处理请求的,如下列代码:

 

 
  1. public void doGet(HttpServletRequest request,HttpServletResponse response)  
  2.         throws IOException, ServletException {  
  3.   
  4.         process(request, response);  
  5.   
  6.     }  

 

 
  1. public void doPost(HttpServletRequest request,HttpServletResponse response)  
  2.         throws IOException, ServletException {  
  3.   
  4.         process(request, response);  
  5.   
  6.     }  

 

 
  1. protected void process(HttpServletRequest request, HttpServletResponse response)  
  2.         throws IOException, ServletException {  
  3.          //根据请求选择适当的应用模块  
  4.         ModuleUtils.getInstance().selectModule(request, getServletContext());  
  5.         ModuleConfig config = getModuleConfig(request);  
  6.         //获取模块相关的RequestProcesser实例  
  7.         RequestProcessor processor = getProcessorForModule(config);  
  8.         if (processor == null) {  
  9.            processor = getRequestProcessor(config);  
  10.         }  
  11.                     //调用processor实例的process()方法处理请求  
  12.         processor.process(request, response);  
  13.   
  14.     }  

 

 

在上面我们看到ActionServletprocess()方法中实际处理用户请求的是RequestProcessor类的process()方法。Struts框架只允许应用程序中存在一个ActionServlet,但每个应用程序模块都有各自的RequestProcessor类实例。在ActionServletprocess()方法中,一旦选择了正确的应用程序模块,就会调用相应模块RequestProcessor实例的process()方法来处理请求。RequestProcessor类的process方法如下:

 
  1. //摘自RequestProcessor  
  2.       public void process(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException  
  3.        {  
  4.           //用一个特殊的包装对象把Muiltipart请求包装起来  
  5.           request = processMultipart(request);  
  6.           //验证我们用来选择映射的路径组件  
  7.           String path = processPath(request, response);  
  8.             
  9.           if (path != null)   
  10.            {  
  11.              if (log.isDebugEnabled())  
  12.              log.debug("Processing a '" + request.getMethod() + "' for path '" + path + "'");  
  13.             //有请求时, 为当前用户选择一个Locale对象  
  14.              processLocale(request, response);  
  15.              //有请求时,设置内容类型和no-caching字头  
  16.              processContent(request, response);  
  17.              processNoCache(request, response);  
  18.              if (processPreprocess(request, response))  
  19.               {  
  20.                  processCachedMessages(request, response);  
  21.                  //验证这个请求的映射  
  22.                  ActionMapping mapping = processMapping(request, response, path);  
  23.                  if (mapping != null && processRoles(request, response, mapping))   
  24.                   {  
  25.                      //处理和这个请求相关的任何ActionForm bean  
  26.                      ActionForm form = processActionForm(request, response, mapping);  
  27.                      processPopulate(request, response, form, mapping);  
  28.                      if (processValidate(request, response, form, mapping)&& processForward(request, response, mapping)&& processInclude(request, response, mapping))   
  29.                       {  
  30.                          //创建或获取Action实例来处理这项请求  
  31.                          Action action = processActionCreate(request, response, mapping);  
  32.                          if (action != null)  
  33.                           {  
  34.                              //调用Action实例本身  
  35.                              ActionForward forward = processActionPerform(request, response,action, form, mapping);  
  36.                              //处理所返回的ActionForward实例  
  37.                              processForwardConfig(request, response, forward);  
  38.                          }  
  39.                      }  
  40.                  }  
  41.              }  
  42.           }  
  43.       }  

 

ActionServlet ActionConfig 中找出对应于该请求的 Action 子类,如果没有对应的 Action,控制器直接将请求转发给 JSP或者静态页面。否则控制器将请求分发至具体 Action 类进行处理。

 

3:从请求中获取数据填充 FormBean(如果需要)

 

在控制器调用具体 Action 的 execute方法之前,ActionForm 对象将利用 HTTP 请求中的参数来填充自己(可选步骤,需要在配置文件中指定)。具体的 ActionForm 对象应该是ActionForm 的子类对象,它其实就是一个 JavaBean。

 

 

需要特别说明的是,Struts的配置文件struts-config.xml作为ActionServlet的一个初始化参数值在web.xml文件中声明。另外,ActionServlet的URL形式是*.do,这样当在浏览器地址输入任何后缀为*.do的URL时,系统都会映射到ActionServlet。

posted on 2014-09-27 21:29  小光zfg  阅读(93)  评论(0)    收藏  举报