- 浏览: 220409 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
狂盗一枝梅:
先 收 藏 了再说,struts2太复杂了
Struts2源码阅读(六)_ActionProxy&ActionInvocation -
jingwangfei:
Struts2源码阅读(二)_ActionContext及CleanUP Filter -
liguanqun811:
nbboy 写道"Dispatcher等都是通过Th ...
Struts2源码阅读(三)_Dispatcher&ConfigurationProvider -
nbboy:
"Dispatcher等都是通过ThreadLoca ...
Struts2源码阅读(三)_Dispatcher&ConfigurationProvider -
左脚穿右鞋:
请问我想在tomcat上做应该怎么配置?
JMS应用示例教程
接下来第三步:init_LegacyStrutsProperties()
调用的是调用的是LegacyPropertiesConfigurationProvider
通过比较前面DefaultPropertiesProvider与调用的是LegacyPropertiesConfigurationProvider.
发现DefaultPropertiesProvider继承自后者,但重写了register()方法,主要是生成PropertiesSetting的不同,前者是根据org/apache/struts2/default.properties
后者是根据struts.properties
我们展开register()中的Settings.getInstance(),最后是调用getDefaultInstance()
private static Settings getDefaultInstance() { if (defaultImpl == null) { // Create bootstrap implementation //不带参数的DefaultSettings(),区别与DefaultPropertiesProvider中直接带default.properties参数 //不带参数就是默认为struts.propertes,并且加载struts.custom.properties所定义的properties文件 defaultImpl = new DefaultSettings(); // Create default implementation try { //STRUTS_CONFIGURATION为:struts.configuration //在struts.proterties中查找struts.configuration的值,这个值必须是org.apache.struts2.config.Configuration接口的实现类 //所以我有个困惑就是在下面的转换当中怎么将Configuration转换成Setting类型的... //这一点先放下了,有时间再研究 String className = get(StrutsConstants.STRUTS_CONFIGURATION); if (!className.equals(defaultImpl.getClass().getName())) { try { // singleton instances shouldn't be built accessing request or session-specific context data defaultImpl = (Settings) ObjectFactory.getObjectFactory().buildBean(Thread.currentThread().getContextClassLoader().loadClass(className), null); } catch (Exception e) { LOG.error("Settings: Could not instantiate the struts.configuration object, substituting the default implementation.", e); } } } catch (IllegalArgumentException ex) { // ignore
在2.1.6中去掉了第四步:init_ZeroConfiguration();
第五步是自定义的configProviders
private void init_CustomConfigurationProviders() { //从这里可以看到可以将自定义的Provider定义在web.xml中FilterDispatcher的param中:configProviders String configProvs = initParams.get("configProviders"); if (configProvs != null) { String[] classes = configProvs.split("\\s*[,]\\s*"); for (String cname : classes) { try { Class cls = ClassLoaderUtils.loadClass(cname, this.getClass()); ConfigurationProvider prov = (ConfigurationProvider)cls.newInstance(); configurationManager.addConfigurationProvider(prov); } ... } } }
第六步:init_FilterInitParameters
//从这里可以看出struts.properties中的属性不仅可以在struts.xml中以constant形式定义,而且可以在FilterDispatcher的param中定义 private void init_FilterInitParameters() { configurationManager.addConfigurationProvider(new ConfigurationProvider() { public void destroy() {} public void init(Configuration configuration) throws ConfigurationException {} public void loadPackages() throws ConfigurationException {} public boolean needsReload() { return false; } public void register(ContainerBuilder builder, LocatableProperties props) throws ConfigurationException { props.putAll(initParams);//在这里实现滴~ } }); }
第七步:init_AliasStandardObjects,使用BeanSelectionProvider
这是将配置文件中定义的<bean>与实际的类相映射,就是注入bean的依赖关系,这部分以后有时候再研究Container
接下来是看怎样调用这些ConfigurationProviders
展开init_PreloadConfiguration()
private Container init_PreloadConfiguration() { Configuration config = configurationManager.getConfiguration(); Container container = config.getContainer(); boolean reloadi18n = Boolean.valueOf(container.getInstance(String.class, StrutsConstants.STRUTS_I18N_RELOAD)); LocalizedTextUtil.setReloadBundles(reloadi18n); return container; } //再看getConfiguration() public synchronized Configuration getConfiguration() { if (configuration == null) { setConfiguration(new DefaultConfiguration(defaultFrameworkBeanName)); try { //重点就是这个reloadContainer configuration.reloadContainer(getContainerProviders()); } catch (ConfigurationException e) { setConfiguration(null); throw new ConfigurationException("Unable to load configuration.", e); } } else { conditionalReload(); } return configuration; }
展开DefaultConfiguration中的reloadContainer
public synchronized List<PackageProvider> reloadContainer(List<ContainerProvider> providers) throws ConfigurationException { packageContexts.clear(); loadedFileNames.clear(); List<PackageProvider> packageProviders = new ArrayList<PackageProvider>(); //Struts2(xwork2)用Container来完成依赖注入的功能 //首先初始化一个ContainerBuilder,再由builder来保存接口与实现类或工厂类的对应关系 //然后通过builder.create(boolean)方法产生container //由container.getInstance(Class);就可以得到接口的实现实例了 //这一部分比较复杂,后面研究完成了,会单独拿出来讲,这里先弄清楚Xwork依赖注入的实现步骤就可以了 ContainerProperties props = new ContainerProperties(); ContainerBuilder builder = new ContainerBuilder(); for (final ContainerProvider containerProvider : providers) { //循环调用ConfigurationProvider的init和register方法,明白了吧,在这里统一循环调用 containerProvider.init(this); containerProvider.register(builder, props); } props.setConstants(builder); //注入依赖关系,在这里并不产生实例 builder.factory(Configuration.class, new Factory<Configuration>() { public Configuration create(Context context) throws Exception { return DefaultConfiguration.this; } }); ActionContext oldContext = ActionContext.getContext(); try { // Set the bootstrap container for the purposes of factory creation Container bootstrap = createBootstrapContainer(); setContext(bootstrap); //create已经注入依赖关系的Container container = builder.create(false); setContext(container); objectFactory = container.getInstance(ObjectFactory.class); // Process the configuration providers first for (final ContainerProvider containerProvider : providers) { if (containerProvider instanceof PackageProvider) { container.inject(containerProvider); //调用PackageProvider的loadPackages()方法,这里主要是针对XmlConfigurationProvider和StrutsXmlConfigurationProvider ((PackageProvider)containerProvider).loadPackages(); packageProviders.add((PackageProvider)containerProvider); } } // Then process any package providers from the plugins Set<String> packageProviderNames = container.getInstanceNames(PackageProvider.class); if (packageProviderNames != null) { for (String name : packageProviderNames) { PackageProvider provider = container.getInstance(PackageProvider.class, name); provider.init(this); provider.loadPackages(); packageProviders.add(provider); } } rebuildRuntimeConfiguration(); } finally { if (oldContext == null) { ActionContext.setContext(null); } } return packageProviders; }
发表评论
-
Struts2源码阅读(六)_ActionProxy&ActionInvocation
2009-10-23 22:04 9925下面开始讲一下主菜ActionProxy了.在这之前最好先去了 ... -
Struts2源码阅读(五)_FilterDispatcher核心控制器
2009-10-22 20:55 4638Dispatcher已经在之前讲过,这就好办了。FilterD ... -
Struts2源码阅读(三)_Dispatcher&ConfigurationProvider
2009-10-19 21:04 5111首先强调一下struts2的线 ... -
Struts2源码阅读(二)_ActionContext及CleanUP Filter
2009-10-16 16:58 54881. ActionContext ActionContex ... -
Struts2源码阅读(一)_Struts2框架流程概述
2009-10-16 15:25 53201. Struts2架构图 请求首先通过Filter ... -
Struts2中文教程电子书下载
2009-10-16 14:57 4682Struts2中文程程电子书下载 -
在Struts 2.0中国际化(i18n)你的应用程序
2009-10-09 09:29 1411国际化是商业系统中不可或缺的一部分,所以无论您学习的是什么We ... -
OGNL中的#,%,$
2009-10-09 09:14 1349OGNL的用法 OGNL是通常要结合Struts 2的标志 ... -
ValueStack 与 OGNL
2009-10-08 12:53 1923ValueStack 与 OGNL 值栈的含义正如它的名字所 ... -
Struts2 Tags API
2009-10-08 10:57 2770本来想写一篇Struts2 标签的,今天突然得到一份Strut ... -
Struts2 references
2009-10-08 10:22 911Struts2 Guide Home:http://strut ... -
struts.xml配置详解
2009-10-08 09:01 1427<?xml version="1.0" ... -
Struts1与Struts2的特点与比较
2009-10-06 10:57 4203一.MVC的特点:— 多个视图可以对应一个模型。按MVC设计模 ... -
struts.properties详解
2009-10-05 20:49 1139项目中常用的配置如下 struts.objectFactor ... -
Struts2+Spring2.5 web.xml配置
2009-10-05 20:44 2239搭建struts2框架只必需五个jar包:commons-lo ... -
Struts2 源码分析
2009-09-22 19:33 0http://blog.csdn.net/hanxs/arch ...
相关推荐
struts.xml文件中新增以下内容: <!-- 为修复struts2 s2-016、s2-017...struts2_s2-016&017_patch.jar拷贝到lib目录下。 ognl-2.6.11.jar直接覆盖掉原有文件。 使用工具进行测试漏洞是否依然存在。 2013年7月25日
<result name="upload" type="dispatcher"> /index.jsp return "upload"; 开始我这里没有返回值,直接return null,以为它是ajax异步请求,不需要返回到某个页面,最后也导致页面显示:HTTP ERROR! 如果还是...
<package name="struts2" extends="struts-default"> <result name="add_success" type="redirect">/common/pub_add_success.jsp <result name="del_success" type="redirect">/common/pub_del_success...
资源来自pypi官网。 资源全名:faraday_agent_dispatcher-2.1.1-py2.py3-none-any.whl
主要介绍了Zend Framework教程之分发器Zend_Controller_Dispatcher用法,结合实例形式详细分析了分发器Zend_Controller_Dispatcher的结构,功能,使用技巧与相关注意事项,需要的朋友可以参考下
event_dispatcher event_dispatcher gem 提供了一个简单的观察者实现,允许您以简单有效的方式订阅和侦听应用程序中的事件。 它受到强烈启发 安装 安装宝石: gem install event_dispatcher 访问宝石: ...
要安装启动所有工作程序的queue_worker_dispatcher脚本,请执行以下rake命令: rake queue_dispatcher: sync 数据库设置 用 rails g queue_dispatcher: migration 这将为模型Task和TaskQueues创建数据库迁移。 ...
Struts2源码分析 请求首先通过Filter chain,Filter 主要包括ActionContextCleanUp,它主要清理当前线 程的ActionContext 和Dispatcher;FilterDispatcher 主要通过AcionMapper 来决定需要调用哪 个Action。
org.apache.struts2.dispatcher.FilterDispatcher
at org.apache.struts2.dispatcher.Dispatcher.cleanUpRequest(Dispatcher.java:837) at org.apache.struts2.dispatcher.ng.PrepareOperations.cleanupRequest(PrepareOperations.java:103) at org.apache.struts2....
SGDMA包含以下特性: l 根据描述符进行中断使能 l 包传输长度限制 l 视频帧缓冲驻留 l 不对齐存储器访问 l 静态和可编程突发处理 l 数据位宽高达1024-bit l 独立的收发描述符缓冲 l 支持64-bit地址 (必须使用 Qsys ...
org.apache.struts2.dispatcher.ServletActionRedirectResult 16 plainText 16 显示源文件内容,如文件源码 16 org.apache.struts2.dispatcher.PlainTextResult 16 freemarker 16 处理FreeMarker模板 16 org.apache....
LteSocketServerChannel:lte_socket_dispatcher原始码
本书是广受赞誉的Struts 2优秀教程,它全面而深入地阐述了Struts 2的各个特性,并指导开发人员如何根据遇到的问题对症下药,选择使用最合适的特性。作者处处从实战出发,在丰富的示例中直观地探讨了许多实用的技术,...
MirrorDispatcher通过使用[dart:mirrors]内省类实例来实现[Dispatcher]。 dart:mirrors允许您通过实例的字符串名称来调用它们的方法。 用类实例构造一个[MirrorDispatcher]。 MirrorDispatcher.dispatch(“ ...
ReflectorDispatcher通过使用[package:reflectable]内省一个类实例来实现[Dispatcher]。 package:reflectable允许您通过实例的字符串名称来调用它们的方法。 使用类实例及其在根据Reflectable中的指示进行创建时...
Apache的Struts2框架最近出了一个很严重的漏洞,可以直接执行系统命令 http://www.163.com?%28%27\u0023_memberAccess[\%27allowStaticMethodAccess\%27]%27%29%28meh%29=true&%28aaa%29%28%28%27\u0023context[\%27...
thread_dispatcher:STA调度员