[风雨者]

山高路远,风雨兼程!

伍维波ID:letsflytogether
80192次访问,排名1175好友8人,关注者90
一个非计算机专业毕业的,带着对计算机的热爱,如今从事在软件开发领域。我想,我已经证明了专业不应是我们就业的标尺。
除了软件开发,我的爱好还有篮球和美食。
letsflytogether的文章
原创 67 篇
翻译 0 篇
转载 58 篇
评论 115 篇
伍子的公告
    没有比人更高的山,
    没有比脚更长的路。
------------------------
    既然选择了远方,
    便只顾风雨兼程。
------------------------
    失败只有一种,
    就是半途而废。
------------------------
    天下难事必作于易,
    天下大事必作于细。
------------------------
    从用户的角度考虑,
    你就成功了一半。
------------------------
月 [下月] [上月]
最近评论
cqg1220:机柜
badonly:原来模板技术是这样的!!!谢了~~~
apollosun:恭喜啊

女儿就是宝,享福了啊

我女儿现在虚岁4岁,太可爱了,我每天下班回家的感觉就象过节。
letsflytogether:phpMVC是我两三年前接触的一个框架,为什么我选择它呢,是因为当时我首先接触了JAVA的Struts,学起来很好理解.但是如今我发现这个框架用起来稍嫌烦琐,代码更新也挺慢的.PHP语言同类型的框架还有cakePHP,ZendFramework,Symfony等,它们的发展都挺好的,而已有些是原生就支持ajax,你可以看看这些框架.其实框架是次要,最重要的还是思想.只不过有些时候思想过于抽象……
tjbaso:我暂时先把MVC搞定,接着就去弄XAJAX,天津用PHP的很少,可能还是去北京闯闯了,你的文章对我们来说是很有价值的。谢谢你。
文章分类
收藏
相册
个人风采
精品收藏
文章贴图
个人网站
女儿的博客
我在ITPUB上的博客
我在世界经理人上的博客
技术网站
CSDN
MSDN
UML软件工程组织
中国UI设计网
蓝色理想
软件工程专家网
休闲娱乐
学习网站
ICXO
网页设计师
金桥译港世界通
友情链接
heiyeluren的Blog(RSS)
博客中国上的琴剑楼
小肥羊
汉博园——陈希成
韦子的空中楼阁
资源网站
中国盟动力
太平洋电脑网
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 php.MVC系列教程之控制器收藏

新一篇: 用HTC来实现列表提示框 | 旧一篇: php.MVC系统教程之配置文件

        控制器(Controller)由一些类组成,根据预先定义的配置选项处理用户请求。一个典型的用户请求如下:
