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()方法具体处理请求的,如下列代码:

public void doGet(HttpServletRequest request,HttpServletResponse response)
throws IOException, ServletException { process(request, response); }
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws IOException, ServletException { process(request, response); }
protected void process(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
 //根据请求选择适当的应用模块
ModuleUtils.getInstance().selectModule(request, getServletContext());
ModuleConfig config = getModuleConfig(request);
//获取模块相关的RequestProcesser实例
RequestProcessor processor = getProcessorForModule(config);
if (processor == null) {
processor = getRequestProcessor(config);
}
  //调用processor实例的process()方法处理请求
processor.process(request, response); }

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

//摘自RequestProcessor
public void process(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException
{
//用一个特殊的包装对象把Muiltipart请求包装起来
request = processMultipart(request);
//验证我们用来选择映射的路径组件
String path = processPath(request, response); if (path != null)
{
if (log.isDebugEnabled())
log.debug("Processing a '" + request.getMethod() + "' for path '" + path + "'");
//有请求时, 为当前用户选择一个Locale对象
processLocale(request, response);
//有请求时,设置内容类型和no-caching字头
processContent(request, response);
processNoCache(request, response);
if (processPreprocess(request, response))
{
processCachedMessages(request, response);
//验证这个请求的映射
ActionMapping mapping = processMapping(request, response, path);
if (mapping != null && processRoles(request, response, mapping))
{
//处理和这个请求相关的任何ActionForm bean
ActionForm form = processActionForm(request, response, mapping);
processPopulate(request, response, form, mapping);
if (processValidate(request, response, form, mapping)&& processForward(request, response, mapping)&& processInclude(request, response, mapping))
{
//创建或获取Action实例来处理这项请求
Action action = processActionCreate(request, response, mapping);
if (action != null)
{
//调用Action实例本身
ActionForward forward = processActionPerform(request, response,action, form, mapping);
//处理所返回的ActionForward实例
processForwardConfig(request, response, forward);
}
}
}
}
}
}

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。

Struts功能详解 ——ActionServlet的更多相关文章

  1. Struts功能详解——ActionMapping对象

    Struts功能详解——ActionMapping对象 ActionMapping描述了struts中用户请求路径和Action的映射关系,在struts中每个ActionMapping都是通过pat ...

  2. Struts功能详解——ActionForm

    ActionForm ActionForm用于封装用户的请求参数,而请求参数是通过JSP页面的表单域传递过来的.因此应保证ActionForm的参数,与表单域的名字相同.     ActionForm ...

  3. Struts功能详解——ValidatorForm

    ActionForm和ValidatorForm区别:       一个Form继承了ValidatorForm 就不用写具体的验证,但是需要提供:validation-rules.xml 和 val ...

  4. iOS之UI--使用SWRevealViewController实现侧边菜单功能详解实例

    使用SWRevealViewController实现侧边菜单功能详解 下面通过两种方法详解SWRevealViewController实现侧边菜单功能: 1.使用StoryBoard实现   2.纯代 ...

  5. SVN功能详解

    SVN功能详解   TortoiseSVN是windows下其中一个非常优秀的SVN客户端工具.通过使用它,我们可以可视化的管理我们的版本库.不过由于它只是一个客户端,所以它不能对版本库进行权限管理. ...

  6. 转载]IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本 )

    原文地址:IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本作者:佐佐木小次郎 因为最近项目上要用有关LBS的功能.于是我便做一下预研. 一般说来LBS功能一般分为两块:一块是地理 ...

  7. UIViewController中各方法调用顺序及功能详解

    UIViewController中各方法调用顺序及功能详解 UIViewController中loadView, viewDidLoad, viewWillUnload, viewDidUnload, ...

  8. MySQL的用户密码过期功能详解

    MySQL的用户密码过期功能详解 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 先说明两个术语. Payment Ca ...

  9. 【转】 /etc/fstab功能详解

    [转] /etc/fstab功能详解 最近去客户现场时,遇到 了一个关于挂载文件/etc/fstab文件的问题,就写了一下/etc/fstab文件的作用一个文件中各个参数的含义.供大家参考有不正确的地 ...

随机推荐

  1. Collection与Map总结

    顺序表和链表统称为线性表:顺序表一般表现为数组,如:ArrayList的实现;链表有单链表.双链表.循环链表的区分,如:LinkedArrayList由双链表+哈希表实现

  2. MVVM里绑定TreeView控件的SelectedItem

    <TreeView x:Name="treeView"> <i:Interaction.Triggers> <i:EventTrigger Event ...

  3. CSS实现三角形图标原理解析

    CSS实现三角形图标原理解析: border边框语法: border 四条边框设置border-left 设置左边框,一般单独设置左边框样式使用border-right 设置右边框,一般单独设置右边框 ...

  4. Gym - 101142J Java2016 (构造)

    题意:给定一个数字,让你构造成一些表达式,最后结果是该数字的概率要大于50%. 析:我们可以把一个数分解是2的多少次幂,然后加起来就好. 代码如下: #pragma comment(linker, & ...

  5. WSAData是个什么结构体用什么用

    WSAData机构体如下 功能是:存放windows socket初始化信息.struct WSAData { WORD wVersion; WORD wHighVersion; char szDes ...

  6. 2014年第五届蓝桥杯国赛试题(JavaA组)

    1.结果填空 (满分15分)2.结果填空 (满分45分)3.代码填空 (满分30分)4.程序设计(满分30分)5.程序设计(满分80分)6.程序设计(满分100分) 1.标题:海盗分金币 有5个海盗, ...

  7. Working Experience - NLog 多实例时配置文件冲突

    正文 问题: 当前项目已使用 NLog 的情况下再引用使用 NLog 的项目, 出现配置文件冲突, 有一个配置文件不工作 方法: 使用 LogFactory 代替 LogManager 来获取 Log ...

  8. 图论1 Tarjan算法

    强连通分量 模板(强联通分量个数+缩点) #include<iostream> #include<cstdio> #define MAXn 100000 #define MAX ...

  9. 剑指Offer的学习笔记(C#篇)-- 数字在排序数组中出现的次数

    题目描述 统计一个数字在排序数组中出现的次数. 一 . 题目分析 该题目并不是难题,但该题目考察目的是正确的选择合适的查找方法.题目中有一个关键词是:排序数组,也就是说,该数组已经排好了,我一开始直接 ...

  10. Luogu P2257 YY的GCD 莫比乌斯反演

    第一道莫比乌斯反演...$qwq$ 设$f(d)=\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)==d]$ $F(n)=\sum_{n|d}f(d)=\lfloor \frac{N ...