- 浏览: 64582 次
- 性别:
- 来自: 长沙
最新评论
-
hyj1254:
说得好啊..
什么是个人核心竞争力 -
hehaibo_job:
楼主,数据库脚本怎么都没啊
Jfreechat实例 -
dazui521:
感动,我找了好久才找到这么好的例子
Jfreechat实例 -
dazui521:
...
Jfreechat实例
Struts 源码学习之ActionServlet ( 二)
④ 调用 initChain(); 读取web.xml中命令链文件初始值chainConfig
protected String chainConfig = "org/apache/struts/chain/chain-config.xml";
// ④ initChain();
// 如没有chainConfig参数,则使用默认 "org/apache/struts/chain/chain-config.xml"
String value;
value = getServletConfig().getInitParameter("chainConfig");
if (value != null) {
chainConfig = value;
}
ConfigParser parser = new ConfigParser();
List urls = splitAndResolvePaths(chainConfig);
URL resource;
// chainConfig 替换了原来传统的在 RequestProcessor 类中执行的 HTTP 请求处理
for (Iterator i = urls.iterator(); i.hasNext();) {
resource = (URL) i.next();
log.info("Loading chain catalog from " + resource);
parser.parse(resource);
}
/************************************************************
// org.apache.struts.action. RequestProcessor .java 的process方法中,一些方法如
processLocale (request, response);
processContent (request, response);
processNoCache (request, response);
.......
被 "org/apache/struts/chain/chain-config.xml" 中下列配置所取代
<command
className="org.apache.struts.chain.commands.servlet.SelectLocale"/>
<command
className="org.apache.struts.chain.commands.servlet.SetContentType"/>
<command
className="org.apache.struts.chain.commands.servlet.RequestNoCache"/>
.......
好处是充分降低了代码内部方法与方法之间的耦合度
************************************************************/
在④/⑤之间
// 把servlet对象存储到servletContext中,属性名为Globals.ACTION_SERVLET_KEY
( " org.apache.struts.action.ACTION_SERVLET " )
getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY, this);
⑤ 调用 initModuleConfigFactory(); 和 initModuleConfig("", config); 创建 ModuleConfig 对象。Struts中的MessageResource、PlugIn、数据源等,都是通过ModuleConfig来实现的。
// 初始化ModuleConfig配置工厂
initModuleConfigFactory(); // ⑴
// 由配置工厂实例化一个ModuleConfig的对象
ModuleConfig moduleConfig = initModuleConfig("", config); // ⑵
⑴
initModuleConfigFactory(); 所做的工作:
// 得到web.xml中"configFactory"参数,如果找不到,则使用 默认工厂
String configFactory = getServletConfig().getInitParameter("configFactory");
if (configFactory != null) {
ModuleConfigFactory.setFactoryClass(configFactory);
}
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>configFactory</param-name> <!-- 得到"configFactory"参数-->
<param-value>com.lively.base.webapp.UserModuleConfigFactory</param-value>
</init-param>
.......
</servlet>
在ModuleConfigFactory.java中的setFactoryClass方法,
public static void setFactoryClass(String factoryClass) {
ModuleConfigFactory.factoryClass = factoryClass;
ModuleConfigFactory.clazz = null;
}
其中
protected static Class clazz = null;
protected static String factoryClass =
"org.apache.struts.config.impl.DefaultModuleConfigFactory";
⑵
initModuleConfig ("", config); 所做的工作:
// Parse the configuration for this module
ModuleConfigFactory factoryObject = ModuleConfigFactory.createFactory(); // Ⅰ
ModuleConfig config = factoryObject.createModuleConfig(prefix); // Ⅱ
Ⅰ
ModuleConfigFactory.createFactory(); 方法中:
protected static Class clazz = null;
protected static String factoryClass =
"org.apache.struts.config.impl.DefaultModuleConfigFactory";
if (clazz == null) {
clazz = RequestUtils.applicationClass(factoryClass);
}
factory = (ModuleConfigFactory) clazz.newInstance();
而RequestUtils.applicationClass通过classLoader加载一个
org.apache.struts.config.impl.DefaultModuleConfigFactory
Ⅱ
ModuleConfig config = factoryObject.createModuleConfig(prefix); 方法中:
// 通过new ModuleConfigImpl(prefix);设置一些变量的初始值,在 initModuleConfig ("", config); 方法的最后会 把ModuleConfig对象放置到servletContext中 (参见 Ⅴ )
protected String prefix = null;
protected HashMap actionConfigs = null;
protected List actionConfigList = null;
protected String actionFormBeanClass = "org.apache.struts.action.ActionFormBean";
protected String actionMappingClass = "org.apache.struts.action.ActionMapping";
protected String actionForwardClass = "org.apache.struts.action.ActionForward";
protected boolean configured = false;
protected ControllerConfig controllerConfig = null;
protected HashMap exceptions = null;
protected HashMap formBeans = null;
protected HashMap forwards = null;
protected HashMap messageResources = null;
protected ArrayList plugIns = null;
public ModuleConfigImpl(String prefix) {
super();
this.prefix = prefix;
this.actionConfigs = new HashMap();
this.actionConfigList = new ArrayList();
this.actionFormBeanClass = "org.apache.struts.action.ActionFormBean";
this.actionMappingClass = "org.apache.struts.action.ActionMapping";
this.actionForwardClass = "org.apache.struts.action.ActionForward";
this.configured = false;
this.controllerConfig = null;
this.exceptions = new HashMap();
this.formBeans = new HashMap();
this.forwards = new HashMap();
this.messageResources = new HashMap();
this.plugIns = new ArrayList();
}
Ⅲ
protected String config = "/WEB-INF/struts-config.xml"; // ② initOther(); ⑤ initModuleConfig ();
protected Digester configDigester = null; // ⑤ initModuleConfig ();
// 初始化Digester,
Digester digester = initConfigDigester();
initConfigDigester(); 所做的工作:
// Create a new Digester instance with standard capabilities
configDigester = new Digester();
configDigester.setNamespaceAware(true);
configDigester.setValidating(this.isValidating());
configDigester.setUseContextClassLoader(true);
// 解析struts配置文件之前,首先添加默认的解析规则
configDigester.addRuleSet(new ConfigRuleSet());
for (int i = 0; i < registrations.length; i += 2) {
URL url = this.getClass().getResource(registrations[i + 1]);
if (url != null) {
configDigester.register(registrations[i], url.toString());
}
}
// 通过getServletConfig().getInitParameter("rulesets");从web.xml中读取用户自定义的解析规则(用","分开的org.apache.commons.digester.RuleSet列表)
this.addRuleSets();
.......
Ⅳ
/* 循环struts配置文件(用","分开的多个struts配置文件)并解析, parseModuleConfigFile 执行之后可以 从struts-config.xml等配置文件中得到 Ⅱ 中 actionConfigs/actionConfigList 、exceptions 、formBeans、forwards、messageResources、plugIns等的配置,并把得到的所有值封装到对象ModuleConfig对象(config)中 */
List urls = splitAndResolvePaths(paths);
URL url;
for (Iterator i = urls.iterator(); i.hasNext();) {
url = (URL) i.next();
digester.push(config);
this.parseModuleConfigFile(digester, url);
}
Ⅴ
// 把config存储到servletContext中 ,属性名为Globals.MODULE_KEY
( " org.apache.struts.action.MODULE " )
getServletContext().setAttribute(Globals.MODULE_KEY
+ config.getPrefix(), config);
⑥ 用户资源文件的初始化 initModuleMessageResources(moduleConfig);
在上面第⑤步的Ⅱ中我们已经创建了ModuleConfig对象并在Ⅲ和Ⅵ中从struts-config.xml等配置文件中得到得到一些配置且封装到ModuleConfig对象中,所以在下面可以直接使用initModuleMessageResources(moduleConfig);
initModuleMessageResources(moduleConfig); 所做的工作:
⑴
/* 从moduleConfig中读取所有的资源文件(包括 ① 内部资源文件 和 ⑤ 中Ⅵ利用Digester读取的struts配置文件指定的用户资源文件) */
MessageResourcesConfig[] mrcs = config.findMessageResourcesConfigs();
注: 此时moduleConfig中默认只含有① 内部资源文件ActionResources.properties
⑵
// 把resources(包括 ① 内部资源文件 和 ⑥ 用户资源文件 )存储到servletContext中 // 属性名为mrcs[i].getKey() + config.getPrefix()
for (int i = 0; i < mrcs.length; i++) {
if ((mrcs[i].getFactory() == null)
|| (mrcs[i].getParameter() == null)) {
continue;
}
if (log.isDebugEnabled()) {
log.debug("Initializing module path '" + config.getPrefix()
+ "' message resources from '" + mrcs[i].getParameter()
+ "'");
}
String factory = mrcs[i].getFactory();
MessageResourcesFactory.setFactoryClass(factory);
MessageResourcesFactory factoryObject =
MessageResourcesFactory.createFactory();
factoryObject.setConfig(mrcs[i]);
MessageResources resources =
factoryObject.createResources(mrcs[i].getParameter());
resources.setReturnNull(mrcs[i].getNull());
resources.setEscape(mrcs[i].isEscape());
getServletContext().setAttribute(mrcs[i].getKey()
+ config.getPrefix(), resources);
}
⑦ 用户插件的初始化 initModulePlugIns(moduleConfig);
在上面第⑤步的Ⅱ中我们已经创建了ModuleConfig对象并在Ⅲ和Ⅵ中从struts-config.xml等配置文件中得到得到一些配置且封装到ModuleConfig对象中,所以在下面可以直接使用initModulePlugIns(ModuleConfig config);
initModulePlugIns(moduleConfig); 所做的工作:
⑴
// 从moduleConfig中读取所有的插件文件
PlugInConfig[] plugInConfigs = config.findPlugInConfigs();
PlugIn[] plugIns = new PlugIn[plugInConfigs.length];
⑵
// 把所有plugIns存储到servletContext中
// 属性名为Globals.PLUG_INS_KEY + config.getPrefix()
.......
getServletContext().setAttribute(Globals.PLUG_INS_KEY
+ config.getPrefix(), plugIns);
.......
⑧ 把struts配置文件中的其他配置 存储到servletContext中 ,包括
initModuleFormBeans(moduleConfig);
initModuleForwards(moduleConfig);
initModuleExceptionConfigs(moduleConfig);
initModuleActions(moduleConfig);
⑨ 调用 moduleConfig.freeze(); 固定组件配置
/* 使ModuleConfig中的 actionConfigs/actionConfigList 、exceptions 、formBeans、forwards、messageResources、plugIns等的配置等变得不可改变 */
moduleConfig.freeze();
⑩ 解析以"config/"开头的其他struts配置文件
// 遍历web.xml中servletConfig配置的 initParameterNames
// 如发现以" config/ " 开始的parameter,则根据此值初始化其它的ModuleConfig
Enumeration names = getServletConfig().getInitParameterNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
if (!name.startsWith(configPrefix)) {
continue;
}
String prefix = name.substring(configPrefixLength);
moduleConfig =
initModuleConfig(prefix,
getServletConfig().getInitParameter(name));
initModuleMessageResources(moduleConfig);
initModulePlugIns(moduleConfig);
initModuleFormBeans(moduleConfig);
initModuleForwards(moduleConfig);
initModuleExceptionConfigs(moduleConfig);
initModuleActions(moduleConfig);
moduleConfig.freeze();
}
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name> <!-- 得到"config"参数-->
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>config/admin</param-name> <!-- 得到"config/admin"参数-->
<param-value>/WEB-INF/struts-config-admin.xml</param-value>
</init-param>
.......
</servlet>
在⑩ 解析以"config/"开头的其他struts配置文件之后ActionServlet的init()方法还需要做
⑴
// 初始化其他模块的前缀
this.initModulePrefixes(this.getServletContext());
initModulePrefixes(this.getServletContext()); 所做的工作:
/* 把其他模块prefixes存储到servletContext中,属性名为
Globals.MODULE_PREFIXES_KEY ( " org.apache.struts.globals.MODULE_PREFIXES " ) */
context.setAttribute(Globals.MODULE_PREFIXES_KEY, prefixes);
⑵
// 设置configDigester = null,释放内存
this.destroyConfigDigester();
④ 调用 initChain(); 读取web.xml中命令链文件初始值chainConfig
protected String chainConfig = "org/apache/struts/chain/chain-config.xml";
// ④ initChain();
// 如没有chainConfig参数,则使用默认 "org/apache/struts/chain/chain-config.xml"
String value;
value = getServletConfig().getInitParameter("chainConfig");
if (value != null) {
chainConfig = value;
}
ConfigParser parser = new ConfigParser();
List urls = splitAndResolvePaths(chainConfig);
URL resource;
// chainConfig 替换了原来传统的在 RequestProcessor 类中执行的 HTTP 请求处理
for (Iterator i = urls.iterator(); i.hasNext();) {
resource = (URL) i.next();
log.info("Loading chain catalog from " + resource);
parser.parse(resource);
}
/************************************************************
// org.apache.struts.action. RequestProcessor .java 的process方法中,一些方法如
processLocale (request, response);
processContent (request, response);
processNoCache (request, response);
.......
被 "org/apache/struts/chain/chain-config.xml" 中下列配置所取代
<command
className="org.apache.struts.chain.commands.servlet.SelectLocale"/>
<command
className="org.apache.struts.chain.commands.servlet.SetContentType"/>
<command
className="org.apache.struts.chain.commands.servlet.RequestNoCache"/>
.......
好处是充分降低了代码内部方法与方法之间的耦合度
************************************************************/
在④/⑤之间
// 把servlet对象存储到servletContext中,属性名为Globals.ACTION_SERVLET_KEY
( " org.apache.struts.action.ACTION_SERVLET " )
getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY, this);
⑤ 调用 initModuleConfigFactory(); 和 initModuleConfig("", config); 创建 ModuleConfig 对象。Struts中的MessageResource、PlugIn、数据源等,都是通过ModuleConfig来实现的。
// 初始化ModuleConfig配置工厂
initModuleConfigFactory(); // ⑴
// 由配置工厂实例化一个ModuleConfig的对象
ModuleConfig moduleConfig = initModuleConfig("", config); // ⑵
⑴
initModuleConfigFactory(); 所做的工作:
// 得到web.xml中"configFactory"参数,如果找不到,则使用 默认工厂
String configFactory = getServletConfig().getInitParameter("configFactory");
if (configFactory != null) {
ModuleConfigFactory.setFactoryClass(configFactory);
}
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>configFactory</param-name> <!-- 得到"configFactory"参数-->
<param-value>com.lively.base.webapp.UserModuleConfigFactory</param-value>
</init-param>
.......
</servlet>
在ModuleConfigFactory.java中的setFactoryClass方法,
public static void setFactoryClass(String factoryClass) {
ModuleConfigFactory.factoryClass = factoryClass;
ModuleConfigFactory.clazz = null;
}
其中
protected static Class clazz = null;
protected static String factoryClass =
"org.apache.struts.config.impl.DefaultModuleConfigFactory";
⑵
initModuleConfig ("", config); 所做的工作:
// Parse the configuration for this module
ModuleConfigFactory factoryObject = ModuleConfigFactory.createFactory(); // Ⅰ
ModuleConfig config = factoryObject.createModuleConfig(prefix); // Ⅱ
Ⅰ
ModuleConfigFactory.createFactory(); 方法中:
protected static Class clazz = null;
protected static String factoryClass =
"org.apache.struts.config.impl.DefaultModuleConfigFactory";
if (clazz == null) {
clazz = RequestUtils.applicationClass(factoryClass);
}
factory = (ModuleConfigFactory) clazz.newInstance();
而RequestUtils.applicationClass通过classLoader加载一个
org.apache.struts.config.impl.DefaultModuleConfigFactory
Ⅱ
ModuleConfig config = factoryObject.createModuleConfig(prefix); 方法中:
// 通过new ModuleConfigImpl(prefix);设置一些变量的初始值,在 initModuleConfig ("", config); 方法的最后会 把ModuleConfig对象放置到servletContext中 (参见 Ⅴ )
protected String prefix = null;
protected HashMap actionConfigs = null;
protected List actionConfigList = null;
protected String actionFormBeanClass = "org.apache.struts.action.ActionFormBean";
protected String actionMappingClass = "org.apache.struts.action.ActionMapping";
protected String actionForwardClass = "org.apache.struts.action.ActionForward";
protected boolean configured = false;
protected ControllerConfig controllerConfig = null;
protected HashMap exceptions = null;
protected HashMap formBeans = null;
protected HashMap forwards = null;
protected HashMap messageResources = null;
protected ArrayList plugIns = null;
public ModuleConfigImpl(String prefix) {
super();
this.prefix = prefix;
this.actionConfigs = new HashMap();
this.actionConfigList = new ArrayList();
this.actionFormBeanClass = "org.apache.struts.action.ActionFormBean";
this.actionMappingClass = "org.apache.struts.action.ActionMapping";
this.actionForwardClass = "org.apache.struts.action.ActionForward";
this.configured = false;
this.controllerConfig = null;
this.exceptions = new HashMap();
this.formBeans = new HashMap();
this.forwards = new HashMap();
this.messageResources = new HashMap();
this.plugIns = new ArrayList();
}
Ⅲ
protected String config = "/WEB-INF/struts-config.xml"; // ② initOther(); ⑤ initModuleConfig ();
protected Digester configDigester = null; // ⑤ initModuleConfig ();
// 初始化Digester,
Digester digester = initConfigDigester();
initConfigDigester(); 所做的工作:
// Create a new Digester instance with standard capabilities
configDigester = new Digester();
configDigester.setNamespaceAware(true);
configDigester.setValidating(this.isValidating());
configDigester.setUseContextClassLoader(true);
// 解析struts配置文件之前,首先添加默认的解析规则
configDigester.addRuleSet(new ConfigRuleSet());
for (int i = 0; i < registrations.length; i += 2) {
URL url = this.getClass().getResource(registrations[i + 1]);
if (url != null) {
configDigester.register(registrations[i], url.toString());
}
}
// 通过getServletConfig().getInitParameter("rulesets");从web.xml中读取用户自定义的解析规则(用","分开的org.apache.commons.digester.RuleSet列表)
this.addRuleSets();
.......
Ⅳ
/* 循环struts配置文件(用","分开的多个struts配置文件)并解析, parseModuleConfigFile 执行之后可以 从struts-config.xml等配置文件中得到 Ⅱ 中 actionConfigs/actionConfigList 、exceptions 、formBeans、forwards、messageResources、plugIns等的配置,并把得到的所有值封装到对象ModuleConfig对象(config)中 */
List urls = splitAndResolvePaths(paths);
URL url;
for (Iterator i = urls.iterator(); i.hasNext();) {
url = (URL) i.next();
digester.push(config);
this.parseModuleConfigFile(digester, url);
}
Ⅴ
// 把config存储到servletContext中 ,属性名为Globals.MODULE_KEY
( " org.apache.struts.action.MODULE " )
getServletContext().setAttribute(Globals.MODULE_KEY
+ config.getPrefix(), config);
⑥ 用户资源文件的初始化 initModuleMessageResources(moduleConfig);
在上面第⑤步的Ⅱ中我们已经创建了ModuleConfig对象并在Ⅲ和Ⅵ中从struts-config.xml等配置文件中得到得到一些配置且封装到ModuleConfig对象中,所以在下面可以直接使用initModuleMessageResources(moduleConfig);
initModuleMessageResources(moduleConfig); 所做的工作:
⑴
/* 从moduleConfig中读取所有的资源文件(包括 ① 内部资源文件 和 ⑤ 中Ⅵ利用Digester读取的struts配置文件指定的用户资源文件) */
MessageResourcesConfig[] mrcs = config.findMessageResourcesConfigs();
注: 此时moduleConfig中默认只含有① 内部资源文件ActionResources.properties
⑵
// 把resources(包括 ① 内部资源文件 和 ⑥ 用户资源文件 )存储到servletContext中 // 属性名为mrcs[i].getKey() + config.getPrefix()
for (int i = 0; i < mrcs.length; i++) {
if ((mrcs[i].getFactory() == null)
|| (mrcs[i].getParameter() == null)) {
continue;
}
if (log.isDebugEnabled()) {
log.debug("Initializing module path '" + config.getPrefix()
+ "' message resources from '" + mrcs[i].getParameter()
+ "'");
}
String factory = mrcs[i].getFactory();
MessageResourcesFactory.setFactoryClass(factory);
MessageResourcesFactory factoryObject =
MessageResourcesFactory.createFactory();
factoryObject.setConfig(mrcs[i]);
MessageResources resources =
factoryObject.createResources(mrcs[i].getParameter());
resources.setReturnNull(mrcs[i].getNull());
resources.setEscape(mrcs[i].isEscape());
getServletContext().setAttribute(mrcs[i].getKey()
+ config.getPrefix(), resources);
}
⑦ 用户插件的初始化 initModulePlugIns(moduleConfig);
在上面第⑤步的Ⅱ中我们已经创建了ModuleConfig对象并在Ⅲ和Ⅵ中从struts-config.xml等配置文件中得到得到一些配置且封装到ModuleConfig对象中,所以在下面可以直接使用initModulePlugIns(ModuleConfig config);
initModulePlugIns(moduleConfig); 所做的工作:
⑴
// 从moduleConfig中读取所有的插件文件
PlugInConfig[] plugInConfigs = config.findPlugInConfigs();
PlugIn[] plugIns = new PlugIn[plugInConfigs.length];
⑵
// 把所有plugIns存储到servletContext中
// 属性名为Globals.PLUG_INS_KEY + config.getPrefix()
.......
getServletContext().setAttribute(Globals.PLUG_INS_KEY
+ config.getPrefix(), plugIns);
.......
⑧ 把struts配置文件中的其他配置 存储到servletContext中 ,包括
initModuleFormBeans(moduleConfig);
initModuleForwards(moduleConfig);
initModuleExceptionConfigs(moduleConfig);
initModuleActions(moduleConfig);
⑨ 调用 moduleConfig.freeze(); 固定组件配置
/* 使ModuleConfig中的 actionConfigs/actionConfigList 、exceptions 、formBeans、forwards、messageResources、plugIns等的配置等变得不可改变 */
moduleConfig.freeze();
⑩ 解析以"config/"开头的其他struts配置文件
// 遍历web.xml中servletConfig配置的 initParameterNames
// 如发现以" config/ " 开始的parameter,则根据此值初始化其它的ModuleConfig
Enumeration names = getServletConfig().getInitParameterNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
if (!name.startsWith(configPrefix)) {
continue;
}
String prefix = name.substring(configPrefixLength);
moduleConfig =
initModuleConfig(prefix,
getServletConfig().getInitParameter(name));
initModuleMessageResources(moduleConfig);
initModulePlugIns(moduleConfig);
initModuleFormBeans(moduleConfig);
initModuleForwards(moduleConfig);
initModuleExceptionConfigs(moduleConfig);
initModuleActions(moduleConfig);
moduleConfig.freeze();
}
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name> <!-- 得到"config"参数-->
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>config/admin</param-name> <!-- 得到"config/admin"参数-->
<param-value>/WEB-INF/struts-config-admin.xml</param-value>
</init-param>
.......
</servlet>
在⑩ 解析以"config/"开头的其他struts配置文件之后ActionServlet的init()方法还需要做
⑴
// 初始化其他模块的前缀
this.initModulePrefixes(this.getServletContext());
initModulePrefixes(this.getServletContext()); 所做的工作:
/* 把其他模块prefixes存储到servletContext中,属性名为
Globals.MODULE_PREFIXES_KEY ( " org.apache.struts.globals.MODULE_PREFIXES " ) */
context.setAttribute(Globals.MODULE_PREFIXES_KEY, prefixes);
⑵
// 设置configDigester = null,释放内存
this.destroyConfigDigester();
发表评论
-
Struts 源码学习之ActionServlet ( 一)
2008-01-15 16:46 1122权所有:(xiaodaoxiaodao)蓝小刀 xiao ... -
Jakarta的公共连接池实现 - BasicDataSource
2008-01-10 14:52 6959| Jakarta的公共连接池实现 - BasicDa ... -
DWR
2008-01-03 15:25 1193DWR一个外国人实现的很有前途的AJAX框架。 多余的话就不说 ... -
用dwr封装表单项提交表单
2008-01-02 16:26 4006首先,配置dwr环境,网上很多资料都说得很详细,这里就不写了。 ... -
Java Reflection (JAVA反射)详解
2008-01-02 15:06 975Reflection是Java 程序开发语言的特征之一,它允许 ... -
DOM 解析
2008-01-02 09:30 1059To read and update, create and ... -
hql0
2007-12-29 14:07 845HQL语句。(已更新)2007年06月04日 星期一 18:2 ... -
Hql
2007-12-29 13:54 1096Hib的检索方式 1'导航对象图检索方式。通过已经加载的对象, ... -
翻页例子
2007-12-29 09:38 856个MS SQLServer7数据库 DNS ... -
在JSP中访问数据库大全
2007-12-29 09:33 801这种把数据库逻辑全部放在jsp里未必是好的做法,但是有利于初学 ... -
jsp 调用sql server数据源
2007-12-29 09:31 1273import java.sql.*; import java. ... -
转:j2ee中DAO设计模式
2007-12-26 17:11 940最近参与WEB编程项目,采用STRUTS框架,在处理到数据持久 ... -
getAttribute和getParameter的区别
2007-12-26 14:42 2405getAttribute是取得jsp中 用setAttribu ... -
xml dom 教程
2007-12-26 14:31 804http://61.139.52.111:8090/kj/Ma ... -
在网页中引入其它html页面的几种方法
2007-12-26 11:30 47261.IFrame引入,看看下面的代码 <IFRAME N ... -
Tomcat 的数据库连接池设置与应用(Mysql篇)
2007-12-17 17:24 15031.将数据库驱动程序的JAR文件放在Tomcat的 commo ... -
Tomcat+Mysql连接池
2007-12-17 15:25 2491Tomcat+Mysql连接池2006年10月06日 星期五 ... -
tomcat+mysql
2007-12-17 15:23 966安装tomcat+mysql2007-12-02 19:461 ... -
如何在 JavaScript 中实现拖放(上)
2007-08-18 17:48 871JavaScript擅长于修改页面中的DOM元素,但是我们使用 ... -
如何在 JavaScript 中实现拖放(下)
2007-08-18 17:46 869终于完成了全文的翻译,由于时间比较参促,文章没有过多的校正与润 ...
相关推荐
### Struts 源码学习之ActionServlet #### 一、引言 在Java Web开发领域,Struts框架因其简洁的MVC(Model-View-Controller)架构模式而备受开发者青睐。本文旨在深入剖析Struts框架的核心组件之一——`Action...
通过对`struts源码学习.pdf`文件中的内容分析,我们可以深入了解Struts框架内部的工作原理,尤其是`RequestProcessor`类和`ModuleConfig`接口的关键作用。这些知识对于理解和优化基于Struts的应用程序至关重要,同时...
总的来说,深入学习Servlet和Struts的源码,不仅能够帮助开发者理解这两个组件的工作原理,还能提升他们的问题排查能力,以及进行更高效、更灵活的Java Web应用开发。通过实践和理解这些源码,你将能够更好地适应...
ActionServlet解析请求,查找与之对应的ActionMapping。 3. 根据ActionMapping,创建ActionForm实例,填充请求参数。 4. 调用Action的execute方法,执行业务逻辑。 5. Action返回一个ActionForward对象,指示...
在Struts框架中,核心组件包括Action、ActionForm、ActionServlet、配置文件(struts-config.xml)以及各种拦截器。Action是业务逻辑的载体,ActionForm用于收集用户输入,ActionServlet作为Struts的核心控制器,...
Struts通过Action类实现了对Servlet请求的分发,ActionForm负责收集和验证表单数据,而Model代表业务对象,View则负责展示数据。这种分离使得代码更易于维护和测试。Struts还提供了强大的国际化、异常处理、数据校验...
`Action`类是业务逻辑的入口点,`ActionForm`用于收集和验证用户输入,`ActionServlet`是Struts的控制器,负责调度请求。 2. **org.apache.struts.config**:配置相关的类,如`ModuleConfig`和`ActionConfig`,它们...
学习和理解Struts的源码可以帮助开发者深入掌握MVC架构的原理,以及如何有效地组织和管理Web应用的各个层面。此外,对于想要从事Java Web开发的人来说,熟悉Struts这样的经典框架,有助于理解后来的Spring MVC、...
Struts框架的核心组件包括Action、ActionForm、ActionServlet、Config、Tiles等。Action是处理用户请求的中心,它接收表单数据并调用业务逻辑;ActionForm用于封装表单数据,提供验证功能;ActionServlet作为控制器...
ActionServlet是Struts1的核心组件,它的生命周期分为初始化、拦截请求和销毁三个阶段。在初始化阶段,`init()`方法执行了一系列关键步骤: 1. `initInternal()`方法初始化内部资源,如国际化设置。它包含了英文和...
学习Struts 2源码,你将能了解到以下知识点: - MVC设计模式的实现。 - Struts 2的拦截器机制,如何自定义拦截器以实现权限控制、日志记录等功能。 - 动作和结果的配置,以及如何使用OGNL表达式进行数据绑定。 - ...
学习Struts源码有助于开发者深入理解其内部工作机制,例如: - 如何解析struts-config.xml并构建ActionMapping和ActionForm实例。 - 请求是如何被ActionServlet接收并分发到对应的Action的。 - Action是如何处理...
3. **ActionServlet**:Struts的入口点,它是一个Servlet,负责处理HTTP请求,调用相应的Action类执行业务逻辑。 4. **配置文件**:主要包括struts-config.xml,定义了Action、ActionMapping、FormBean等配置,是...
北大青鸟的这份文档是为了帮助学习者入门和精通Struts所编写的,包含了对Struts源码的详细解析。 首先,了解Struts的核心控制器ActionServlet是必要的。ActionServlet继承自javax.servlet.http.HttpServlet类,负责...
总的来说,Struts 1.2源码的学习将帮助你理解Web应用程序的生命周期,MVC模式的实现细节,以及如何通过配置文件和代码协作来构建可扩展的Web应用。深入研究源码,不仅可以提升你的编程技能,也能让你更好地应对实际...
学习Struts1源码有助于开发者更好地理解Web应用的架构设计,以及MVC模式的实现细节,对于提升Java Web开发技能和解决问题具有很大帮助。同时,虽然Struts1已逐渐被更新的框架如Struts2和Spring MVC取代,但其设计...
通过分析提供的源码,可以更好地了解Struts2的工作流程,学习如何组织Action、Interceptor、配置文件等,从而提升开发能力。在实践中不断探索,可以逐步熟练运用Struts2进行高效、稳定的Web应用开发。
1. **ActionServlet**:这是Struts的核心控制器,它是Servlet的一个子类,负责接收HTTP请求,并根据配置文件(struts-config.xml)将请求转发到相应的Action。 2. **ActionForm**:ActionForm对象用于封装来自视...
- **web.xml**:这是Servlet容器的部署描述符,其中包含了Struts的初始化参数,如ActionServlet的配置等。 **核心组件**: - **ActionServlet**:这是Struts框架的入口点,继承自Servlet,负责解析请求,执行Action...
- **Controller控制器**:Struts 2的ActionServlet负责接收请求,根据配置调用相应的Action。 4. **Action上下文(ActionContext)** - 它是Struts 2中所有请求处理过程的上下文对象,保存了当前请求的相关信息,...