Skip navigation.

永远的亚特兰缔斯

To record my thinking and study note

理解MVC(转)

原始出处:http://www.phpx.com/happy/thread-120145-1-1.html

作者:臭p孩儿

可能刚接触面向对象(OOP)编程的兄弟对MVC模型一直是那种可遇而不可求的心态,当听老鸟们在那满天吐沫星子的谈论MVC模型的这个好那个好,自己只有瞪着俩眼珠子在那傻傻的听着,或许听完了还不知道是怎么回事,下面就小弟的一些拙见来帮助这些兄弟们理解一下到底MVC是咋回事。。。

那到底啥是MVC设计模式呢?
MVC (Model-View-Controller)模式,即模型-试图-控制器模式,其核心思想是将整个程序代码分成相对独立而又能协同工作的3个组成部分,具体的功能如下:
模型(Model): 业务逻辑层。实现具体的业务逻辑、状态管理的功能。
视图(View):表示层。就是与用户实现交互的页面,通常实现数据的输入和输出功能。
控制器(Controller):控制层。起到控制整个业务流程的作用,实现View层跟Model层的协同工作。

看到这儿,可能有些兄弟已经皱眉头了,心里在不住地说“操,你整这玩应也太抽象了,要是能看懂你这个,那书上写的我也能看懂了,你要是想玩死我,你Y就早说!!~~”,嘿嘿,别着急,下面我就举个实际的例子来帮助大家继续理解。

这个MVC设计模式呢,有点像现实中我们去饭店吃饭的过程。当你到一个饭店吃饭,过程是这样的,首先你得点菜啊,不用喊,一个光溜水滑,埋了八汰的小服务员就会整个小本来你面前,“先生,你来点啥?”,你看看菜谱,“给我整个小盘鱼香肉丝,再加一碗米饭。”“好的,先生稍等。”说着服务员一溜小跑朝后厨方向,“那啥。。。告诉厨师别放姜啊!~~”。。。带会儿,服务员就把你要的饭菜给你端上来了,“先生请慢用~~有啥需要帮忙的,尽管喊我。”你吃的狼吞虎咽的,根本不知道里面放的青椒妈的都没洗~~~

就这么一个简单的你要饭的过程就可以用MVC将其描述一下,你呢就相当于View,服务员呢就相当于Controller,而那个不洗青椒的该死厨师就是 Model。你一开始跟服务员点菜,就相当于我们的浏览器向服务器发出请求,服务员将你要吃的菜交给后厨的师傅,就相当于控制层将浏览器发过来的请求交给业务逻辑层来处理,而它根本不管厨师到底咋做这个菜,反正你能给我鼓捣出一盘鱼香肉丝就成,青椒洗不洗那是他的事,这也就是我们常从老鸟口中听到的“封装”,封装好啊,封的你连青椒没洗的鱼香肉丝都能吃的喷香,嘻嘻~~当服务员把一盘冒着热气的鱼香肉丝端到你面前的过程,就相当于业务逻辑层处理完后把相应传回给浏览器,然后通过浏览器显示给用户。这样就实现了一个简单的MVC协调交互,也不知道你明白点没有。。。

可能有的兄弟又要说了,“你讲MVC你就讲呗,整啥点菜啊,我昨天才吃的鱼香肉丝,现在都有点想吐啦!!讨厌~~~”,下面就给兄弟们说说在实际项目中应该咋应用这MVC。

就拿一个简单的登陆模块说,需求是你输入一个用户名、密码,如果输入的跟预先定义好的一样,那么就进入到正确页面,如果不一样,就提示个错误信息“你Y别在这儿蒙我,输入的不对!”。

这个小小的模块中,起始的输入用户名密码的页面跟经过校验后显示的页面就相当于View,而这里还需要一个controller页面,就是用于接收输入进来的用户名密码,还有经过校验后返回的一个flg(此flg就是用于判断你输入的是否正确,而跳转到相应的页面的),最后还缺一个Model,那么就是你那个用于校验的类了,他就是处理你输入的是否跟预先订好的一样不一样的,之后返回一个flg。这样就完全实现了逻辑跟页面的分离,我页面不管你咋整,反正我就一个显示,而controller呢也不管你Model咋判断对不对,反正我给你了用户名跟密码,你就得给我整回来一个flg来,就跟服务员根本不管厨师青椒洗不洗一样,而Medol呢,则是反正你敢给我个用户名跟密码,我就给你整过去个flg~~如果看到这你有点茅塞顿开了,待会就试验着写写吧!!

