dwr源码解析,dwr深入学习

文章标签: dwr源码
2014-11-1 13:53:16     18 人阅读    

 最近正好用到dwr,用的时间长了就想知道它是怎么运行的,于是把我dwr的代码翻阅了一遍,收获不少,最大的收获就是dwr内部实现的IOC容器.简单、松耦合 dwr入口点:DwrServlet 一个标准的servlet,在期初始化的时候开始加载资源:会调用 init()方法

第一步:获取ioc容器,如果没有手动配置初始化容器的话 获取的是默认的ioc容器 DefaultContainer

 

tainer = ContainerUtil.createDefaultContainer(servletConfig);

//createDefaultContainer(servletConfig)方法 重点代码如下

String typeName = servletConfig.getInitParameter(Container.class.getName());

if (typeName == null)

{ //返回默认的ioc容器

return new DefaultContainer();

}

log.debug("Using alternate Container implementation: " + typeName);

Class type = LocalUtil.classForName(typeName);

return (DefaultContainer) type.newInstance();

 

第二步: 初始化刚才获取的ioc容器~~给ioc容器加载资源

ontainerUtil.setupDefaultContainer(container, servletConfig);

//--------setupDefaultContainer(container, servletConfig)

//给ioc容器初始化自己的资源

setupDefaults(container, servletConfig);

//给ioc容器初始化servletConfig的资源

setupFromServletConfig(container, servletConfig);

//初始化完成

container.setupFinished();

第三步: 初始化 WebContextBuilder 主要用来调用 servlet 的属性

webContextBuilder = StartupUtil.initWebContext(servletConfig, servletContext, container);

//----------initWebContext(servletConfig, servletContext, container)

//通过刚才初始化好的ioc容器 获取 webContextBuilder实例~~(通过反射创建对象..)

WebContextBuilder webContextBuilder = (WebContextBuilder) container.getBean(WebContextBuilder.class.getName());

//初始化 dwr上下文工厂~

WebContextFactory.setWebContextBuilder(webContextBuilder);

//把servlet的资源传递给 webContextBuilder(以便dwr使用servlet属性..资源)

webContextBuilder.set(null, null, servletConfig, servletContext, container);

return webContextBuilder;

第四不: 初始化 ServerContextBuilder

StartupUtil.initServerContext(servletConfig, servletContext, container);

//-------initServerContext(servletConfig, servletContext, container);

//ioc容器中 获取 ServerContextBuilder

ServerContextBuilder serverContextBuilder = (ServerContextBuilder) container.getBean(ServerContextBuilder.class.getName());

//把获取的ServerContextBuilder送给 ServerContextFactory

ServerContextFactory.setServerContextBuilder(serverContextBuilder);

//初始化serverContextBuilder的内容

serverContextBuilder.set(servletConfig, servletContext, container);

return serverContextBuilder;

第五步: 把dwr的信息放入 ServletContext servlet 上下文中 好像是为了过滤 访问地址用的~~~

ContainerUtil.prepareForWebContextFilter(servletContext, servletConfig, container, webContextBuilder, this);

//------prepareForWebContextFilter(ServletContext context, ServletConfig config, Container container, WebContextBuilder webContextBuilder, HttpServlet servlet)

context.setAttribute(Container.class.getName(), container);

context.setAttribute(WebContextBuilder.class.getName(), webContextBuilder);

context.setAttribute(ServletConfig.class.getName(), config);

context.setAttribute(HttpServlet.class.getName(), servlet);

六步:读取dwr配置文件

ContainerUtil.configureContainerFully(container, servletConfig);

//-----configureContainerFully(Container container, ServletConfig servletConfig) throws IOException, ParserConfigurationException, SAXException)

//读取dwr自带的配置文件

configureFromSystemDwrXml(container);

//读取web.xml中配置的属性~~ 比如 config,customConfigurator等

boolean foundConfig = configureFromInitParams(container, servletConfig);

// 检测有没有配置 skipDefaultConfig

boolean skip = Boolean.valueOf(servletConfig.getInitParameter(INIT_SKIP_DEFAULT)).booleanValue();

// 如果上面都没有配置

if (!foundConfig && !skip)

{

try

{ //读取 /WEB-INF/dwr.xml

configureFromDefaultDwrXml(container);

}

catch (IOException ex)

{

// This is fatal unless we are on JDK5+ AND using annotations

delayedIOException = ex;

}}

if (!configureFromAnnotations(container))

{

log.debug("Java5 AnnotationsConfigurator disabled");

if (delayedIOException != null)

{

throw delayedIOException;

}

}

第七步:大体上就是 servletContext.setAttribute("org.directwebremoting.ContainerList", ArrayList<Container>); 把容器放入servletContext 简称 发布容器

ContainerUtil.publishContainer(container, servletConfig);

//---------- doPost(request,response)方法 处理post请求

&nbsp;

//把访问的信息 传递给webContextBuilder 方便以后步骤调用

webContextBuilder.set(request, response, getServletConfig(), getServletContext(), container);

ServletLoggingOutput.setExecutionContext(this);

UrlProcessor processor = (UrlProcessor) container.getBean(UrlProcessor.class.getName());

processor.handle(request, response);


原文地址:http://www.itmmd.com/201411/101.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

wordpress CK and SyntaxHighlighter插件代码乱行   上一篇
下一篇  java Base64 加密解密算法

精彩回复
发表评论
姓名:       

《程序员app》专门为程序员量身定做!