热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我记录网站综合系统技术原理解析[6:内容初始化处理]

源代码位置:\Web\Mvc\Processors:InitContextProcessor.csConfig-wojilu.Web.Mvc.Core


源代码位置:\Web\Mvc\Processors: InitContextProcessor.cs
Config ->

    wojilu.Web.Mvc.CoreHandler.ProcessRequest - >

          wojilu.Web.Mvc.CoreHandler.ProcessRequest: ProcessContext.Begin ->

               RouteProcess
                    InitContextProcess

上次我们说到了wojilu的路由系统,这次我们看看路由处理的下一步,内容初始化处理:

       还记得一开始所说的,wojilu对于每一个请求,会将和这个请求有关的东西都放在一个ProcessContext里面。这个ProcessContext的内容随着处理过程而变更和增加。例如在路由处理结束后,路由的信息就被加入了这个ProcessContext里面了。这次介绍的InitContextProcess就是对ProcessContext的一个初始化。

     这个处理的流程和其他处理流程一样,首先发一个系统广播,告诉侦听者InitContextProcessor被启动了,你可以在这里做一些过滤动作。

 

接下来,这里首次使用了IOC系统,每个系统对于初始化可能有自己的方法,这里使用wojilu的IOC系统加载一个
"contextInit"。当然,如果没有"contextInit",则使用一个默认的的ContextInitor。

 

 1     internal class InitContextProcessor : ProcessorBase {
 2 
 3         public override void Process( ProcessContext context ) {
 4 
 5             MvcEventPublisher.Instance.BeginInitContext( context.ctx );
 6             if (context.ctx.utils.isSkipCurrentProcessor()) return;
 7 
 8             MvcContext ctx = context.ctx;
 9 
10             ContextInitBase initor = getContextInit();
11 
12             initor.InitViewer( ctx );       // 初始化当前登录用户(访问者) 
13             initor.InitOwner( ctx );       // 初始化当前被访问对象(site或group或user)
14             initor.InitController( ctx );  // 初始化控制器
15             initor.InitPermission( ctx ); // 初始化权限检查
16             initor.InitApp( ctx );                 // 初始化当前app
17         }
18 
19         private ContextInitBase getContextInit() {
20             ContextInitBase initor = ObjectContext.GetByName( "contextInit" ) as ContextInitBase;
21             if (initor == nullreturn new ContextInitDefault();
22             return initor;
23         }
24 
25     }

 这个默认的内容初始化的代码里面,对于无效的Controller进行了过滤:

 

 1         /// 
 2         /// 初始化当前 controller
 3         /// 

 4         /// 
 5         public virtual void InitController( MvcContext ctx ) {
 6             ControllerBase controller = ControllerFactory.InitController( ctx );
 7             if (controller == null) {
 8                 String typeName = ctx.route.getControllerNameWithoutRootNamespace();
 9                 String msg = lang.get"exControllerNotExist" ) + "" + typeName;
10                 throw ctx.ex( HttpStatus.NotFound_404, msg );
11             }
12 
13             ctx.utils.setController( controller );
14         }

从上一步的路由信息中获得的信息在这里第一次使用,如果路由中的controller不可用的话,这里直接抛出一个404页面找不到的错误,Process流程将在这里终止。

如果Controller是合法的话,这里的ProcessContext将被增加新的内容:Controller的信息。

Context内容:

      路由信息(RouteProcess) 

Controller信息(InitContextProcess)

 

打开wojilu\Web\Mvc:ControllerFactory.cs 看看InitController的代码吧。

 1         /// 
 2         /// 根据当前上下文中的路由,创建相应的controller
 3         /// 

 4         /// 
 5         /// 
 6         public static ControllerBase InitController( MvcContext ctx ) {
 7 
 8             Route route = ctx.route;
 9 
10             List<String> rootNamespaceList &#61; MvcConfig.Instance.RootNamespace;
11 
12             foreach (String rootNamespace in rootNamespaceList) {
13                 route.setRootNamespace( rootNamespace );
14                 String typeName &#61; route.getControllerFullName();
15                 logger.Debug( "init contrller type&#61;" &#43; typeName );
16 
17                 ControllerBase controller &#61; FindController( typeName, ctx );
18                 if (controller !&#61; nullreturn controller;
19             }
20             return null;
21         }

第一步&#xff0c;拿出ctx里面的Route信息

第二步&#xff0c;通过反射的方法取得MVC系统里面的所有RootNameSpace。

这里的代码有一些不太爽的地方&#xff0c;这里先对RootNameSpace设定了值&#xff0c;然后获得了Controller的类型名称&#xff0c;然后去寻找Controller。如果找不到的话&#xff0c;继续对RootNameSpace设定值。。。。这里的问题是getControllerFull是route的方法&#xff0c;这样的话&#xff0c;必须每次都设定rootns&#xff0c;然后才能获得typeName。我觉得应该给getControllerFullName加一个参数。这样的话&#xff0c;只有在FindController成功的时候才setRootNamespace。可能因为更加深层次的关系作者要这么写。不过对于反复setRootNamespace总归有些纠结。。。

 

到此为止&#xff0c;我们的上下文里面有了Route和Controller信息了&#xff0c;差不多要去访问一下Controller了。 

这一节的实际使用方法不是非常明显&#xff0c;估计没有特别的理由不会去自定义一个ContextInitor。

 

注意&#xff1a;官网将Context翻译为上下文

wojilu的1.7正式版将在近期正式Release&#xff0c;敬请期待。

我记录网址 http://www.wojilu.com/

欢迎大家加入我记录开发团队

 

 

转:https://www.cnblogs.com/TextEditor/archive/2011/06/15/2080770.html



推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了Sencha Touch的学习使用心得,主要包括搭建项目框架的过程。作者强调了使用MVC模式的重要性,并提供了一个干净的引用示例。文章还介绍了Index.html页面的作用,以及如何通过链接样式表来改变全局风格。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
author-avatar
嗯呢
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有