以上就是小弟的一些不成熟的理解,也是小弟对MVC设计模式理解的一些心得吧,可能有些地方不够准确,也欢迎老鸟们批评指正,衷心的希望这篇小文儿能对刚刚接触MVC兄弟有所帮助!!

注:这里没有提到到底是用java还是php,也没有实际的代码例子,我想只要真正理解了这个过程,代码上应该不成问题地~~

作者:gh520

现在在开发WEB应用的时候,比较流行的一种做法就是使用“MVC”结构,使用如此方式去开发WEB应用程序,逻辑性强、简浩明了,使程序设计起来更加方便,快捷。何为“MVC”呢?简单的来说,它就是“模型(Model)”、“视图(View)”及“控制器(Controller)”的结合体,也就是所有的“三层”抽象结构,当然这里所说的“MVC”是针对WEB上应用而言的,“使代码和页面设计分开”便是其主导思想,这一思想在使用Java Servlet/JavaServer Pages技术的“Struts”中表现的淋漓尽致,有兴趣的可以去http://jakarta.apache.org/struts看看,这种设计模式使的程序设计人员可以专注于代码的设计、编写及调试,网页设计人员可以有更多的时间去投入设计而不用理会具体的功能实现,这种分工方式完全适应大型项目或企业级的分布式应用开发。


从PHP5的推出可以看到,其中的面向对象功能越来越完善,使用PHP来开发大型的商业网站或者分布式企业应用已经成为可能,如果再结合Zend Optimizer,已经实现了代码的封装性。


如何在PHP中使用“MVC”设计模式去开发WEB应用呢?记住一点(代码和页面设计分开),用一个简单的例子演示一下,比如要从数据库中查询出会员的资料以显示在网页上,这里就需要考虑到两点:1.连接数据库并取出会员资料,2.把会员资料显示在网页上,连接数据库我们使用一个数据库的类,把它叫做“DB”类吧,这个类此时就扮演了“模型(Model)”的角色,接着我们需要编写一个操作“DB”类的程序以取出数据,这个程序所扮演的角色就是“控制器(Controller)”,它接受客户端“POST”或“PUT”的数据,然后再调用“DB”类以取出数据,把这些数据都存放在“控制器(Controller)”中,最后把数据传递给“视图(View)”并按照一定的排版格式显示出来,从上面的分析可以看出,模板在这里就是扮演了“视图(View)”的角色,当然仅仅一个模板类是不能说成是MVC的,真正的MVC不是这么简单的,具体可以参考一下“JSF”。

常用版本控制软件简介(转)

转载自:http://www.chinaunix.net/jh/28/272002.html
作者:sql2000

常用版本控制软件

根据查看网络上的资料,看到一般的公司使用的版本控制软件大致如下:

