Struts功能详解 ——ActionServlet
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的更多相关文章
- Struts功能详解——ActionMapping对象
Struts功能详解——ActionMapping对象 ActionMapping描述了struts中用户请求路径和Action的映射关系,在struts中每个ActionMapping都是通过pat ...
- Struts功能详解——ActionForm
ActionForm ActionForm用于封装用户的请求参数,而请求参数是通过JSP页面的表单域传递过来的.因此应保证ActionForm的参数,与表单域的名字相同. ActionForm ...
- Struts功能详解——ValidatorForm
ActionForm和ValidatorForm区别: 一个Form继承了ValidatorForm 就不用写具体的验证,但是需要提供:validation-rules.xml 和 val ...
- iOS之UI--使用SWRevealViewController实现侧边菜单功能详解实例
使用SWRevealViewController实现侧边菜单功能详解 下面通过两种方法详解SWRevealViewController实现侧边菜单功能: 1.使用StoryBoard实现 2.纯代 ...
- SVN功能详解
SVN功能详解 TortoiseSVN是windows下其中一个非常优秀的SVN客户端工具.通过使用它,我们可以可视化的管理我们的版本库.不过由于它只是一个客户端,所以它不能对版本库进行权限管理. ...
- 转载]IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本 )
原文地址:IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本作者:佐佐木小次郎 因为最近项目上要用有关LBS的功能.于是我便做一下预研. 一般说来LBS功能一般分为两块:一块是地理 ...
- UIViewController中各方法调用顺序及功能详解
UIViewController中各方法调用顺序及功能详解 UIViewController中loadView, viewDidLoad, viewWillUnload, viewDidUnload, ...
- MySQL的用户密码过期功能详解
MySQL的用户密码过期功能详解 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 先说明两个术语. Payment Ca ...
- 【转】 /etc/fstab功能详解
[转] /etc/fstab功能详解 最近去客户现场时,遇到 了一个关于挂载文件/etc/fstab文件的问题,就写了一下/etc/fstab文件的作用一个文件中各个参数的含义.供大家参考有不正确的地 ...
随机推荐
- 快速排序(java)
快速排序是冒泡排序的优化,是一种非常高效的排序, 甚至是目前为止最高效的排序,其思想是这样的:设数组a中存放了n个数据元素,low为数组的低端下标,high为数组的高端下标,从数组a中任取一个元素(通 ...
- 03_通过OpenHelper获取SqliteDatabase对象
MyOpenHelper openHelper = new MyOpenHelper(this); 类似于java的File file = new File();只是声明这个东西,但是文件还并没有真正 ...
- 流媒体中ffmpeg 命令的使用
在linux系统中,使用到的有关流媒体音视频流进行处理的ffmpeg 命令的常用的命令己命令对应的参数如下:记录一下: 1.分离视频音频流 ffmpeg -i input_file -vcodec c ...
- pure css做的手机页面
<!doctype html> <html> <head> <meta http-equiv="Content-type" content ...
- JS 检查是否在微信浏览器
/** * 检查是否在微信浏览器 * zengkai */ function isWeixinBrowser(){ var ua = navigator.userAgent.toLowerCase() ...
- 剑指Offer的学习笔记(C#篇)-- 二维数组中的查找
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- 洛谷P2169 正则表达式
题目背景 小\(Z\)童鞋一日意外的看到小\(X\)写了一个正则表达式的高级程序,这个正则表达式程序仅仅由字符"\(0\)","\(1\)","\(. ...
- centOS7.5上部署server jre1.8.0_192 tomcat-8.5.35 mysql-8.0.13
- 原型设计模式(prototype
# 什么是原型设计模式 > 这里与软件工程中的原型开发模式有那么一点类似的地方,我们首先需要构建出一个原型,这个原型可以在现实开发中抽象出来的具体类型,但是这个类型与具体的类又不同,需要抽取公共 ...
- vue之webpack打包工具的使用
vue之webpack打包工具的使用 一.什么是webpack? webpack是一个模块打包工具.用vue项目来举例:浏览器它是只认识js,不认识vue的.而我们写的代码后缀大多是.vue的,在每个 ...