第四章 掌握View 第一节 简介
时间:2007-04-12 来源:xiaoshengcaicai
现在我们应该知道controller的编写方法了, 这一章我们将开始介绍View.
在MVC模式里面, View可以有多个,它指的是数据的外在表现.
假设我们系统里面有3个View:
ViewA: 负责把数据填到HTML里面生成HTML代码
ViewB: 负责把数据写到图片文件中从而生成一张含有数据的图片
ViewC: 负责处理数据从而生成PDF文件.
那么一样的数据, 它经过ViewA表现出来的话它就是一张网页, 它通过ViewB表现出来那么就是一张图片,它通过ViewC表现出来就是一个PDF文件.
一般的Catalyst 项目, 都至少有一个View专门负责网页的HTML代码生成.
假设我们在项目里面添加一个View, 它名字叫MyView,那么它的模块名就是X::View::MyView, 它必须从Catalyst::View这个模块继承, 这样它才是一个有效的Catalyst组件. 这样我们就可以通过$c->view('MyView')来得到X::View::MyView 这个组件.
当我们在action里面编写这样的代码:
$c->forward('View::MyView');
程序就会跳转到X::View::V这个组件的Process方法里面, 所以,我们要定义这个组件的Process方法.
下面我们演示如何创建一个View以及如何在Controller里面使用这个View.
首先先在script文件夹下, 执行:
perl x_create.pl View MyView
这样就会自动创建模块X::View::MyView, 然后在该模块下编写一个process 方法:
sub process { |
这个process方法就是从$c->stash->{data}里面得到一个字符串,然后把这个字符串渲染成红色, 最后把HTML代码写到响应的内容里面,同时设置一下响应的头部.
然后我们在Controller里面这样写:
package X::Controller::A;
sub list : Local {
1; |
当用户访问a/list时, list这个action 会往stash里面存放一个字符串'list',接着Catalyst会调用最近的end action,这个action里面forward到了MyView,于是调用了MyView的process函数进行处理,最后页面上看到一个红色的'list'字符串,
同理,如果用户访问a/list2,页面上可以看到一个红色的'list2'字符串.
那么到这里为止,你已经了解了一个最简单的View的工作原理.
在大多数情况下, 我们并不会像例子这样自己从头写一个View, 因为如果你要把数据渲染到HTML代码里面的话,CPAN已经有非常多的模块做这些工作,我们没必要重新发明轮子. 所以我们一般是定义一个View,然后这个View里面use 一个CPAN上的模块, 然后在process里面调用CPAN该模块的方法生成HTML代码即可.
所以, 从这种意义上, 在Catalyst里面,View只是一个接口而已.
CPAN有一套功能强大的模块: Template::Toolkit(简称TT),它可以做把数据渲染到HTML里面的工作, 而且, 已经有人为TT写了一个Catalsyt::View::TT, 我们只需要把这个Catalsyt::View::TT直接拿来用即可, 如果你觉得Catalsyt::View::TT 这个名字不爽, 你可以自己写一个Catalsyt::View::MyTT,只要它是从 Catalsyt::View::TT继承即可,你无需编写其他代码.
下面一节我们将开始介绍TT的使用.