http://www.myhost.com/mycompany/Main.php?do=salesReport.

        php.MVC 控制器由两部分组成:前端控制器和控制器。当请求到来时,前端控制器负责安装应用程序,控制器则根据phpmvc-config.xml的配置属性处理请求。

        图6显示了前端控制器的主要任务。
       
                                                                  图6

        用户请求被Main.php文件接收,这里,将设置一些初始化参数。前端控制器将执行以下任务:

  • 定义应用程序路径:这将指定php.MVC类库以及Web应用程序的路径,如下:
    $appServerRootDir = 'C:/WWW/phpmvc-base';
    $moduleRootDir    = 'C:/WWW/mycompany';
  • 定义应用程序的ActionDispatcher:我们通常需要扩展框架ActionDispatcher来定义自己的Dispatcher类:
    $actionDispatcher = 'MyActionDispatcher';
  • 初始化应用程序类路径:为了将类和资源装入,前端控制器将导入预先定义的全局路径以及应用程序路径。我们可以在/WEB-INF/ModulePaths.php中设置路径,如下:
    $appDirs = array();
    ...
    $appDirs = 'WEB-INF/report_tpl';
    $appDirs = 'WEB-INF/report_classes';
  • 包含应用程序类:前端控制器将导入它所需要的类文件,我们也可以用/WEB-INF/prepend.php文件来有选择性地导入一些特殊的应用程序类文件。如下:
    include_once './WEB-INF/mytools/MyTools.php';
  • 配置应用程序:前端控制器将为应用程序设置配置信息,比如我们先前定义的ActionDispatcher。
  • 初始化控制器:前端控制器现在将创建一个应用服务器实例(ActionServer)。
  • 导入配置信息:前端控制器现在将导入应用程序配置信息,假如phpmvc-config.xml从最后一次请求后被修改了,phpmvc-config.xml文件将被重新处理并将数据缓存到/WEB-INF/phpmvc-config.data中。
  • 初始化HTTP请求:前端控制器现在将设置HTTP请求并添加请求属性。
  • 调用应用程序控制器:前端控制器现在已经完成了准备工作,将会把处理权交给控制器。

        控制器接收从前端控制器传来的请求,根据配置属性执行一系列操作。

        图7描述了php.MVC控制器的任务。
       
                                                         图7

  • 处理action路径:控制器将根据请求路径识别出关键字,选择一个action映射。比如请求路径为:
    http://www.myhost.com/mycompany/Main.php?do=salesReport, action路径就为salesReport。
  • 处理现场:根据需要为当前用户选择一个Locale
  • 处理内容格式:根据需要设置内容格式,默认为text/html。
  • 处理不缓存:根据需要设置不缓存头信息,默认为:
    "Pragma", "No-cache"
    "Cache-Control", "no-cache"
    "Expires", 1
  • 处理预处理任务:可以在自定义的ActionServer子类中覆盖这个方法,执行一些指定的预处理任务。
  • 处理Action映射:控制器将根据请求识别action映射,根据phpmvc-config.xml的相应节点生成action映射对象(ActionConfig),比如:<action path = "salesReport" .../>。
  • 处理角色:检查能执行这个action的所有必须的认证。
  • 处理ActionForm:控制器将根据action映射找到相关联的ActionForm,form-bean就是由action的name属性指定,比如:
    <action ... name = "salesReportForm" .../>。
  • 处理Populate:根据请求参数设置ActionForm实例的属性。
  • 验证ActionForm:根据action的validate属性值如:<action validate = "true" .../>,决定是否调用ActionForm的validate()方法。如果validate()返回False(验证失败),控制器将用action中input属性所指定的显示资源(模板)显示错误,比如:  
            <action path = "salesReport"
               ...
            validate = "true"
            input = reportsIndex.tpl>

    假如validate()返回True(验证通过),则将继续处理。处理Forward:控制器检查forward映射的URI是否正常,如果是,继续处理。
  • 处理Include:控制器检查include映射的URI是否正常,如果是,继续处理。
  • 处理Action创建:控制器将创建或获取Action实例来处理这个请求,这是用action的type属性来定义的,比如:
               <action path = "salesReport"
                type = "SalesReportAction"
               ...
  • 处理Action执行:控制器现在将调用Action类的execute()方法,比如SalesReportAction->execute(...)。在该方法内,我们将调用业务处理逻辑类。
  • 处理Action链:控制器将检查是否还有另外一个Action需要处理,在应用程序配置文件中,我们通过ActionChain能定义一系列Action,为了定义ActionChain,需要为action节点的forward元素添加一个nextActionPath属性,比如:
           <action path = "salesReport"
            type = "SalesReportAction"
            ...
           <forward
               name = "salesReportSuccess"
               path = "salesReport.tpl"
               nextActionPath = "salesReport2"/>
            ...
  • forward元素的path属性是必须项,假如这个特殊的Action没有输出,我们可以设置path = ""。
  • 处理Action Forward:控制器将转发或重定向到指定的资源,一个forward请求在当前处理器中被处理。RequestProcessor只是把控制权交给ActionDispatcher,那里包含了指定的URI模板。比如:
        <forward
        name="forward_path
        path="forwardRequest"
        redirect="false"/>
  • 重定向请求实际是发送给客户端浏览器一个标头响应,然后重定向到一个新的URL。在发送重定向标头信息时当前的处理将立即终止。
    <!-- This server -->
    <forward
        name="redirect_path
        path="/MyApp/Main.php?do=newRequest"
        redirect="true"/><!-- This server, or a remote server -->
    <forward
        name="redirect_path
        path="
    http://www.myhost.com/MyApp/Main.php?do=newRequest"
        redirect="true"/>

        假如没有其他的Action需要处理,控制器处理结束。

发表于 @ 2004年10月27日 19:24:00|评论(loading...)|编辑

新一篇: 用HTC来实现列表提示框 | 旧一篇: php.MVC系统教程之配置文件

评论:没有评论。

发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © 伍子