大家都知道,Struts控制器组件负责接受用户请求,更通模型,以及返回给用户合适的视图组件.
控制器将模型层和视图层分开,这样分离,可以为同一个模型开发出不同的视图.
下面时Struts的三大主要组件
ActionServlet组件:充当Struts框架的中央控制器
RequestProcessor组件:充当每个子应用模块的请求处理器
Action组件:真正来处理一项具体的业务.
一. Struts的init()方法
Struts应用中只存在ActionServlet的一个实例,Servlet容器在启动时,或者用户首次请求ActionServlet时加载ActionServlet类.在这两种情况下,servlet容器都会在ActionServlet容器被加载后立即执行它的init()方法,这可以保证ActionServlet处理用户请求时已经被初始化.
下面根据Init()讲述Struts的初始化过程
Java代码
public void init() throws ServletException {
// Wraps the entire initialization in a try/catch to better handle
// unexpected exceptions and errors to provide better feedback
// to the developer
try {
//调用initInternal()方法,初始化Struts框架内的消息资源,如与系统日志相关的通知,警告,和错误消息.
1)initInternal();
//调用ininOther()方法,从web.xml文件中加载ActionServlet的初始化参数,如config参数
2)initOther();
//调用initServlet()方法,从web.xml文件中加载ActionServlet的URL映射信息.同时还会注册web.xml文件和Struts配置文件所使用的DTD文件,这些DTD文件用户验证web.xml和struts配置文件的语法.其中方法里的 digester类负责解析web.xml,对字符串servletMapping属性进行初始化
3) initServlet();
//把ActionServlet实例放到ServletContext里
getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY, this);
//初始化一个factory,用于创建moduleConfig
initModuleConfigFactory();
//,加载并解析默认struts配置文件/WEB-INF/struts-config.xml,同时创建MoudleConfig实例,放到ServletContext中
4)ModuleConfig moduleConfig = initModuleConfig("", config);
//加载并初始化默认子应用模块的消息资源;讲解MessageResources对象,把它存储在ServletContext中.
5)initModuleMessageResources(moduleConfig);
//加载并初始化默认子应用模块的数据源,如果在struts配置文件中没有定义<data-sources >元素,忽略这一流程.
6)initModuleDataSources(moduleConfig);
//加载并初始化默认子应用的所有插件
7)initModulePlugIns(moduleConfig);
//冻结moduleConfig(,在方法返回之前不能修改它,否则将抛出异常)
moduleConfig.freeze();
//如果还有其他子应用模块,将重复4-7步
Enumeration names = getServletConfig().getInitParameterNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
if (!name.startsWith("config/")) {
continue;
}
String prefix = name.substring(6);
moduleConfig = initModuleConfig
(prefix, getServletConfig().getInitParameter(name));
initModuleMessageResources(moduleConfig);
initModuleDataSources(moduleConfig);
initModulePlugIns(moduleConfig);
moduleConfig.freeze();
}
//将各个子模块应用(除了默认的)的前缀存到一个字符数组中,并放到servletcontext中
this.initModulePrefixes(this.getServletContext());
//释放创建的用于读取配置文件的digester实例,释放内存
this.destroyConfigDigester();
} catch (UnavailableException ex) {
throw ex;
} catch (Throwable t) {
// The follow error message is not retrieved from internal message
// resources as they may not have been able to have been
// initialized
log.error("Unable to initialize Struts ActionServlet due to an "
+ "unexpected exception or error thrown, so marking the "
+ "servlet as unavailable. Most likely, this is due to an "
+ "incorrect or missing library dependency.", t);
throw new UnavailableException(t.getMessage());
}
}
public void init() throws ServletException {
// Wraps the entire initialization in a try/catch to better handle
// unexpected exceptions and errors to provide better feedback
// to the developer
try {
//调用initInternal()方法,初始化Struts框架内的消息资源,如与系统日志相关的通知,警告,和错误消息.
1)initInternal();
//调用ininOther()方法,从web.xml文件中加载ActionServlet的初始化参数,如config参数
2)initOther();
//调用initServlet()方法,从web.xml文件中加载ActionServlet的URL映射信息.同时还会注册web.xml文件和Struts配置文件所使用的DTD文件,这些DTD文件用户验证web.xml和struts配置文件的语法.其中方法里的 digester类负责解析web.xml,对字符串servletMapping属性进行初始化
3) initServlet();
//把ActionServlet实例放到ServletContext里
getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY, this);
//初始化一个factory,用于创建moduleConfig
initModuleConfigFactory();
//,加载并解析默认struts配置文件/WEB-INF/struts-config.xml,同时创建MoudleConfig实例,放到ServletContext中
4)ModuleConfig moduleConfig = initModuleConfig("", config);
//加载并初始化默认子应用模块的消息资源;讲解MessageResources对象,把它存储在ServletContext中.
5)initModuleMessageResources(moduleConfig);
//加载并初始化默认子应用模块的数据源,如果在struts配置文件中没有定义<data-sources >元素,忽略这一流程.
6)initModuleDataSources(moduleConfig);
//加载并初始化默认子应用的所有插件
7)initModulePlugIns(moduleConfig);
//冻结moduleConfig(,在方法返回之前不能修改它,否则将抛出异常)
moduleConfig.freeze();
//如果还有其他子应用模块,将重复4-7步
Enumeration names = getServletConfig().getInitParameterNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
if (!name.startsWith("config/")) {
continue;
}
String prefix = name.substring(6);
moduleConfig = initModuleConfig
(prefix, getServletConfig().getInitParameter(name));
initModuleMessageResources(moduleConfig);
initModuleDataSources(moduleConfig);
initModulePlugIns(moduleConfig);
moduleConfig.freeze();
}
//将各个子模块应用(除了默认的)的前缀存到一个字符数组中,并放到servletcontext中
this.initModulePrefixes(this.getServletContext());
//释放创建的用于读取配置文件的digester实例,释放内存
this.destroyConfigDigester();
} catch (UnavailableException ex) {
throw ex;
} catch (Throwable t) {
// The follow error message is not retrieved from internal message
// resources as they may not have been able to have been
// initialized
log.error("Unable to initialize Struts ActionServlet due to an "
+ "unexpected exception or error thrown, so marking the "
+ "servlet as unavailable. Most likely, this is due to an "
+ "incorrect or missing library dependency.", t);
throw new UnavailableException(t.getMessage());
}
}
将各个子模块应用(除了默认的)的前缀存到一个字符数组中,并放到servletcontext中,对于默认的子应用模块,在appclication范围内存放他的MoudleConfig实例的key为“org.apache.struts.action.MODULE”,其他模块如/account,存放的key为org.apache.struts.action.MODULE/account,消息,数据源和插件等部分存在servletcontext的key和上述方法类似,不在说明.
二.ActionServlet的process方法
当ActionServlet接受到HTTP请求后,在doget()或doPost()方法中都会调用process()方法来处理请求.
Java代码
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
process(request, response);
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
process(request, response);
}
Java代码
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
process(request, response);
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
process(request, response);
}
下面是process方法,它看上去并不复杂,但他调用的其他方法比较复杂.
Java代码
protected void process(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
//根据request里的信息从servletContext里找到相应的子模块ModuleConfig,和它下面的MessageResources,并放到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);
}
protected void process(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
//根据request里的信息从servletContext里找到相应的子模块ModuleConfig,和它下面的MessageResources,并放到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);
}
三. 扩展ActionServlet类
从Struts1.1开始,为减轻ActionServlet的负担,多数功能已经移到RequestProcessor类中,所以基本不用扩展ActionServlet类
如果需要创建自己的ActionServlet,则可以创建一个它的子类.覆盖init()方法(或其他方法),可以写一些自己的操作,但要先调用super.init();
定义如下的类:
Java代码
package sample;
public class ExtendedActionServlet extends ActionServlet {
public void init() throws ServletException {
super.init();
//do some operations
……………
}
}
package sample;
public class ExtendedActionServlet extends ActionServlet {
public void init() throws ServletException {
super.init();
//do some operations
……………
}
}
扩展完类后,还应该在web.xml文件中如下配置:
Java代码
<servlet>
<servlet-name>sample</servlet-name>
<servlet-class>sample.ExtendedActionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sample</servlet-name>
<url-pattern>/action/*<url-pattern>
<servlet>
<servlet-name>sample</servlet-name>
<servlet-class>sample.ExtendedActionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sample</servlet-name>
<url-pattern>/action/*<url-pattern>
上面的/action/*表示负责处理所有以/action为前缀的URL,后面的/表示转义
分享到:
相关推荐
struts1之ActionServlet详解 struts1框架中的ActionServlet是Struts1架构的核心组件之一,负责处理用户请求、交互ActionForm、ActionMapping和Action等组件,以完成用户请求。下面将详细介绍ActionServlet的工作...
#### 三、ActionServlet配置详解 ##### 3.1 web.xml配置 在Struts应用中,`ActionServlet`的配置通常位于`web.xml`文件中,如下所示: ```xml <servlet> <servlet-name>action</servlet-name> <servlet-class>...
ActionServlet详解** - **功能**:作为中心控制器,负责接收客户端请求并分发到相应的Action进行处理。 - **配置**:在`web.xml`文件中进行配置。 - **初始化参数**: - `config`:指定配置文件的路径。 - `...
2. **ActionServlet详解**:ActionServlet作为Struts的核心,负责初始化配置文件、解析用户请求并转发到对应的Action对象进行处理。ActionServlet通过配置文件(如struts-config.xml)来确定每个URL请求应该映射到...
在 struts1 框架中,web.xml 文件是必不可少的配置文件之一,它用于配置 Struts 应用程序的核心组件 ActionServlet。本文将详细解释 web.xml 文件中的配置项和相关知识点。 1. 配置 Struts 的 ActionServlet 在 ...
3. **表单和Action Bean的创建**:如果请求中包含了表单数据,`ActionServlet`会创建或获取一个对应的Form Bean(如`addForm`),并将请求参数填充到表单Bean中。 4. **执行Action**:找到匹配的Action Mapping后,...
- `org.apache.struts.action`:包含运行Struts框架所需的核心类和组件,如ActionServlet、Action、ActionForm和ActionMapping。 - `org.apache.struts.actions`:提供适配器来转换HTTP请求和业务逻辑处理。 - `org....
2. 使用`servlet-mapping`元素映射这个Servlet,`servlet-name`与之前定义的Servlet名称匹配,`url-pattern`通常设置为`*.do`,表示所有以`.do`结尾的请求都将由ActionServlet处理。 3. 通过`<servlet>`内的`...
1. **ActionServlet**:作为整个框架的核心控制器,ActionServlet负责接收所有用户请求,并决定如何处理这些请求。它从`struts-config.xml`文件中读取配置信息,并存储到相应的配置对象中。 2. **ActionForm**:...
12.3.3 动作元素(action elements) 376 12.3.4 注释 383 12.4 jsp的隐含对象 383 12.4.1 pagecontext 384 12.4.2 out 385 12.4.3 page 385 12.4.4 exception 386 12.5 对象和范围 387 12.6 留言板程序 389...
同时,web.xml中需要配置Struts的前端控制器ActionServlet。 四、Struts工作流程 1. 用户发送HTTP请求到服务器。 2. ActionServlet拦截请求,根据配置文件找到对应的ActionMapping。 3. 创建ActionForm实例,填充...
综上所述,本案例“Struts2之Servlet文件上传详解”将引导你了解如何结合Struts2和Servlet实现文件上传功能,包括配置、Action编写、JSP页面设计以及注意事项。通过实践,你将更深入地理解Struts2框架在处理复杂Web...
12.3.3 动作元素(action elements) 376 12.3.4 注释 383 12.4 jsp的隐含对象 383 12.4.1 pagecontext 384 12.4.2 out 385 12.4.3 page 385 12.4.4 exception 386 12.5 对象和范围 387 12.6 留言板程序 389...
详解Struts2中Action访问Servlet API的几种方法 在通常的web开发中Request和Response对象比较常见,但在Struts2框架中由于Action能与JSP页面进行数据交互,所以通常都不会用到这两个对象。如果想在Struts2程序中用到...
- **ActionServlet**:总控制器,处理所有用户请求,并将其分发给相应的Action组件。 - **Action**:处理具体的业务逻辑。 - **ActionForm (FormBean)**:封装表单数据的对象。 - **ActionForward**:用于Action的...
12.3.3 动作元素(action elements) 376 12.3.4 注释 383 12.4 jsp的隐含对象 383 12.4.1 pagecontext 384 12.4.2 out 385 12.4.3 page 385 12.4.4 exception 386 12.5 对象和范围 387 12.6 留言板程序 389...
此外,ActionServlet还负责加载配置文件(`struts-config.xml`),初始化框架并管理生命周期。 2. **ActionClass**(模型):包含业务逻辑的类,通常继承自`Action`类。Action对象负责处理用户请求并将其转发给...