(其中的等级评语来自http://www.hansky.com/cn/news/select_scm3.html 但其中没有介绍关于Perforce,StarTeam)

1.Clear case --------〉中坚级
2.CVS --------〉开源奇葩
3.Visual SourceSafe --------〉入门级
4.PVCS --------〉小工作组级
5 Perforce --------〉
6.CCC --------〉元老级
7.StarTeam --------〉
8.RCS --------〉元老级
9.SCCS --------〉元老级
10.Hansky Firefly --------〉新秀级
11.SubVersion --->CVS改进版本
12.Others(还有一些比较少见或某个公司专用的软件,如Seapine,北大青鸟的JBCM等)


1.Clearcase是Rational公司(2003年被IBM收购)的一款重量级的软件配置管理(SCM Software Configuration Managemen)工具。不同于CVS和VSS,Clearcase涵盖的范围包括:版本控制、建立管理、工作空间管理和过程控制。从最初的软件配置计划,到配置项的确立,从变更控制到版本控制,它贯穿于整个软件生命周期。 ClearCase支持现有的绝大多数操作系统。ClearCase 安装、配置、使用相对较复杂,需要进行团队培训。

2. CVS 是Concurrent Versions System 的缩写,它是开放源代码软件世界的一个伟大杰作,由于其简单易用、功能强大,跨平台,支持并发版本控制,而且免费,它在全球中小型软件企业中得到了广泛使用。其最大的遗憾就是缺少相应的技术支持,许多问题的解决需要自已寻找资料,甚至是读源代码。CVS是一个典型的Server/Client端软件,有UNIX版本的CVS 、Linux版本的CVS,和WINDOWS版本的CVS,在下载的软件包中已经包含了Server端和Client端,但是因为我们在工作中一般都是使用Windows操作系统,所以我们可以再下载一个Windows下CVS的Client端软件WinCVS。在以下网站可以获取最新版本的CVS。http://www.cvshome.org。CVS支持远程管理,项目组分布开发时用CVS。

3.VSS微软的产品。简单好用,局域网中用VSS。用于Team级还可以,企业级不好。仅支持Windows 操作系统。

4.PVCS MERANT 公司的核心产品PVCS,PVCS的最新版PVCS8.0。在PVCS8.0中,过程支持的功能与PVCS进行了集成。看到网上对它的介绍不多,据说曾经赠送给国内很多大的机构使用。主要功能:软件配置管理;问题管理;过程控制与自动化, 帮助软件开发组织自动提高软件产品质量。

5.Perforce是美国perforce软件公司的软件配置产品家族,其特点是易用性强,速度快。主要特性【smchina.net 观点 】: 安装、配置和管理非常简单,安装过程几分钟就可以搞定 ;基于TCP/IP的客户服务器架构,不依赖于其他网络协议如NFS等 ;采用流式传输协议提高传输效率 ;易用,命令行客户端容易上手 ;文件间分支技术更自然符合开发人员工作习惯 ;与变更管理集成,并提供开放接口,支持第三方变更管理工具

6.CCC 上个世纪七十年代初期加利福利亚大学的Leon Presser教授撰写了一篇论文,提出控制变更和配置的概念,之后在1975年,他成立了一家名为SoftTool的公司,开发了自己的配置管理工具:CCC,这也是最早的配置管理工具之一。

7.Borland StarTeam一个用于管理配置和变更的集成环境。主要特性:改善分散式开发团队的沟通及工作表现;提高对应用软件开发生命周期的观测力和控制力;利用现有的技术投资并提高投资回报(ROI);定制满足机构要求的解决方案. StarTeam和Microsoft Source Code Control接口(API)兼容,从而能够同支持该接口的众多工具平台进行无缝集成。StarTeam还可以与特定开发工具进行集成,例如Microsoft、IBM、和Borland的主流开发工具,包括Borland JBuilder、Borland Delphi、Borland C++ Builder。StarTeam还可以与很多第三方软件集成,从而充分发挥开发机构用于开发、测试和需求等活动的现有投资价值。全部软件开发资产被妥善地保存在StarTeam Server中,有助于减少生命周期中不同环节之间的障碍,提高团队协同工作与信息共享的效率,从而提升开发机构的投资回报率并加速软件交付市场。

8.RCS是另一种基本的源代码管理工具,是WALTER.f.Tichy 于1980 年在Indina的 Purdue 大学开发的. RCS和SCCS 类似,也是基于单一文件的版本维护系统.

9.SCCS的全称是Source Code Control System。是一种基本的源文件版本控制工具,它适用于任何正文文件的版本维护.它基于单一文件的版本控制,通常,它的软件储藏室和要维护的文件在同一目录下. SCCS 工作时,有一个专门的SCCS 格式的文件保留其源文件的编码版本,其记录了足够的信息来生成新的版本,并记录了谁对文件有修改权,拥有该版本的”锁”.

10.H a n s k y 公司软件开发管理套件中重要一员的Firefly,可以轻松管理、维护整个企业的软件资产,包括程序代码和相关文档。Firefly是一个功能完善、运行速度极快的软件配置管理系统,可以支持不同的操作系统和多种集成开发环境,因此它能在整个企业中的不同团队,不同项目中得以应用。Firefly基于真正的客户机/服务器体系结构,不依赖于任何特殊的网络文件系统,可以平滑地运行在不同的LAN、WAN 环境中。它的安装配置过程简单易用,Firefly 可以自动、安全地保存代码的每一次变化内容,避免代码被无意中覆盖、修改。项目管理人员使用Firefly可以有效地组织开发力量进行并行开发和管理项目中各阶段点的各种资源,使得产品发布易于管理;并可以快速地回溯到任一历史版本。系统管理员使用Firefly的内置工具可以方便的进行存储库的备份和恢复,而不依赖于任何第三方工具。

11.CVS 的主要作者(Fogel 等等)在他们现任公司的资助下开发了SubVersion,用以替代CVS。SubVersion 的设计目的就是针对CVS 的一些弱点进行改进。目前已经有几个知名的开源项目从CVS 转向了SubVersion 来保存源代码。SubVersion 目前发布了1.1 正式版,已经相当稳定可靠了。本文只是对SubVersion 安装和使用入门的一点引导,以便从未用过版本控制的程序员可以快速上手,先从保护你的个人代码开始。
版本控制软件SubVersion 入门

格式化html代码的函数

有时候输入一段html代码,显示代码的时候希望用格式化的显示方式。
例如从数据库中读取的数据为:

<div class="pz1">Test1</div>
<div class="pz2">Test</div>


显示的时候希望显示成:

<ol>
 <li><code><div class="pz1">Test1</div></code></li>
 <li><code><div class="pz2">Test2</div></code></li>
</ol>


实际效果则是:

  1. <div class="pz1">Test1</div>

  2. <div class="pz2">Test2</div>



函数调用输出:

dim sContent
sContent = PzCode(欲转换的参数内容)
response.write sContent



函数如下:

Function PzCode(sText)
Dim sContent
Dim aText
If IsNull(sText) Or IsEmpty(sText) Or sText="" Then
   PzCode = ""
   Exit Function
  Else
   aText = Split(sText,Chr(13)&Chr(10))
End if
sContent = "<pre>" & Vbcrlf
sContent = sContent & "<ol>" & Vbcrlf
For i=0 To UBound(aText)
   If aText(i)="" Then
 '空行输出空格,防止空标签,注释掉啥也不输出
 sContent = sContent & "<li><code> </code></li>"&Vbcrlf 
Else
 sContent = sContent & "<li><code>"&aText(i)&"</code></li>"&Vbcrlf
   End if
Next
sContent = sContent & "</ol>" & Vbcrlf
sContent = sContent & "</pre>"
PzCode = sContent
End Function

转换两个回车为p标签,一个回车为br标签的函数

,

用textarea标签输入数据的时候,转换两个回车为p标签,一个回车为br标签的函数。

'*************************************
'Coded By hooline 2006.9.29
'Msn:peace.zhou#msn.com
'功能:转换两个回车为p标签,一个回车为br标签的函数
'**************************************

Function PzFormatText(sContent)

 If Not IsNull(sContent) Then     
     sContent = Replace(sContent,chr(13)&chr(10)&chr(13)&chr(10),"</p><p>")
     sContent = Replace(sContent,chr(13)&chr(10),"<br />")
     sContent = "<p>"&sContent&"</p>"
     sContent = Replace(sContent,"</p>","</p>"&chr(13)&chr(10))
     PzFormatText = sContent
   Else
     PzFormatText = ""
 End If
 
End Function

网址自动加上A标签的函数

,

功能:

自动给网址加上A标签,例如在文本中有http://www.abc.com,自动转换为
<a href="http://www.abc.com">http://www.abc.com</a>

其中用正则表达式搜索文本内容,并转换为相应代码。

函数:

Function PzRegExpUrl(sChar)
   Dim regEx,match,matches
   Set regEx = New RegExp
   regEx.Pattern = "http://[a-z0-9^~`_./^-^?=&]+"  '设置正则匹配模式
   regEx.Global = True '设置全程性质
   regEx.IgnoreCase = True '是否区分大小写
   Set matches = regEx.Execute(sChar)
   For Each match In matches
      sChar = Replace(sChar,match.value,"<a href="""&match.value&""">"&match.value&"</a>")
   Next
   PzRegExpUrl = sChar
End Function


调用:
Dim sContent
sContent = "<div><ul><li>http://pz1860.cn/index.asp</li></ul></div>"
sContent = PzRegExpUrl(sContent)
response.write sContent
January 2010
S M T W T F S
December 2009February 2010
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30