struts1:Struts的中央控制器
在Struts框架中,有多个组件分担控制器的工作,它们分别是ActionServlet类,RequestProcessor类和Action类等,其中ActionServlet是Struts框架中的核心控制器。
Struts应用程序处理用户请求的一般过程
ActionServlet类作为中心Servlet,负责处理所有到来的用户请求。当ActionServlet接收到一个用户请求时,将执行如下流程:
1.检索和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效的错误信息。
2.如果为ActionMapping配置了Form Bean,则获取相应范围内的ActionForm实例。如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。
3.根据ActionMapping配置信息决定是否需要验证表单。如果需要验证,就调用ActionForm的validate()方法。
4.如果ActionForm的validate()方法返回null,或者返回一个不包含任何ActionMessage的ActionErrors对象,就表明表单验证成功,继续执行下一步。否则返回input属性指定的页面,并向用户显示ActionErrors集合中的错误信息。
5.ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action,如果相应的Action实例不存在,则先创建这个实例,然后调用Action的execute方法。
6.Action的execute方法返回 一个ActionForward对象,ActionServlet将请求转发到这个ActionForward对象指定的组件,通常是一个JSP组件或其他Action。
7.如果ActionForward对象指向一个JSP组件,则将该JSP生成的动态页面返回给用户;如果ActionForward对象指向的仍然是一个Action,则从第1步重新开始执行!
从上述过程可知ActionServlet类是Struts框架的内置核心控制器组件,它继承了javax.servlet.http.HttpServlet类。Struts的启动通常从加载ActionServlet开始。Web容器会在首次启动或Struts应用的第一个请求到达时加载ActionServlet。
ActionServlet第一次被加载后,其init()方法被调用。在init()方法中,Struts框架执行所有必要的初始化工作。
然后,Web容器将调用ActionServlet的doPost()或doGet()方法来处理用户请求,而它们实际上都是调用process()方法具体处理请求的,如下列代码:
ActionServlet处理用户请求:
//摘自org.apache.struts.action.ActionServlet.
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,this.getServletContext());
ModuleConfig config = getModuleConfig(request);
//获取模块相关的RequestProcessor实例
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在web.xml中的配置:
像所有Servlet一样,ActionServlet也需要在web.xml中进行配置。其具体配置方法如下:
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>需要特别说明的是,Struts的配置文件struts-config.xml作为ActionServlet的一个初始化参数值在web.xml文件中声明。另外,ActionServlet的URL形式是*.do,这样当在浏览器地址输入任何后缀为*.do的URL时,系统都会映射到ActionServlet。
struts1:Struts的中央控制器的更多相关文章
- struts1:(Struts)ActionForm类及表单数据验证
在Struts的中央控制器中写了Struts的控制器角色,在这篇介绍下Struts的视图!Struts的视图组件:Struts框架中的视图组件主要包括:JSP页面.ActionForm类.Struts ...
- 二、kafka 中央控制器、主题、分区、副本
集群和中央控制器 一个独立的Kafka服务器被称为broker.broker用来接收来自生产者的消息,为消息设置偏移量,并把消息保存到磁盘.换句话说,多个kafka实例组成kafka集群,每个实例(s ...
- struts1:Struts配置文件初解
struts-config.xml是Struts的核心文件.该文件可配置各种组件,包括,FormBeans,Actions,ActionMappings,全局转发GlobalForwards,数据源D ...
- struts1:(Struts重构)构建一个简单的基于MVC模式的JavaWeb
在构建一个简单的基于MVC模式的JavaWeb 中,我们使用了JSP+Servlet+JavaBean构建了一个基于MVC模式的简单登录系统,但在其小结中已经指出,这种模式下的Controller 和 ...
- Java Web编程的主要组件技术——Struts核心组件
参考书籍:<J2EE开源编程精要15讲> Struts配置文件struts-config.xml Struts核心文件,可配置各种组件,包括Form Beans.Actions.Actio ...
- 具体分析Struts工作流程
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXV3ZW56aGU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...
- Struts2的介绍
Struts2的介绍 制作人:全心全意 Struts引用的是MVC(Model-View-Controller,模型-视图-控制器)设计理念.目前,JavaWeb应用MVC设计理念的框架有很多,如St ...
- 对SSH框架的理解
首先是对struts的理解.struts是把servlet.jsp以及众多标签库整合在一起的开源web框架,他实现了mvc设计模式.Struts实际上就是对MVC的各部件提供了现成的实现组件.Stru ...
- struts1.x 核心控制器 和 用户自定义控制器扩展类;
ServletAction继承于HttpServlet,是struts1.x中和核心控制器. 配置于web.xml文件中,指定config属性,该config属性用于指定formBean和action ...
随机推荐
- [转]eclipse下编写android程序突然不会自动生成R.java文件和包的解决办法
原网址 : http://www.cnblogs.com/zdz8207/archive/2012/11/30/eclipse-android-adt-update.html 网上解决方法主要有这几种 ...
- 关于arm-linux-gcc的安装与配置
在嵌入式开发中我们经常会用到arm-linux-gcc来编译我们的应用程序.作为arm-linux-gcc的入门,我们先看看如何安装arm-linux-gcc. 安装arm-linux-gcc还是比较 ...
- UIAlertView与UIActionSheet
1.UIAlertView(警告框) 1.1 创建警告框,设置样式 - (IBAction)alertView:(UIButton *)sender {//创建button按钮 //创建警告框的实例 ...
- iOS 之URL schemes
添加 URL schemes 步骤: 1.打开info.plist文件. 2.点击 “+ ”号添加,或者在列表上点击鼠标右键,选择 Add Row. 3.选择 URL types. 4.点击三角号展 ...
- c# Parallel并行运算
string str = ""; DataTable dt=new DataTable(); dt.Columns.Add("name", typeof(Sys ...
- NFC应用(二)读写器模式
NFC第二种应用场境就是所谓的读写器模式.既然有卡,当然就会有读写器,这两种模式是配合在一起使用的.两个卡放一起不能通信,两个读写器模式的设备也不能通信. NFC读写器一般支持以下一种或多种协议:Mi ...
- I2C_周立功标准驱动程序_c代码
/****************************************Copyright (c)********************************************** ...
- SqlDataReader类
一.常用属性 名称 说明 Depth 获取一个值,用于指示当前行的嵌套深度. FieldCount 获取当前行中的列数. HasRows 获取一个值,该值指示 SqlDataReader 是否有行. ...
- 转:Dynamic Binding Of RDLC To ReportViewer
Introduction I was struggling to find the solution to bind rdlc dynamically to reportviewer .We had ...
- 【转】如何检测wifi信号强度? -- 不错
原文网址:http://jingyan.baidu.com/article/90895e0fe9616164ec6b0b88.html 当我们在使用wifi上网时,在某些角落会出现无wifi信号,或是 ...