大家都知道,Struts控制器组件负责接受用户请求,更通模型,以及返回给用户合适的视图组件.
控制器将模型层和视图层分开,这样分离,可以为同一个模型开发出不同的视图.
下面时Struts的三大主要组件
ActionServlet组件:充当Struts框架的中央控制器
RequestProcessor组件:充当每个子应用模块的请求处理器
Action组件:真正来处理一项具体的业务.
一. Struts的init()方法
Struts应用中只存在ActionServlet的一个实例,Servlet容器在启动时,或者用户首次请求ActionServlet时加载ActionServlet类.在这两种情况下,servlet容器都会在ActionServlet容器被加载后立即执行它的init()方法,这可以保证ActionServlet处理用户请求时已经被初始化.
下面根据Init()讲述Struts的初始化过程
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()方法来处理请求.
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);
}
下面是process方法,它看上去并不复杂,但他调用的其他方法比较复杂.
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();
定义如下的类:
package sample;
public class ExtendedActionServlet extends ActionServlet {
public void init() throws ServletException {
super.init();
//do some operations
……………
}
}
扩展完类后,还应该在web.xml文件中如下配置:
<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,后面的/表示转义
分享到:
相关推荐
1. **ActionServlet组件**: ActionServlet是Struts1框架的中心控制器。它接收HTTP请求,通过doGet或doPost方法处理这些请求,并调用RequestProcessor进行进一步的处理。开发者可以通过扩展ActionServlet类来实现...
解决struts2配置为/*之后 servlet不能使用的问题
本教程将基于提供的"Strust1框架搭建完整代码"进行详解,帮助你理解和掌握Struts1的基础知识。 1. **Struts1简介** Struts1是早期Web开发中的重要框架,它简化了Java Servlet和JSP的开发,通过定义Action类和配置...
在Struts框架中,模型由ActionForm对象代表,视图通常为JSP页面,控制器则是Struts的ActionServlet。 在Struts框架中,配置文件起着至关重要的作用。`struts-config.xml`文件是Struts的核心配置文件,它定义了...
接下来,创建一个Action类,这是Struts2中的核心组件,负责处理用户的请求。比如,我们可以创建一个名为`LoginAction`的类,实现登录逻辑: ```java public class LoginAction { private String username; ...
通过配置ActionServlet,开发者可以定义请求的映射,使应用程序的结构更为清晰。Struts1提供了一系列的标签库,如display tags,帮助开发者便捷地创建用户界面。 Hibernate3.0,则是一个持久层框架,它简化了数据库...
例如,`<s:property>`标签用于显示模型对象的属性值,`<s:form>`标签用于创建表单,`<s:action>`标签用于触发Action,以及`s:iterator>`标签用于遍历集合等。 二、Struts1核心标签 1. `<s:property>`:此标签用于...
struts2各项默认配置 <action name=""> 没有class,那么class="ActionSupport" 如果没有method,那么method="execute",如果result没有名字,那么name="success
Struts2是一个基于MVC设计模式的Web应用框架,它提供了强大的Action和Result机制,以及丰富的拦截器,可以进一步规范和增强应用程序的行为。 总的来说,SSM框架组合提供了完整的控制反转和面向切面的编程能力,以及...
1. **struts2-core.jar**:这是Struts2的核心库,包含了框架的基本结构和主要组件,如Action、Interceptor、Result等。它定义了Struts2的生命周期,提供了请求处理、国际化、插件扩展等功能。 2. **struts2-...
strust2 中文 帮助文档 新手入门到精通
其中最著名的可能就是CVE-2017-5638,这是一个通过解析用户提交的恶意Action配置导致的远程代码执行漏洞。攻击者可以通过构造特定的HTTP请求头来触发这个漏洞,进而执行任意系统命令,对服务器造成极大的危害。该...
2. **Action类**:Action类是Struts 2的核心组件,它处理HTTP请求,执行业务逻辑,并返回一个结果。每个Action类通常对应于一个特定的用户操作或业务流程。 3. **配置文件**:Struts 2使用XML配置文件(struts.xml...
Struts框架由一系列的类、辅助类和定制的JSP标签库组成,如ActionServlet、Action和ActionForm等,开发者可以利用这些预定义的组件快速开发出功能完整的Web应用。 (5)框架的三层结构 - 接口层:定义了框架的公共...
讲述了Spring和Strust2的整合
2. **请求调度**:Controller组件(ActionServlet)负责接收HTTP请求,并根据配置文件分发到相应的Action。 3. **表单验证**:ActionForm用于接收和校验用户输入的数据,提供了客户端和服务器端的验证机制。 4. **...