B/S引擎—NoahWeb专题

转载 2006年05月22日 00:02:00

  自从新一代B/S轻量级快速开发引擎-NoahWeb发布以来,一直受到广大B/S开发人员的关注。随着NoahWeb的理念被越来越来多的开发人员所接受,网络上也出现了很多关于NoahWeb的文章。

  有不少网友在本站上发表了关于NoahWeb的文章,得到了大家的认可,讨论与学习。为此,我们制作出了此套专题,希望通过这条途径,能让大家更全面的了解和学习NoahWeb。

从了解开始

  传说,天神为了惩罚人类,决定毁灭世间一切。诺亚方舟承载着每种动物中最优秀的一对,去到了安全的地方,繁衍,生息,才有了今天的世界。

什么是NoahWeb?

传说,天神为了惩罚人类,决定毁灭世间一切。诺亚方舟承载着每种动物中最优秀的一对,去到了安全的地方,繁衍,生息,才有了今天的世界。

  NoahWeb™名字就来源于此。

  NoahWeb™最初在2000年中开始发展,起初仅是一个建立在以往B/S项目开发中摸索出来的最有效方式的开发规范,解决ASP、JSP、PHP语言开发B/S项目中有关项目设计,进度管理,代码编写,后期维护,应用程序安全、需求变更等方面的问题,此开发规范吸收了常见开发团队项目开发时摸索出来的最有效的各阶段模式,通过此模式建立最有效的设计流程和开发流程,以解决B/S开发中需求分析、原型设计、以及开发阶段美工、程序、项目管理人员之间的项目协作。在2002年时推出NoahWeb 1.0 快速开发引擎,2004年初又推出NoahWeb 1.1快速开发引擎,使其成为了一套成熟的轻量级B/S快速应用解决方案。

  NoahWeb™经过多年的实践积累和摸索,遗弃了其他编程语言中不常用的功能和结构,成功地将众多语言中的精髓有效地结合在一起,在提高开发效率的同时大大地缩短了开发时间,也为快速的需求变更响应开启了一扇方便快捷的大门。


  如果您还在为项目需求的频繁变更而烦恼,如果您和您的团队还在往前端页面里堆放大量的数据库操作代码;如果您还在为传统的开发模式那冗长的时间头痛;如果您每天还是要加班到很晚;那么,您是时候坐下来放松一下,喝上一杯咖啡,来感受一下NoahWeb™的魅力。因为您用过之后就会发现,原来,一切是如此地简单……

 

为什么您要了解NoahWeb?

了解和学习NoahWeb,不仅可以让您和您的团队学会使用一套可以快速实现网站、内容管理系统、业务系统、WAP等各类轻量级B/S应用的开发引擎,更重要的是,您将会了解到一套由NoahWeb所提倡的优秀开发模式。使用该模式,您和您团队在开发同类项目时效率会成倍提高,开发周期能大大缩短。并且,“变更”会成为您计划的一部分,项目的整个过程都能帮助您获得用户最终需求,并为需求的变更做出快速响应。学习该模式也能帮助您了解其他平台项目中如何使让您的项目开发更加快速、轻松。

  NoahWeb本身是从实际项目开发经验中演变而来的一套B/S轻量级应用开发引擎。然而,在B/S编程语言和平台已经比比皆是的今天,促使NoahWeb引擎出现和不断发展的根本原因主要有两个:
A、 B/S应用开发中的开发效率问题。
B、 客户的需求变更问题。

  NoahWeb引擎在设计之初,吸取了以往其他B/S解决方案的应用程序结构设计中为解决变更而易修改资源所使用的资源分配方式,所以项目资源在NoahWeb代码中呈松耦合状,使您可以方便的在开发管理上使用符合松耦合资源组合方式特点的 “增量迭代” 开发模式来解决项目开发各个阶段出现的需求变更问题。这一切都是来源于以往其他语言和平台中的具体实施经验,正是这些经验才使NoahWeb逐渐成为一套完整的轻量级B/S应用快速开发引擎。

  使用NoahWeb引擎来进行您的项目开发,可以大大缩短您的项目开发周期。并能让您轻松面对需求变更。让您获得八个益处:


1、项目周期和成本的降低
2、迅速的需求设计
3、最短时间的原型开发
4、高效的编程实现
5、高效的团队合作
6、变更需求后的快速响应
7、应用系统安全稳定的运行
8、方便的后期维护

第一章:简单制作动态网站

  NoahWeb提出了全新的理念,将一套完整的应用划分为“表现层”与“逻辑层”,当你学会使用表现层的各种语法标签,配合数据库相关知识以及大家都非常熟悉的开发工具DreamWeaver,可以轻松地进行动态网页或是动态网站的开发,其开发速度令人叹为观止,从而实现了快速,高效的网站开发。下面的文章中清晰的记录着使用NoahWeb表现层进行动态网站的每一个实现步骤。

第一天开始之前先和大家介绍点NoahWeb概念吧:NoahWeb有两种可以互补的语法:表现层和逻辑层,其中表现层是专门用来控制表现效果的,指令非常少。一共13个指令,如果按功能来分的话就更少了!一共才9个,呵呵,很少。别小看这13个指令,学会使用这13个指令就已经做出各种漂亮的动态网站。别告诉我你不知道什么是动态网站!动态网站就是网页内显示的内容是来源数据库的,页面内容会根据数据库内容动态显示在网页里面。

如果需要了解更多NoahWeb的内容,请访问其主站:http://www.noahweb.net

  好了说了那么多,先和大家介绍一下我们需要用到的工具,工具会在之后的学习中大量使用。

工具:

  工具之一:NoahWeb Desinger设计器,个人版是免费提供下载的,大家到NoahWeb官方站点下载一个,安装后激活就可合法使用了。

  工具之二:Macromedia Dreamweaver MX 2004,这个工具大家肯定再熟悉不过了!呵呵做网站能不用这个吗?不过这个东东不是免费的,大家可要注意哦。

安装运行环境:

  首先安装好Dreamweaver MX 2004,接着再去下载一个NoahWeb Desinger设计器,注意安装设计器之前你所运行的机器上必须已经安装过微软的.NET Framework和IIS,这些环境都有了就可以安装NoahWeb Desinger设计器,设计器安装成功后在第一次运行的时候会提示需要激活设计器,很简单,设计器激活后所有需要的运行环境就已经准备了。

  还有一点需要注意的,设计器需要放在Dreamweaver MX 2004之后安装,这样设计器在安装过程中会提示安装一个NoahWeb的扩展到Dreamweaver MX 2004中,安装扩展以后重新启动Dreamweaver MX 2004就可以在菜单“插入”看到下图的内容。

 ok了,第一天就学那么多了!今天就把安装环境准备好就成,呵呵!

今天我们学习一下怎么建立一个站点。

首先运行已经安装在计算机上的NoahWeb设计器,会提示出一个站点管理的窗口,如下:

因为是刚安装好的,所以可打开的站点是空的。

我们可以先在计算机的硬盘上准备好一个空目录来建第一个站点。

我选择的位置是e:/webroot/mysite,在文件系统中建立后如下:

然后在NoahWeb设计器中我们可以点“新建”添加一个站点。填入的内容如下:

点确定后我们再看一下设计器中可用的站点列表和文件系统中目录的变化:

文件系统的目录中有了变化,多了几个目录和文件

文件系统中的目录和文件是设计器自动帮你建立出来的,里面的东西大家不用管他。设计器会帮你维护。

再看设计器中,可以看到已经多了一个可以选择的站点:

双击打开这个站点,看到设计器呈现下图的样子:

接下来就是用IIS来发布这个目录了。我们可以在“管理工具”里找到“Internet 信息服务”然后配置站点,目录指到e:/webroot/mysite 下如图所示:

点确定站点就建立好了。大功告成!呵呵第二天就教大家那么多了。

今天是第三天了,使用NoahWeb我们的目的是制作动态站点,所以,我们来学习一下怎么通过设计器将站点连接上数据库。

呵呵,把昨天建好的站点用设计器打开,看到整个设计器的界面会如下所示:

在菜单中找到“资源”然后选择“数据库连接”然后点开,看到的就如下图:

出现数据库连接的配置界面,选择mssql2000数据库,如下图所示:

点开“在此项目中使用MsSql2000数据库”之前的勾选后再点“新建”,会看到一个新建数据库连接的窗口,名称部分输入你希望的名字,在连接串部分输入用来连接MSSQL的连接串。大家记一下哦。我连接的是一个叫"demo"的数据库。如下图:

输入好以后可以点“测试连接”看一下是否输入正确了。如下:

呵呵成功了!点确定后就做好了。然后我们在MSSQL2000的企业管理器中打开指定连接的"demo"库在里面建一张新表,(MSSQL的使用就不细说了。今天不是教大家怎么做数据库的,呵呵),新建表的内容如下:

新建的表在MSSQL的企业管理器中保存为"mynews",然后我们回到设计器,在"mylink"上面点一下右键选择刷新,就可以在设计器里看到我们刚才新建的表和结构了。如下图:

今天截图不少,写着费劲,看着到是容易,累死我了。今天就教大家这些吧。

欢迎大家继续第四天的学习!前三天都是准备和环境的搭建,今天开始真正的教怎么做动态站点,呵呵。

我们先来仔细看一下安装设计器以后在Macromedia Dreamweaver MX 2004加入的NoahWeb扩展菜单,在“插入”里可以看到如下的界面:

这个是NoahWeb Base Object下的内容

这个是NoahWeb Objects下的内容

好了。可以开始制作了。我们先在Macromedia Dreamweaver MX 2004中新建一个“空页面”。

然后存放在e:/webroot/mysite下,命名为"default.aspx"。在这说明一下,如果各位对Macromedia Dreamweaver MX 2004熟悉的话可以在DW中为e:/webroot/mysite建一个站点(DW中建站点不是必须的,各位如果会的话不妨建一下这样用起来会更方便!)。

接下来我们在DW中在"default.aspx"页面的代码头部加插入"NoahWeb Base Objects"下的"NoahPageHeadTag"标签,如下图:

插入以后的代码如下:

呵呵现在就已经表示这个aspx页面采用NoahWeb的引擎来进行解析。这个标签十分重要,否则页面就不能正常的被NoahWeb引擎解析。

我们可以先来测试一下运行是否正常,写个测试内容在body区域里,可以先插入一个"NoahWeb Objects"下的"NoahValue"标签。具体的方法如下:

插入后的代码如下:

然后在ValueName="" 里调用NoahWebInfo()函数,如图所示:

保存"default.aspx"文件以后在IE浏览器里输入"localhost"回车后能看到

Ok,看到上面的内容就表示我们做的都是正确的,"default.aspx"页面已经被NoahWeb的引擎解析。

在此回头看一下刚才使用到的两个命令。第一个命令是

<%@ Page language="c#" AutoEventWireup="false" Inherits="NoahWeb.Engine" %>

这个命令是来告诉系统该页面将使用NoahWeb的引擎来做解析,大家只要记得把这段代码插入到所需要被引擎解析的aspx文件的最头部就可以了。

 

另一个命令是

<!-- NoahValue ValueName="" MaxChar="" DChar="" Safety="False" -->

这个是一个大家所熟悉的HTML注释标签写法,可他在这不是一个普通注释标签,而就是我们的学习的NoahWeb表现层的语法,NoahWeb的13个表现层指令全部都是类似的注释标签,而此刻这个指令是用来回显变量内容到该标签所在的位置的,比如刚才我们调用了一个NoahWebInfo()的函数,这个函数执行出来的结果就会被放在NoahValue标签所在的位置。

OK!知道这两个命令以后我们接着往下讲,今天的内容会比之前几天多一点。

为了后面的动态显示内容。我们先给数据库内的mynews表准备一点内容,用企业管理器添加些内容,如下:

然后我们可以使用设计器建立一个数据库操作集,具体的方法就是在设计器里的"mynews"表上面点鼠标右键然后选择"由此创建Select",如下图:

选择后会看到设计器里出现下面的界面

我们完善一下其中的内容,有修改的部分我用红字给大家做了一下标注,如下:

改动的地方很少。很容易的做的。然后点上图我用蓝色的字标注的地方可以把这个界面关闭并将内容保存,然后就能看到在操作集下出现了一个mynews_S_All的操作集,如下图:

这就相当于我们手写了一个数据库查询“select * from mynews”,然后呢我们回到DW中,在DW中我们可以在刚才的"default.aspx"里做好一个为显示新闻的静态样子。小弟美术水平有限,做的不漂亮大家多多包涵,大概样子如下:

我们看一下,如果我们要希望呈现按照静态的样子来动态显示成后台数据库中的内容,要做的其实就是循环"<tr>"到下一个"</tr>"之间的内容,了解这点以后就很容易做了。我们可以在设计器中先选中"<tr>"至"</tr>"之间的一段内容,然后插入"NoahWeb Objects"下的"NoahLoop"标签,具体如下:

然后会看到下面的内容

这样LOOP就把"<tr>"至"</tr>"之间的内容包住了,然后我们把之前在设计器中做好的"mynews_S_All"数据库操作集的名称放到SQLLinkId=""中,如下

保存以后运行一下看看,呵呵在浏览器里就能看到这样的结果,如下:

可以看到,现在多了6条"准备做新闻的第1条"这样的内容,我们继续做一下,就可以把内容显示出来了,在DW中用上面我们讲过的方式插入一个

<!-- NoahValue ValueName="" MaxChar="" DChar="" Safety="False" -->

替换掉

"准备做的新闻第1条"

然后在ValueName=""里写入"[_LOOP.*.title]",如下图所示:

存盘以后在浏览器中的显示结果如下:

再接再力,把发布时间也替换了……,方法就是把

发布时间

替换成

<!-- NoahValue ValueName="[_LOOP.*.newdate]" MaxChar="" DChar="" Safety="False" -->

如下图:

存盘保存以后,在浏览器里查看显示结果如下:

哇,后面把时间也显示出来了~,得改改……,要不太难看,改的方法查了查NoahWeb的文档可以调用date函数,稍微修改一下:

<!-- NoahValue ValueName="[_LOOP.*.newdate]" MaxChar="" DChar="" Safety="False" -->

改成

<!-- NoahValue ValueName="date('O',mktime([_LOOP.*.newdate]))" MaxChar="" DChar="" Safety="False" -->

如下图:

刷新一下浏览器就能看到下面的结果

现在好多了。不过下面刚才静态做的那些也应该去掉,这样才漂亮

在DW中删掉那些代码就可以了。如下

在浏览器里刷新就看到

苦闷呀,实际操作的时候其实非常简单的,我写的整个过程最多1-2分钟的操作。可写出来害我截了那么多张图片……,命苦。今天就教大家到这吧,明天接着再讲。累了。

回忆一下吧,昨天我们实现了从数据库把内容动态显示到页面上。用到了两个NoahWeb表现层的指令。

一个是

<!-- NoahLoopStart SQLLinkId="mynews_S_All" AutoMode="True" AutoReset="True" NewRunMode="False" --><!-- NoahLoopEnd -->

该指令通俗点说就是根据数据库操作返回的结果行数产生循环,循环的内容就是Start标签和End标签之间的内容。比如查询返回的内容有6行,那么就会将此标签所包含的内容产生6次循环。而SQLLinkId属性就是指定根据那一个数据库操作来产生循环,我们现在使用的是"mynews_S_All",那就表示会根据mynews_S_All这个操作集的返回结果来产生循环。

接着我们看另外一个指令

<!-- NoahValue ValueName="[_LOOP.*.title]" MaxChar="" DChar="" Safety="False" -->

<!-- NoahValue ValueName="date('O',mktime([_LOOP.*.newdate]))" MaxChar="" DChar="" Safety="False" -->

这两个指令是同一个指令标签,昨天的课程已经和大家讲过NoahValue指令是用来回显变量内容到该标签所在的位置的,这两个标签内的ValueName是不相同的,一个是"[_LOOP.*.title]"另一个是"date('O',mktime([_LOOP.*.newdate]))"。

我们先看一下"[_LOOP.*.title]",在NoahWeb中用"[]"来包住的内容都是一个变量内容,而变量内容又通过变量前缀关键词来区分访问不同种类的变量。我们在这用到的是_LOOP变量前缀关键词。_LOOP从字意上就能理解它指的就是指产生当前这个循环的数据库操作,_LOOP后面的"."是分割符号,'*'指是就是循环时所指示的行,最后的title就是指的数据库字段"title"中的内容。发散思维想一想就可以知道,如果我要返回的不是数据库中的title,而是newcontent,则就写成"[_LOOP.*.newcontent]",如果是访问author就写成"[_LOOP.*.author]",如此照搬就行,其实很容易。

再来看另一段指令中的ValueName内容,我们一开始写的时候是直接写成"[_LOOP.*.newdate]"了,按我们刚才的学的就知道这是返回数据库中的newdate这个字段。可是显示出来的日期会显示出"YYYY-MM-DD hh:mm:ss"这样的格式,显示的时候我只想要显示出"YYYY-MM-DD"部分,所以使用了NoahWeb的两个日期函数来返回该部分,NoahWeb的函数和PHP的很接近,使用过PHP的人不会对这样的函数格式陌生。

上面是昨天遗留没讲的内容,下面接着讲今天要讲的内容。

我们现在已经做出新闻列表,剩下的工作就是点击查看某条新闻以后能显示出新闻的详细内容。传统的做法是另外建一个新的页面,比如新建一个"content.aspx"这样的页面来做。可是我们今天可以用一下NoahWeb中很有意思的一个新东西“动作”来做。有关“动作”的理论内容比较长,在这我就不多说了。有兴趣的同学可以上官方站点看看文档,我们今天仅是讲一下在表现层里怎么使用。

我们先把昨天的新闻列表的代码继续修改成一个HTML中的超链接。修改的方式如下

在显示<!-- NoahValue ValueName="[_LOOP.*.title]" MaxChar="" DChar="" Safety="False" -->前后加上<a href="">和</a>

这样在浏览器里显示出来的就是一个带链接的列表。如下:

然后我们来指定一下链接后打开的地址,方式是把<a href="">写成<a href="default.aspx?action=view&newsid=<!-- NoahValue ValueName="[_LOOP.*.id]" MaxChar="" DChar="" Safety="False" -->">,内容的意思是链接打开的地址是default.aspx,并且传递一个名为action的变量等于view,action是NoahWeb中默认的动作变量名,这样的话就会激发view的动作,连接的地址内容上还带一个名为newsid的变量值。传递的是新闻表中的id字段内容,如下

存盘以后在浏览器里打开的就是

<tr>
<td><a href="default.aspx?action=view&newsid=1">有关MYSITE的开发消息</a>(2005-06-21)</td>
</tr><tr>
<td><a href="default.aspx?action=view&newsid=2">MYSITE所使用技术</a>(2005-06-21)</td>
</tr><tr>
<td><a href="default.aspx?action=view&newsid=3">开发周期安排</a>(2005-06-21)</td>
</tr><tr>
<td><a href="default.aspx?action=view&newsid=4">MYSITE其他安排</a>(2005-06-21)</td>
</tr><tr>
<td><a href="default.aspx?action=view&newsid=5">招聘公告</a>(2005-06-21)</td>
</tr><tr>
<td><a href="default.aspx?action=view&newsid=6">10日发薪水通告</a>(2005-06-21)</td>
</tr>

类似上面的代码。

接下来我们为了让同一个页面又能显示列表又能显示指定ID的新闻我们在DW中继续对default.aspx做改动。

新加一个HTML的表格在里面用来准备显示新闻的内容。具体如下图:

这样在保存以后在浏览器中显示的结果如下图:

为了让新闻显示的部分只出现在执行动作view的时候,我们可以DW来帮助我们插入另一个指令"NoahWeb Objects"下的"NoahIfAction",具体方式如下:

然后在Action属性里输入"view",如下图:

这样就表示当执行动作view的时候才会显示此部分内容,我们可以存盘以后在浏览器里刷新一下,看看输出的样子,如下:

显示内容的表格在default.aspx默认打开的已经不显示,只有当我们点中其中某条新闻链接后才会看到下面的内容,如图:

我们如果把新闻列表的这个表格也用一个动作指令来划分的话,就可以让执行view动作的时候不显示出列表,操作方法如下:

这次插入后不用在Action的属性里填写任何内容,这样也就表示在不执行任何动作的时才执行该部分代码,存盘保存以后刷新浏览器就能看到下面的结果:

OK,现在就差一步了!把要选择的新闻内容显示在这个表格里,我们还是仅借助一下NoahLoop指令和NoahValue指令配合查询集就能做到,为了此目的,我们还是再通过设计器建一个数据库操作集出来,不知道大家是否还记得怎么建呢?我放几张截图吧,大家看看图回忆一下,话就不多说了。

请看截图:

第一步:建一个操作集

第二步:修改操作集的各种参数,被修改过的地方我用红圈标记出来,注意一下,这次我加了一个局部变量的内容,并加了一个查询的条件。

第三步:保存以后看到操作集中出现下面的内容。

上面的操作就相当于我们写了一个"select * from mynews where id='[newsid]'"的数据库查询。

然后我们继续在DW中对显示新闻内容的表格插入NoahLoop指令,具体操作我们以前也做过,现在还是回忆一下,如下:

当执行完插入操作以后因为我们准备调用的mynews_S_newid是需要传递一个局部变量的,所以这次我们使用NoahWeb设计器自带的辅助功能来获得LoopStart的代码,方式很简单,就是在设计器中操作集"mynews_S_newid"上面用鼠标右键点出辅助功能,如下图:

然后设计器就会为我们生成一段代码放入计算机的剪贴板中。我们把他直接贴到DW中替换掉刚才新建的LoopStart指令,如下图:

仔细看的话会发现,贴进去的代码除了帮我们自动填写了SQLLinkId成为"mynews_S_newid"外,还多了一个Value属性,我们现在需要的就是填写一下这个属性。

那应该填写什么内容呢?我们这样做是为了显示出新闻的内容,而这部分代码又只有在执行view动作的时候才被执行,为了显示新闻我们已经通过了链接传递了一个叫newsid的变量过来。现在我们就是需要填写这个变量作为查询的条件,具体写法如下:

我们刚才已经讲过"[]"在NoahWeb表示的都是变量,而现在的_root又是一个变量前缀关键词,表示的是访问全局变量内容或是客户端用GET和POST方式提交上来的变量值。这样我们就可以在这获得从地址上面传递进来的newsid的值内容。并传递给数据库操作集去进行查询。

接下来把表格内的文字

"标题部分"用之前学过的方式替换成<!-- NoahValue ValueName="[_LOOP.*.title]" MaxChar="" DChar="" Safety="False" -->

"新闻内容部分"也替换成<!-- NoahValue ValueName="[_LOOP.*.newcontent]" MaxChar="" DChar="" Safety="False" -->

OK,大功告成!

保存以后在浏览器里刷新一下

怎么样可以看到内容了吧!这样就完成了。我们可以重新进入一下,看一下默认进来的时候是如下的:

然后这次我点一下"MYSITE所使用的技术",看到内容就是

这个是动态页面的做法,小弟近期使用下来对NoahWeb表现层的感觉是熟悉DW的人可以非常快的通过DW开发出动态站点,灵活使用设计器配合DW开发起来更加容易。表现层里面还有大半指令没有提到大家有兴趣可以自己学一下,每个都非常有用,而且编写时也类似这样的方式,最近小弟还在学习NoahWeb逻辑层的东西,过段时间再写教材给大家共享。谢谢各位同学的捧场!有不足的地方也请同学们多多包涵!

用NoahWeb的表现层指令可以在动态生成的页面中非常容易的实现多行多列的表格。在正式学习以前我们需要先来了解一下怎么用NoahWeb的表现层来做动态内容显示。

在NoahWeb设计器中新建或打开一项目以后,在Macromedia Dreamweaver MX 2004中新建了一个“空页面”,并把它存放在项目对应的目录下,命名为"default.aspx"。然后在页面代码的顶部插入了"NoahWeb Base Objects"下的"NoahPageHeadTag"标签:

然后我们在NoahWeb设计器中创建了一个数据库操作集来查询数据库。回到页面中,我们先制作出静态页面,然后找到需要显示出数据库中内容的那个<tr>,将它圈起来,然后插入"NoahWeb Objects"下的"NoahLoop"标签:

将我们刚才创建的那个数据库操作集放到Loop里,这样它才能干活……:

再然后,我们插入<!-- NoahValue ValueName="" MaxChar="" DChar="" Safety="False" -->在<td>中,并且写入了[_LOOP.*.id]:

再在后面的<td>中插入<!-- NoahValue ValueName="" MaxChar="" DChar="" Safety="False" -->,这次我们写入[_LOOP.*.name],然后在浏览器中看一看显示结果:

其实,这东西没什么难度,想想就很明白。

Loop是什么?循环;

Loop需要什么?一个数据库操作集来查询数据库;

Loop怎么用?我们可以套在<tr>或是一个<table>外面;

Loop出来的数据怎么显示出来?在<td>里使用<NoahValue>就行;

要显示哪些数据?你在<NoahValue>写的是什么就显示什么?

就像上面一样,我写了[_LOOP.*.id]和[_LOOP.*.name],那么Loop就会循环显示出字段id和name的值。

OK!基础的东西就复习到这里。现在正式开始进入今天的话题。

要实现表格多行多列的显示就需要围绕着Loop来说的。NoahWeb表现层的NoahLoop指令有两个可配合使用的专用指令,一个是NoahLoopRow,另一个是NoahLoopColumn。这两个东西是干吗使的?下面我们一一来看。

首先是NoahLoopRow:

NoahLoopRow简单说就是描述循环的行内容是从什么地方开始又到什么地方结束的。当在一个Loop中用NoahLoopRow描述了多个行的时候,具体循环时NoahWeb引擎就会使用这些行内容依次来进行回显。大家如果不能理解我们可以先看看下面的例子:

第一步,我们用刚着复习所用的例子接着来做。在代码编辑中,我们刚才已经用Loop把整个<tr>包起来了,现在我们再“包一层”!圈选住整个<tr>,我们插入"NoahWeb Objects"下的"NoahLoopRow"标签:如下图:

现在代码是这个样子的……

第二步:把从<!-- NoahLoop_Row_Start -->到<!-- NoahLoop_Row_End -->中的部分,包括这两个标签复制一下,然后找个空白地方粘贴。如下图:

第三步:重点!给新复制出来的<tr>加上背景颜色,如下图:

OK!现在保存一下,在浏览器中看看效果吧!

看到效果了吧?这个东东就是干这个用的……就是用来做“交替行显示”的。会了这个循环出来的表格看起来就不那么单调了!提醒一下,记得一定要给新复制出来的那个<tr>加上背景颜色,要不看不到效果的。

下面是今天的第二个重点,就是NoahLoopColumn。你可以使用这个东东来指定循环的行中所使用的列数,挺好用的。我们来做一下试试看!

为了能看出效果,我换了一个数据库操作集……

第一步:还是使用Loop_Row标签,和上面做的基本上一样。如下图:

第二步:然后,圈住<td>里面的内容,注意,圈的时候不包括<td>和</td>!如下图:

现在的代码是这个样子的……

第三步:为了能看到效果,我们将<td>部分复制两个出来……如下图:

第二章:NoahWeb中的表单

  做为NoahWeb的一种重要资源,表单资源非常强大。学会使用她,你可大量省去传统表单设计所耗费的时间,省去大量编写JavaScript前端检测程序的开发和测试时间。而且,NoahWeb表单一旦生成,重用性很强,可以方便地在不同项目中反复进行调用。另外,表单的强大之处也在于,她提供了多种非常方便实用的控件类型,使用方便。

HTML中表单是网络应用里极为常见的东西,B/S应用中有关用户数据输入都需要通过表单来实现,简单的表单或少量表单可通过Dreamweaver等类似的所见即所得的工具来进行编写。可对于表单比较多的应用系统就希望有一种机制来帮我们快速开发出表单,新一代B/S开发语言NoahWeb就提供了这样的机制,可用基于XML的结构化方式制作所需表单,在实际调用的时候再根据指定的模板文件来生成最终表单,这无疑可以把很多制作表单麻烦的工作简化,学会这种的制作方式后开发B/S应用中的表单就很easy了!

  好啦!开始了!

  要制作表单可以通过NoahWeb Designer(NoahWeb设计器)打开名称空间下的表单文件(名称空间下的Forms.xml.config文件):

然后设计器就会用你预先设定好的文本编辑器打开表单文件,我在这设置的是EDITPLUS,如下:

Forms就是表单资源中的根节点,所有的表单都必须存在该根节点下。并且使用Form标签来进行描述。如果有两个表单那么简单点来说Form的写法就如下:

  OK,讲完Form就让我们来初步了解一下NoahWeb中的“表单资源”的基本结构和NoahWeb提供的控件。

表单的基本结构

  先看一张截图吧!



上面这个是一个很简单的表单,下面是关于这张表单NoahWeb表单结构代码,绿色字体是当前行或者上一行的注释(后面的内容都省略Forms不提了):

  第一步,先看截图最外层的节点<Form Id="" Text=""></Form>标签,刚才我们见过Form的属性Id和Text,Id可以随便输入表示的是此Form的一个引用名,引用名是为了调用该表单的时候用的,Text是这个表单的显示名字,用来作为生成该表单的时的文本。我们可以根据自己的需要输入Id和Text。注意:多个Form的Id不能重复。

  第二步要建立一个表单输入区<Line Text=""></Line>,Line标签的作用我们可以先把他简单的理解成HTML里的table相似。

  第三步要在输入区中建立一个新的输入行<InputLine Text="" Desc=""></InputLine>,InputLine标签的作用我们可以先把他简单的理解成HTML里的tr相似,一个输入区里面可以有多个输入行。

  第四步要要输入行中建立一个描述控件的标签<Input Id="" Type=""></Input>, Input标签也可以先简单理解成和HTML里的td相似,一个输入行中也可以有多个描述控件的标签,

  第五步要在Input标签内添入一些所要描述标签的具体参数,例如:Input显示名称的标签<Label></Label>,Input显示名称使用样式的标签<LabelClass></LabelClass>,Input显示尺寸的标签<size></size>,为了程序能根据需要你还可以加入校验标签,这样一个表单就完成了。

表单可以定义很多常用的控件类型,不同的类型在Input的Type中指定的是不同的,如下面这些图所示:

除了常见类型外NoahWeb还提供了一些在HTML不存在的输入类型:如下面:

  你可以把各段代码放到一个Line标签里看看结果如何,其它的就不依依列举了,大家自己试试就知道了。

  列举表单中支持的控件类型,大家可做一下参考: (用*表示的是HTML中没有的)

hidden 隐藏变量域
text 单行文本输入区
checkbox 多选框
file 上传文件选择框
image 图片按钮,当图片地址为空时不会显示
password 密码输入区
radio 单选框
reset 重设按钮
button 按钮
label 文本或HTML显示标签*
date 日期选择输入区*
choice 选择内容输入区*
submit 表单提交按钮
select 单选输入区
select-multiple 多选输入区
textarea 多行文本输入区

 

TitleLine和位置控制
  TitleLine是标题行标签,可以显示一个表单的标题,上面登陆表单是没有标题的,也就是说,里面没有TitleLine标签,加入TitleLine后的结果是这样的:

  上述结果在代码中要做的改动很小,只要在代码第四行的前边加上<TitleLine Text="标题" />就可以,标题可以有多个,需要注意的是TitleLine和Line是同级的,不能相互嵌套。

  InputLine和Line都是用来控制位置的,上面管理员登陆的页面中用户名和密码是分两行来摆放的,如果需要把他们放在一行上,只要把两个Input标签放到一个InputLine标签里就行了:

  代码也做了稍稍的调整,这里的用户名和密码标签用的是label类型控件,代码:

检验标签

  如果我们希望使用系统的人在填写制作的表单时符合我们所希望的输入内容和格式就可以配合使用NoahWeb表单的检验标签来做,如果不符合规则的话会出现提示,我们可以看看login表单第9和16的两行代码:

<NullErrorString>请输入您的登陆用户名</NullErrorString>

  这里做的是空字符检验,如果用户没有输入内容就提交的话就会出现“请输入您的登陆用户名”的提示:

  检验标签的类型也有好多种,已经包含了各种常用到的检测,这里也不依依列举了,有兴趣的话自己研究一下吧,也可以去NoahWeb的官方帮助文档看看

大家好!今天是第二天,昨天讲了讲NoahWeb中"表单"的入门知识,今天我们来接着看看其他内容。

  表单中的各种控件中,只要牵扯到带有“被选值”的控件,比如select,radio,choice类型等等,在NoahWeb表单中就可以使用Values标签来为其提供“被选值”,使用Values标签还可以很容易的从数据库中获得被选值内容,Values用起来很方便。今天给大家讲的就是这部分内容。

  还记得昨天说到的那些控件吗?比如Select,就是下拉单,表单里最常用的。一个下拉单中的可选值可以用<option Value>标签往里加,就像下面的代码一样:

<option Value="A">A</option>

  这个是用固定好的值来作为“被选值”内容的,而很多时候我可以是需要用数据库中存在的内容来作为被选值的,这情况下就可以使用我们今天要讲的内容——用数据库的内容作为被选值。我们还是看下面的代码好啦:

<InputLine Text="部  门:" Desc="">
  <Input Id="mydept" Type="select">
   <Label></Label>
   <LabelClass>label</LabelClass>
   <NullErrorString>请选择员工所在部门!</NullErrorString>
    <Values ValuesSQLLink="dept_S_all" ValuesSQLValue="[_LOOP.*.id]" ValuesSQLLabel="[_LOOP.*.name]"       BySelectArrayString="[mydept]">
      <option Value="">请选择</option>
    </Values>
   <class>myinputstyle</class>
  </Input>
</InputLine>

  上面的例子中,用dept_S_all这个数据库操作集查询了一下数据库的dept表,dept表的结构和内容如下:

  dept_S_all数据库操作集的在NoahWeb设计器中的样子如下:

  有关NoahWeb设计器中的数据库操作大家可以参看其他的文章,今天咱们讲表单就不说这些内容了。

  我们还是回过头来看代码。还是上面那段代码:

<InputLine Text="部  门:" Desc="">
  <Input Id="mydept" Type="select">
   <Label></Label>
   <LabelClass>label</LabelClass>
   <NullErrorString>请选择员工所在部门!</NullErrorString>
    <Values ValuesSQLLink="dept_S_all" ValuesSQLValue="[_LOOP.*.id]" ValuesSQLLabel="[_LOOP.*.name]"       BySelectArrayString="[mydept]">
      <option Value="">请选择</option>
    </Values>
   <class>myinputstyle</class>
  </Input>
</InputLine>

  大家看到上面代码中的Input的Type了吗?是个Select是下拉单,再看看Values标签中的部分,细节部分听我慢慢道来!

  1、先看Values标签,它可以用来指定控件中可选值的来源。而今天讲的使用数据库查询方式给控件提供可选值就需要配合使用Values标签的几个参数。

  2、参数ValueSQLLink来指定一个数据库操作集,用来表明通过那一个数据库操作来获得被选值的内容。现在我指定的就是“dept_S_all”这个操作集。这样就会根据dept_S_all操作集的返回结果来循环生成被选值内容。

  3、ValueSQLValue参数来表示该控件的可选择值的值所对应的变量表达式,简单点说我们希望用数据库中的id字段的内容来做为被选值的值内容就可以写成“[_LOOP.*.id]”。在这说明一下NoahWeb中的变量都是使用"[]"来标识的,而[_LOOP.*.id]就是一种变量表示的方法,要了解更多NoahWeb变量表示方法大家可以查看NoahWeb的官方文档

  4,ValuesSQLLabel参数表示该控件的可选择值的值所对应的名称表达式。简单点说我们希望用数据库中的name字段内容来做被选值的显示文本,就写成“[_LOOP.*.name]”。

  说白了,ValuesSQLLabel是在下拉单中看到的值,而ValueSQLValue则是当你在下拉单中选择了一个值之后它所对应的值。

  把这个select放到一个NoahWeb表单中的时候,我们看看表单中的样子。如下图:

  图中红圈部分就是上面代码的实际运行情况,是不是很容易?这样该select的被选值就会根据dept的变化而变化,如果希望系统中出现一个新的部门,只需要将新的部门内容加入到dept表中就可以。

  还有,可不是只有Select类型控件能这么做,什么,radio,checkbox,choice,都可以这么用。唯一你需要做的就是把Input中的Type由select换成radio或checkbox或choice.其他的地方不用做改动.

  更换后的效果可以看下面的图:

  上图是Type="radio"的显示。

  上图是Type="checkbox"的显示。

  上图是Type="choice"的显示。

  仔细看的人可能已经发现,换了Type的类型后<option Value="">请选择</option>没有输出了。再仔细看一下能发现这些没起作用的类型都是不能选择“空”的而<option Value="">请选择</option>里的Value是空的,所以NoahWeb引擎在生成的时候就为我们过滤掉了值为“空”的被选项。

  行了,今天就到这里吧!记着,只要是能提供多个被选值的控件,就一定要使用Values标签!

欢迎大家来到第三天的学习,真高兴又见到你! 在前两天的课程中,我们一起熟悉了NoahWeb中的表单资源. 今天一起来学习在表单中传值的方法。先让我们先从一个举个例子来说吧!在一个应用中我们为添加用户所需的输入操作制作好一表单,可以满足新建一个用户时候的信息输入了,而当修改用户个人资料的时候,也使用一个表单将先前填写的资料回显出来.这样的情况我们没有必要为这个功能再去写一张表单,用之前的的那个就OK了!

  而关于回显出用户资料,就需要了解NoahWeb中的表单传值了.还是看着代码来说吧!这样说得明白!^_^

<Form Id="faqstatusadd" Text="DEMO" A="Value">
  <Line Text="">
    <InputLine Text="A:" Desc="">
      <Input Id="faqstatusname" Type="text" LinkValue="[A]">
        <Label></Label>
        <LabelClass>label</LabelClass>
        <NullErrorString>Error!</NullErrorString>
        <class>myinputstyle</class>
      </Input>
    </InputLine>

上面不是一个完整的表单我只把要说的代码贴出来了。需要讲的重点我也加粗了。

  第一步:在需要传值的表单的Form标签中添加一个接收值的变量.例子中就是A="Value"这一段,这么说吧!引号中的Value就是传过来的值,既然传过来了,表单这边需要有个变量来接收不是吗?所以创建了一个叫做A的变量来接收值.

  第二步:现在值传过来了,就该想想办法让它在表单中显示出来.这需要使用Input标签的LinkValue参数.这个参数指的是回显所对应的变量表达式。

  第三步:将LinkValue参数写到需要回显出值的Input中去.就像例子中这样:LinkValue="[A].希望用哪个Input来回显这个值,就加入LinkValue参数,而这个参数后跟的自然就是刚才已经接受到值的那个变量。NoahWeb中变量表示的方法我在第二天的时候已经和大家提过,要了解更多可以查看官方文档

  第四步:想要显示出这张表单则需要一个“动作”,“动作”是NoahWeb的灵魂。调用任何资源都需要使用“动作”来完成。由于现在是在谈表单,所以就不讨论“动作”了。使用一个“动作”来调用这个表单,这需要用到ViewForm标签,它的作用就是显示出一张表单。并且传个值试一试.还是看代码吧!

<Action name="manager.addfaqstaus" NextAction="">
 <Out Area="main">
  <ViewForm FormLink="faqstatusadd" TemplateLink="baset2form" Action="setfaqstausinfo_ex" >
    <Var Value="'DEMO'" />
  </ViewForm>
  </Out>
</Action>

  这是一段动作中调用表单的代码,使用了Var标签给表单传了一个值,无论这个值是什么,像例子中这样手动写入一个值,还是查询数据库返回一个值都可以,因为刚才我们在表单那边已经做好的接收并显示的工作,所以这个值可以顺利的显示出来.如下图:

  其实这个传值的道理非常简单,就是用一个变量接收一个传进来的值,再找一个Input接收而已.很简单!

  如果是传多个值,这时候就是被选值为多选的情况下经常出现的,传值的道理是一样的,只不过这次需要使用","号将需要传过去的几个值分隔,在Input控件里回显的时候则是使用Values标签中的BySelectArrayString属性,而之前说的LinkValue只是用于单个输入值或是被选值的,如果是多个则使用Values中的BySelectArrayString!看下面代码:

我们可以在定义表单的时候使用

<Form Id="faqstatusadd" Text="DEMO" A="Value" B="Value">

上面的方式来接受两个变量值,然后在使用的Input中如下:

<Input Id="mygroup" Type="choice">
  <Label>可选择</Label>
  <LabelB>已选择</LabelB>
  <LabelClass>label</LabelClass>
  <size>10</size>
  <NullErrorString>Error!</NullErrorString>
    <Values BySelectArrayString="[B]">
      <option Value="1">a</option>
      <option Value="2">b</option>
      <option Value="3">c</option>
      <option Value="4">d</option>
      <option Value="5">e</option>
    </Values>
</Input>

  这是个choice类型控件,有五个可选值,a,b,c,d,e现在我们想要回显出a,b和d的值,那就在动作调用表单时写入下面的代码:

<Action name="manager.addfaqstaus" NextAction="">
 <Out Area="main">
  <ViewForm FormLink="faqstatusadd" TemplateLink="baset2form" Action="setfaqstausinfo_ex" >
    <Var Value="'DEMO'" />
    <Var Value="'1,2,4'" />
  </ViewForm>
  </Out>
</Action>

这时候我们给表单传递了两个值进去,被表单接受后分别就成了AB,表单被显示出来后显示结果如下图:

  如果需要回显的多个值需要使用查询数据库的返回结果,那么你可以使用Loop依次循环出这些值,写进一个数组,就OK了!我在这里就不再多说了.

  好啦!写了这么多,大家慢慢看吧!我有点累,洗洗睡啦!明天再写……

大家好!又见面了!今天我们学习另一种非常又有的表单控件--多级关联类型控件。今天是我这篇教程的最后一天了,首先感谢大家几天来的支持……谢谢!

  不知道你有没有遇到这种情况,有的时候,页面上提供了两个下拉选择给用户,本来挺简单的事情,可是,第二个下拉单中的可选值是根据用户在第一个下拉单的选择而生成的。做这样的东西都需要写很多javascript的代码,巨麻烦!前些日子看了看NoahWeb,发现它提供这样的一种控件,叫做“多级关联类型控件”琢磨了一下发现挺好用的,今天说给大家听听!

  说白了,这种控件就是第二个下拉单是根据第一个下拉单中的选项动态生成的。还是老规矩,先看看代码,要不说不清楚!呵呵!

<InputLine Text="SelectLevel" Desc="">
  <Input Id="sla" Type="select">
    <Label>选择:</Label>
    <LabelClass>label</LabelClass>
    <NullErrorString>请选择1</NullErrorString>
      <SelectLevel sla="[select1]" slb="[select2]" >
        <LevelOption Text="请选择" Value="">
          <LevelOption Text="请选择" Value="">
          </LevelOption>
        </LevelOption>
        <LevelOption Text="德国" Value="010">
          <LevelOption Text="柏林" Value="0101">
          </LevelOption>
          <LevelOption Text="慕尼黑" Value="0102">
          </LevelOption>
        </LevelOption>
        <LevelOption Text="澳大利亚" Value="021">
          <LevelOption Text="墨尔本" Value="0211">
          </LevelOption>
          <LevelOption Text="堪培拉" Value="0212">
          </LevelOption>
        </LevelOption>
      </SelectLevel>
  </Input>
  <Input Id="slb" Type="select">
    <Label>选择:</Label>
    <LabelClass>label</LabelClass>
    <NullErrorString>请选择2</NullErrorString>
  </Input>
</InputLine>

  第一步:先看个大概……代码中的一个InputLine中出现了两个Input,一个叫sla,另一个是slb。都是Select类型的。这就是过一会儿出现在表单中的那两个下拉单。

  第二步:即然是“多级关联”,顾名思义就是将这两个或更多个select联系起来,实现要求的功能嘛!我们看一看被我加粗了的那句代码,也就是

<SelectLevel sla="[select1]" slb="[select2]" >

  再找到它的结束标签,也就是

</SelectLevel>

  正是它们中的内容将两个select关联起来的。SelectLevel标签用来描述多个控件的选择级关联。sla是第一个select的名字,它根据select1变量的值作为已被选中的值,那么slb自然就是第二个Select的名字,slb根据select1变量的值作为已被选中的值!这个是为了用这个表单回显时而做的。

  第三步:接下来我们看看这几句代码:

        <LevelOption Text="请选择" Value="">
          <LevelOption Text="请选择" Value="">
          </LevelOption>
        </LevelOption>

  我们看到了LevelOption这个标签,它用来描述该级相关的可选值。这里面还存在着一个包含关系,就像代码中那样,描述第一级Select的LevelOption是外层的,描述第二个Select的就是里层的LevelOption。这两句代码给出了两个select的初始值,也就是“请选择”,人性化一点嘛!

  第四步:现在就要实现“级联”功能啦!看代码,

        <LevelOption Text="德国" Value="010">
          <LevelOption Text="柏林" Value="0101">
          </LevelOption>
          <LevelOption Text="慕尼黑" Value="0102">
          </LevelOption>
        </LevelOption>

  这几句代码还是一个包含关系,和上面一样,外层的LevelOption用来控制第一个select,里层的控制第二个select。先看外层的,在它的参数Text里面我写人了“德国”,而参数Value中是它的值。而里层的LevelOption有两个,一个是“柏林”,另一个是“慕尼黑”。其实想想挺简单的,“德国”是第一个Select中出现的可选值,当选择了“德国”之后,第二个select中应该自动出现“柏林”和“慕尼黑”两个可选值。

  第五步:我们接着写入些代码:

        <LevelOption Text="澳大利亚" Value="021">
          <LevelOption Text="墨尔本" Value="0211">
          </LevelOption>
          <LevelOption Text="堪培拉" Value="0212">
          </LevelOption>
        </LevelOption>

  其实到了这里我已经没必要解释什么了!这几句代码和上面一模一样。作用是给两个select多添一个可选值。当选择“澳大利亚”的时候,第二个select中应该出现“墨尔本”和“堪培拉”这两个可选值。

  大功告成!试试看!^_^

  两个select出来了……再试试功能。

  没问题!如果选择“澳大利亚”的话……

  一切正常!如果想在“级联”中多添一个可选值的话,按照第四步或者第五步多写出一套LevelOption就Ok了!你可以自己试试!另外,还有另一种生成“级联”的模式,就是使用数据库获取方式,两个select中的可选值都是查库返回的,想要生成“级联”,第二个select中的那个数据库操作集的查询条件就要使用第一个select中选择的值,实现方法也很简单的!由于篇幅的问题,这里我就不多说了。需要用到的时候大家自己去NoahWeb官方的帮助文档看吧!

  本来还想和大家谈谈表单中的一些使用技巧,可是没时间了!算了,下面有几个链接,是我在NoahWeb的官方帮助文档上看到的一些技巧,大家谁感兴趣就去看看……

label类型控件的妙用

使用NewLine标签以及利用空的InputLine标签

关于在表单中使用HTML标签

  好啦!表单的这些简单的知识就到这里吧!几天下来我也学会了不少东西,教程写得不好,大家多多包涵啦!以后再有什么好东西我争取写出更好的教程!谢谢大家!祝好运!

第三章:了解动作编程

  NoahWeb使用简单易懂的“动作编程”为灵魂。相比传统的编程思想,“动作编程”更重视项目开发时程序的流程设计。使用最简单的方式诠释出了程序运行的每一步骤。学习NoahWeb的逻辑层,你可以感受到“动作编程”的优势,无需考虑纷乱的程序结构,只考虑程序的流程设计。而且,使用“动作”编写程序,不仅速度快,而且弹性很强,面对各种原因造成的修改都能快速做出响应。下面的文章中,以实现一套简单的流程为例,生动形象的说明了“动作”的使用,以及“动作”在NoahWeb中的重要性,值得大家学习。

大家好!前些日子发了几篇文章说了说NoahWeb中的表单资源,也不知道大家都学会了没有?既然表单都做出来了,怎么显示到屏幕上呢?从今天开始,我们一起来学习NoahWeb中最重要的部分,也就是她的逻辑层。

程序的流程是什么?说得简单一点,应该是程序一步一步的运行轨迹。那么谁来控制流程呢?是逻辑。

所谓逻辑层,是用来控制你程序的流程,比如,程序运行到了某个阶段,该显示些什么?这些都需要逻辑来控制。我希望通过简单的示例,能让大家了解到使用NoahWeb的逻辑层来控制流程的优势。

前几天我也很头疼,辛辛苦苦做好了表单,不知道该怎么显示出来。闹了半天,这需要使用到“动作”这个概念。

想必大家对于“交管中心”都有所了解吧?这个部门负责着某一个区域的交通运行情况,控制路况,控制车辆等等都是它说了算。而这里的“动作”正像是“交管中心”一样,比如你的表单,就需要动作来控制它的显示,当一个动作中代码告知系统需要显示一张表单的时候,表单才能显示出来。而动作也是逻辑层的最中心,学会使用动作,我们才能将流程控制在手中。

光说好像还是说不清楚,我们先来了解一下什么是动作,以及动作的执行。

第一步,我们站点所在的文件夹中创建一个扩展名为aspx的文件,因为动作的执行必须要使用到它,如下图:

第二步,打开文件,我们需要插入插入"NoahWeb Base Objects"下的"NoahPageHeadTag"标签,如下图:

现在页面是这样的:

好的,保存到站点的一个名称空间之下,示例中我的名称空间叫做"NS1"。

第三步,在设计器里我们找到刚才保存文件的那个名称空间,右键点击名称空间,选择“使用外部编辑器”-“编辑此空间下的Action文件”,如下图:

如果先前你没有设置好外部编辑器的话,这里会提示你选择一个,我习惯使用EditPlus。

第二步,你现在看到的这个就是动作文件,想要让表单显示出来,就要在这里做做文章了!^_^

第一句是Xml的声明信息。然后,Actions是根节点,声明了整个动作文件所属的名称空间,也就是NameSpace="NS1",这说明我们在下面要写的每个动作都存在于这个名称空间之下。而动作也是需要使用xml方式来编写的。

第三步,我们来一起写几句代码,让我们的表单出现在页面上,首先,我们要搭起一个动作,所以需要下面的代码:

 这就是一个动作的“架子”,使用<Action>和</Action>标签。看到Action name="fa.a"这句了吗?第一个fa指的是执行文件的名称,就是刚才我们创建的那个fa.aspx文件。后面的a指的是动作的名称,也就是说这个动作是“执行于fa.aspx文件下的a动作”。另外说一下,后面的NextAction可能是被NoahWeb保留的,我没发现他的实在用处。

第四步,为了能看到动作被执行过的痕迹,我们需要使用NoahWeb中的一个函数,那就是SaveFile函数,如下图:

我们先来看一看图中的SaveFile,它有两个参数,第一个是个文件,示例中叫做"a.txt",而第二个参数"a"就是要保存到"a.txt"中的内容。SaveFile函数的作用就是在指定目录中创建一个参数中执行的文件以及文件内容。文件的路径如果没有声明则默认为当前路径。这个函数的返回值是布尔类型的,操作成功返回'True',操作失败返回'False'.

我们使用了<SetVar/>标签声明了一个变量叫做"message",它的Value就是SaveFile这个函数的返回值。

这个动作就完成了。它的作用是,一旦动作被执行,就会在当前目录下创建一个名叫'a'的txt文件,并写入内容"a"。

第五步,为了能演示出几个动作交替执行的情况,我们创建出几个一模一样的动作,只是需要记得,将动作名,创建出来的文件名,以及文件内容换一下,如下图:

这样一来,加上刚才创建的那个动作,现在一共有三个动作,生成的文件分别是"a.txt""b.txt"和"c.txt"。

第六步,现在我们要执行动作了。对了,别忘了把IIS的默认站点指向当前站点,如下图:

第七步,现在打开浏览器,键入地址,如下图:

现在,动作执行完毕了,我们来看看这个动作是否被正确执行了,很简单,打开当前文件夹,看看是否生成了文件,如下图:

文件的存在告诉我们这个动作己经执行过了,那么剩下两个动作呢?我们依次执行一下就知道了,如下图:

还有"C"动作……

都成功了!说明了每个动作都正常执行了。

刚才我们使用的是"GET"方式来激发一个动作,就是在浏览器的地址栏中手动键入地址以求动作的执行。当然,我们也可以使用"POST"方式来激发一个动作,下面我们就来试着做一下:

第一步,我们在DW中创建一个html页,放一个form,在其中放一个select,如下图:

第二步,保存好,我们执行一下这个页面,我建的这个页面叫做test.html,如下图:

第三步,别忘了到当前目录下把刚刚生成的那三个文件给删掉,要不这里再执行一遍的话,会覆盖原有的文件,也就看不出效果了。

第四步,依次选择select中的值,看一看动作是否被激发了,如下图:

然后执行b和c动作,这里就不放截图了……

最后我们回到当前目录的文件夹,看一看是否有三个文件被创建了……

看到三个文件的生成,说明我们再一次成功了。现在,两种方式激发动作你都有明白了吗?随着一步一步的进行,现在你是否对于“动作”这个概念有所了解了呢?说得简单一点,当你激发了一个动作的执行时,它会“老老实实”的将内容执行出来,就像上面我们做的一样。

好啦!今天有点累,就说这么多吧……Bye!明天继续!

今天天气不错啊!大家好!今天我们继续学习NoahWeb逻辑层的知识。昨天的那些都试过吗?好啦!开始今天的课程吧!

大家有没有想过,之前你做好的表单是什么?我们应该这样说,它是NoahWeb的一种资源。从本质上讲,表单和字符资源,数据库操作集,模组都一样,是资源。它的价值就在于你的调用。就像是在面相对象编程中,你写了一个方法,只有当你调用它的时候,它才能“有所作为”。而且我发现,在NoahWeb中,各种资源间似乎是平行存在的,不会出现优先级的问题。

为什么说“动作”那么重要呢?因为没有动作的驱动,没有动作在调用,任何资源都不能工作,也就没有存在的价值了。在动作中,各种资源才能发生交互。而多个动作之间又发生了交互,你的应用才能完成各种你需要的功能。

昨天我们创建了“动作执行文件”,又感受到了动作的执行,今天,我们就要让动作来显示出你的表单!

在编写代码之前,我们先来了解一下什么是输出区?首先,输出区存在于你的"动作执行文件"中,由于文件本身得到了NoahWeb引擎的解析,所以,在这个文件中你定义好的“位点”,也就将成为内容显示在页面上的位置。

第一步,打开昨天我们创建的"动作执行文件",就是那个fa.aspx的文件了。我们需要打开这个文件,使用DW的标签来定义模板输出区和库内容。如下图:

我定义了三个输出区,过一会儿你就能看到效果。

第二步,用设计器打开动作文件,我们来编写代码。昨天我们把动作名称,执行文件都完成了,今天我们又定义好了输出区,是不是就可以显示表单了呢?错!还差一步,那就是“指出表单显示的位置”,看代码吧!

这个Out标签就是用来指出资源在模板区的显示位置的,你看,后来跟着Area="/Library/ob.lbi",这不就是刚才我们在“动作执行文件”中定义三个输出区中的一个吗?如下图:

现在看明白了吧?Area="/Library/b.lbi"指的就是将需要显示出来的,显示到这个区中,现在,我们要显示的就是你的表单了。

第一步,回到设计器,将资源切到“表单”一项,你可以看到先前你的表单。如下图:

第二步,点击右键选中该表单,选择“辅助”-“复制ViewForm”,如下图:

第三步,回到动作文件中,按下Ctrl+V,如下图:

这里需要好好看看,在ViewForm标签的参数里,除了FormLink是自动填写的,剩下的几项都需要你来手动填写,而上面自动出现的注释就是为你填写这三项提供帮助的。我们依次来看看吧。

第一项,TemplateLink,这是指该表单显示所使用的模板。打开项目的Template文件夹,你可以看到其中的模板文件。如下图:

选择一种你喜欢的模板,将名称填写进去就好了。如下图:

第二项是Action,这指的是系统要执行的下一个动作,说白了就是当你点击表单上的按钮之后,系统要执行的下一个动作。在后面的教程里,我会专门找一天来说这个问题的。这里就先不作讨论了。

第三项是FormTitle,当这个表单需要重用的时候,在这里可以修改表单的名称。这个东东现在也不好说明白,以后有机会做个例子给大家看吧。有兴趣的朋友去NoahWeb的帮助文档里看看吧,有解释的。

第四步,现在保存好动作文件,打开浏览器……对了!差点忘了,到Windows的“管理”里面将主目录指到你项目的文件夹。如下图:

第五步,打开浏览器,键入地址,示例中我的地址是http://localhost/NS1/fa.aspx,因为示例中我把表单和动作都写在了"NS1"名称空间之下,所以在键入地址时要加入/NS1这一级,如下图:

成功!表单已经显示出来了!^_^

现在,对于输出区这个东东呢是否有些了解了呢?现在我们将代码改一改,来看一看变化……

最后,我们在oc区显示一下试试看……

表单已经正常的显示出来了,你是否学会了呢?其实,更重要的是,你是否明白了NoahWeb中“资源”与“动作”之间的关系了呢?

翻回头来想想看,其实挺简单的。建一个.aspx文件,打开文件建输出区,用设计器打开动作文件写动作,找到表单,用设计器的右键功能,回到动作中粘贴一下,然后给个模板。打开浏览器键入地址就OK了。

今天又写了不少……累!

欢迎继续学习!今天是第三天的学习。

在NoahWeb中,整套的应用是靠一个一个的动作联起来完成的,至少我是这样认为的。一个动作能做到的有很多,而当多个动作联起来的时候才能完成一系列的功能,这就形成了流程。从程序的设计角度来说,流程是至关重要的,可以说你的程序的优劣相当一部分都取决于你对流程的设计,说得真实一点,就是动作之间的连接,今天我们就来说说如何让动作联起来。

还记得我们在第一天体验动作的时候谈到的吗?激发动作有两种方式,post和get。其实这里要说的动作之间的连接无外乎也是这两种方式,我们先来看第一种,使用表单来连起动作,这种属于post方式。

在昨天的课程中,我们了解了在动作中调用表单,还记不记得<ViewForm>标签?看看下面的图吧。

在昨天的课程中,我们知道了TemplateLink参数用来指定表单所需的模板,也提了一句关于Action参数的作用。而今天,Action参数就是主角。当你点击了表单上的按钮时,需要执行下一个动作以便让程序继续下去。而执行哪个动作就是由这个参数来决定的。

为了能让大家明白我在做什么,我写了另一个动作,这个动作中同样会显示出一张表单。也就是说,我们希望当我点击第一张表单,也就是昨天我们做的那张表单上的按钮时,显示出另一张表单。好啦,我们一步步来做吧。

第一步,打开动作文件,我们再写一个动作。如下图:

还是在fa.aspx页面上执行,但名称发生了变化。

第二步,我让这个动作也显示出昨天的那张表单。如下图:

你也许会问,两个动作中都显示同一张表单,岂不是看不出效果吗?不会的,这里正好可以说明白FormTitle参数的作用。

第三步,我使用了FormTitle参数,如下图:

第四步,回到上一个动作,也就是昨天做的那个动作中,我们要给<ViewForm>标签的Action参数做点文章了,如下图:

看图中红圈的部分,我在Action参数中填入了刚刚做的那个动作的名称,也就是,当点击该表单的按钮时,系统会执行该动作。

第六步,保存文件。打开浏览器我们试试看……

现在我们点击“登陆”按钮……

你已经看到了,表单的标题发生了变化,并且说明我们今天写的two动作已经执行了。是这样,当你重用一张表单时,你可以使用FormTitle参数来重新设置表单的标题,就像例子中那样。

另外,使用动作进行值传递也是很常用的,下面我们使用两张表单来试一试,别小看这个,挺有用的。

我希望在第一张表单上填写的东西,在执行下一个动作的时候,使用这张新做的表单能把数据回显出来。

第一步,打开表单文件,我们创建两张表单吧,用同一张表单来演示传值,太晕了,呵呵。

再来一张。

第二步,既然要进行值的传递,那么就需要对DemoForm2这张表单“做做手脚”了,如下图:

还记得红线处的那几个参数吗?在介绍表单的教程中我们谈起过,例子中,myname="Value"和mypass="Value"指的是声明了两个变量来接收从外部传过来的值,而LinkValue参数指的是将接收过来的值显示在Input中,还记得吧?

第三步,我们需要打开动作文件,让两个动作分别显示出这两张表单,如下图:

a动作显示表单DemoForm。

two动作显示表单DemoForm2

第四步,重点!就是在这里,我们需要写明,这张表单将接收上一个动作传过来的值,如下图:

解释一下,随着上一个动作的执行,我们在那张表单中填入的值已经被传递到这个动作中了,所以,这里我们必须使用两个全局变量来接收它们,然后放到表单中去,才能实现回显,明白了吗?还有,注意ViewForm标签的使用。

第五步,保存好一切,打开浏览器,执行一下试试看。

然后点击按钮,执行下一个动作,如下图:

值已经传过来了。使用动作来传值是挺有用的技术,比如,当用户修改个人资料的时候,就需要这种回显,所以说,学会了很方便,很好用。

今天就说这么多了……

大家好!今天是第四天的课程,我们来说说在动作中调用其他几种资源,如字符资源,数据库操作集,以及模组。呵呵……好像要说的很多啊……废话不说了,开始吧!

先说说字符资源。昨天我们一直在说表单,试着用表单来连接动作,传值等等。这种连接动作使用的是post方式,而今天我们要使用get方式来连接动作,这就需要使用字符资源。

首先,打开设计器和DW,我们来创建一个字符资源,并且让它显示出来。

第一步,打开设计器,找到一个名称空间,右键选中它,选择“编辑”。如下图:

第二步,我们按下“新建”按钮,新建一个字符资源,并且给它一个名称。如下图:

第三步,点击“确定”来保存。我们在设计器的“字符”列表中可以看到它了,现在我们右键选中它,选择“辅助”-“复制Echo”,如下图:

第六步,打开动作文件,我们还是使用这几天来一直在用的a动作,呵呵。我们将显示表单那句代码删掉,如下图:

第七步,我们按下Ctrl+V,如下图:

我们看到的<Echo>标签就是用来显示字符资源的,好了,现在保存好,打开浏览器执行这个动作,如下图:

一个简单的字符资源就显示出来了。当然,字符资源并不是这么简单的东西,它里面可以包含很多其他的资源,比如数据库操作集,模组,甚至还可以再调用另一个字符资源。除此之外,使用字符资源来连接动作也是常用的,这就是我们说起过的get方式,下面我们就来试一试。

第一步,在设计器中我们找到刚才那个字符资源,右键选中它,选择“编辑此资源”,如果先前你在“设置外部编辑器”中选择了使用DW来编辑字符资源的话,那么就会直接用DW打开它,如下图:

第二步,我们动手将它改为一个超链接,如下图:

第三步,注意红线部分,我将第二个动作的绝对地址写了进去,然后保存。回到设计器那边,会弹出一个提示框,我们选择“是”,如下图:

回到浏览器,我们再次执行一下这个动作,如下图:

当我们把鼠标放到连接上面的时候,注意看左下方,如下图:

这不就是你熟悉的get方式吗?当我们点击这个链接时,动作得到了执行,如下图:

使用这种get方式也可以传值,我们再次打开这个字符资源进行修改,如下图:

注意看红线部分,我用这个地址传递了两个变量过去,第一个是myname=a,第二个是mypass=b,现在我们保存一下,再次执行一下动作,如下图:

现在左下方的地址发生变化了,点击链接。如下图:

值已经传过去了。这种方式传值也是常用的,希望你能学会。

字符资源中的可以做到的事情非常多,比如,你可以在这里加入一些逻辑,下面我们来做一下试试看。

首先,我们打开刚才创建的那个叫做demo的字符资源来改一改,如下图:

示例中,我做了三个链接,当点击它们时,会分别传递了三个不同的值到下一个动作。

第二步,我再写一个字符资源来接收这值,这个字符资源叫做demo2。在这里,我使用到了NoahWeb中的逻辑判断语句,如下图:

根据上一个字符资源传递的值,这里将会有不同的显示。

第三步,打开动作文件,我们使用two动作显示这个带有逻辑判断的字符资源,因为随着第一个动作中链接的点击,这个动作将被激发,如下图:

好啦!现在我们打开浏览器执行一下,如下图:

现在我点击第一条链接,看看效果……^_^

现在,myname=a这个值传过来了,我们看到,由于第一个判断条件成立,所以这里只显示出了第一个<tr>之中的内容。我们再退回去试试其他的。

显示效果如何呢?

很成功!第二个<tr>中的内容显示出来了。最后我们在试试第三个链接。

呼……现在都完成了。你是否明白了呢?字符资源中能做到的事情还有很多很多,这里的逻辑判断是再普通不过的技术。我想说的是,用这种技术来控制流程是你应该学会的,今天说的可能有点难,多试试你就明白了……好啦!累死我了……明天继续……

今天是NoahWeb逻辑层教程的最后一天了。首先感谢大家几天来的支持,如果有不好的地方,大家多包含多包含……今天我们要使用前几天所学到的全部知识来试着做一套简单的流程,这其中我们会学习到关于数据库操作集在动作中的应用。很有挑战啊……呵呵。

 

我们先来了解一下这套流程的功能。页面上提供两个链接,分别是“添加”和“查看”。点击“添加”的时候,页面上应当显示出表单以便添加资料,当添加完成提交表单之后,可以使用查看链接来查看已添加的资料列表,列表中同样提供“查看详细信息”的链接,点击之后,重用表单显示出详细信息,并且,在这里可以修改信息。怎么样?觉得困难吗?这些功能会使用到前几天的所有知识。ok!go!

第一步,我们打开动作执行文件将输出区稍做修改,如下图:

这时,输出区在页面中被分为了左右两个,左边是oa区,右边是ob区。我们要在oa区显示出两个链接,这需要使用到字符资源,我们来创建这个字符资源,示例中这个字符资源的名称叫做list,如下图:

第二步,这是字符资源中的两个链接,我们需要给出地址,动作名,以便过一会儿这两个链接都能干活。^_^

第三步,打开动作文件,我们需要a动作来显示这个字符资源,如下图:

这里需要解释一下,前几天的教程中,一个动作中只会出现一个输出区,但现在变成了两个,因为我们需要链接一直显示在页面左边以便点击,如下图:

我们让带有两个链接的字符资源list显示在oa区,明白吧?

第四步,我们打开浏览器来看一看效果,如下图:

看到效果,对于上面说的功能你有了个大概了解了吧?好啦!我们继续。

第五步,我们要开始实现功能了。刚才我们在写这两个链接的时候,已经给出了明确的地址已经所执行的动作名称,如下图:

第六步,既然是“添加资料”,那么我们就需要一张表单来添加,做一张表单吧……

第七步,我们打开动作文件,写出b动作,并让这个动作显示出我们刚刚做好的表单,如下图:

这里得解释一下,我们在这个b动作中还是放了两个输出区,oa区始终显示那两个导航链接,而ob区则显示表单,保存一下,执行这个动作,看看效果吧。^_^

在下面完成的动作里,我们始终需要放两个输出区,因为这两个导航链接会始终出现的。

第一阶段到这里也就结束了。

想想看,当你将资料填写完毕点击“提交”按钮的时候,需要执行一个动作,而这个动作的职责就是将你填写的资料插入到数据库中,呵呵,我们得用到数据库这一块了。

第一步,我们在数据库中建库,建表,示例中我使用的是SQLServer,如下图:

表结构是这样的,如下图:

其中,id字段为主键,并且自增长。

第二步,我们回到设计器,使用"数据库链接",我们连上刚才创建的那个demo库,如下图:

现在的样子是这样的。

第三步,我们要创建一个“添加资料”,也就是插入操作的数据库操作集,回到设计器,开始!

这里要注意了!有关查询集的名称命名规则NoahWeb官方建议了一整套命名规则,有兴趣的话可以看一下《官方命名规则》,另外,由于建表的时候,我们将id字段设置为主键并且自增长,所以,进行插入操作的时候,我们就不能插入id的值,否则会报错的。那么我们就需要在“局部变量”一栏中将id删掉,切记!如下图:

注意下面的图:

然后,在“设置变量”一栏中也要删掉id,如下图:

删掉!

OK!做完这些,保存好,数据库操作集也就创建完毕了。如下图:

第四步,回到动作文件中,我们来想想流程,当你填写资料之后,点击“提交按钮”,将执行一个动作,那么在这个动作就需要调用这个数据库操作集以完成插入操作。如下图:

我们先到动作文件中新建一个动作,并且在b动作的表单提交时执行它。如下图:

第五步,由于这个动作要调用那个数据库操作集,所以我们需要回到设计器,找到那个数据库操作集,右键选中它,选择“辅助”-“复制SQLLINK”,如下图:

回到动作文件中,我们在刚刚新建的这个动作中按下Ctrl+V,如下图:

第六步,通过注释我们可以知道,这里需要给数据库操作集传值。(呵呵我废话了!要不插入什么呀???)前几天的教程中我们知道,随着表单的提交,我们填入的值都会传到这里,那么我们需要使用几个全局变量来进行接收,这和前几天讲的完全相同,如下图:

好啦!这就完成了。我们试一试看看能不能工作,如下图:

填写一些数据之后,我们点击“提交”,为了看到效果,我们打开数据库来看,如下图:

很好!数据已经插进去了……等等,是不是当提交之后,应该在页面上有些显示呢?至少应该给出“添加完成”之类的提示吧?还有,还应该给出一个链接“查看已提交的资料”,人性化一点嘛……呵呵

这需要一个字符资源……我们来做,如下图:

其实,这里的链接和页面左边的导航链接中的“查看资料”是一样的,所以,我们将那个链接的地址复制过来就可以了。如下图:

让动作显示这个字符资源,示例中我的字符资源叫做addok,如下图:

动作中的代码是这样的。

现在我们再插入一条资料,如下图:

再看看数据库那边……

好啦!“添加资料”的工作我们做完了……现在我们要实现“查看资料”的功能了。

第一步,想想流程,既然要查看资料,那应该显示出一个列表,想看哪条看哪条才对吧。这个列表是个字符资源,我们开始做!

第二步,列表中要显示出一条条的资料,这可不能手添,用数据库操作集来查询返回数据,形成一个列表多方便啊!我们创建一个查询的数据库操作集。

查询返回所有记录的数据库操作集很方便,没有什么条件,点击关闭保存就好。

第三步,很重要!我们需要使用NoahLoop配合这个操作集来完成列表,如果你看过前些日子那篇“制作动态网站”的文章,对于Loop应该是熟悉的,这里我就不多讲了。看图吧。

把操作集放进去……

然后,使用<NoahVlaue>标签指定出显示的字段名称……

第四步,相信你也看到了,我留出了一个<td>,它使用来放置"修改"链接的。这个链接有点学问,它需要传一个值到下一个动作中。是这样的,当点击一条资料的“修改”链接时,应该用表单回显出这条资料的信息以便修改。

如何实现回显呢?传值。传什么值呢?告诉你,再使用一个数据库操作集来查询返回记录,传的值的就是返回的记录。

那你可能要问,我怎么知道它查的哪条记录啊?所以啊……随着链接传过去的值其实就是查询条件!这样吧!我们一步一步做,你就明白了……

先把这个链接写好……

上面说到过,随这个链接传过去的是一个查询条件,用什么做为查询条件呢?id.因为id是主键并且自增长,所以,用它做为查询条件确保能够返回唯一的一条记录。也就是说,当你点击一条资料的“修改”链接时,随着链接就把这条资料在数据库中的id值传过去了。

好啦!列表也做完了,现在打开浏览器,我们试一试,如下图:

当我们把鼠标放在“修改资料”的链接上的时候,左下方出现了地址,这是你熟悉的get方式,注意链接的最后,id=1,这里的1就是数据库字段id的值,如果放在第二条资料上,如下图:

打开数据库,我们看看到底是不是这样……

别小看这个传值,下面我们要做的“修改资料”功能,全靠这个值了!想想,点击一条资料的“修改”链接时,表单要回显出这条资料的信息,这需要查库的,这个值是主键值,所以用它来查询是绝对不会错的!

下面我们来实现修改资料的功能,在刚才那个链接中,我们写入了要执行的动作名称,相对于的,我们现在在动作文件中就要写这个动作。如下图:

第一步,打开动作文件,我们创建出这个动作,如下图:

第二步,刚才说过了,需要使用表单来回显信息,没有必要重新写一张表单,重用填写资料的那张就好了。如下图:

第三步,光有一张表单是不行的,它必须回显出信息,刚才也说过了,我们需要使用传过来的值做为条件查询数据库,为此,我们还要创建一个数据库操作集,如下图:

由于这个操作集有查询条件,就没那么简单了,打开"局部变量"一栏,我们先来创建一个局部变量,如下图:

然后打开“查询条件”一栏设置一番。如下图:

第四步,保存关闭。使用“辅助”功能,我们在动作中调用这个操作集,如下图:

第五步,根据注释我们知道,这个操作集的执行就需要一个参数,那就是它的查询条件,用哪个呢?不用再说了吧?就是传过来的id呀!如下图:

现在,我们就可以用表单来接收值了!等一下,那还得把表单小改一番,如下图:

第六步,好啦!现在表单可以接收到值了,我们回到动作文件中写一下,如下图:

注意,给表单传值的顺序一定要和表单接收值的顺序一致才行。

怎么?看不懂了?解释一下吧。首先,_SQl表示这个变量是数据库操作返回结果,_this表示当前名称空间下,然后就是操作集名称,那个0(零)表示数据库当前行,最后的就是字段名称了。

为什么要用这个“麻烦”的东西呢?这个表单回显的就是上面那个操作集的返回结果,那个操作集用的查询条件是上一个动作传过来的值,就是你选择的那条资料的id值……现在我们试一试,如下图:

先添加一条资料。

现在可以回显出资料了,最后的工作是完成“修改”功能,其实到了这里已经很简单了,再加一个数据库操作集来做更新操作,然后加一个动作执行这个操作集就是了。

第一步,回到设计器,我们来创建一个更新操作的操作集,如下图:

我们打开“查询条件”一栏,创建一个更新条件,如下图:

然后,打开“设置变量”一栏,来设置好需要更新的字段,这里需要把id字段删掉,因为它是不需要更新的,如下图:

Ok!保存关闭。现在我们需要写个动作来调用这个数据库操作集,如下图:

最后一步,当表单提交之后,需要执行这个动作……别说你不知道怎么做?^_^

呼……试试看吧!~

我们准备修改这一条资料。

点击提交按钮……

哈哈!不好意思……忘了这里也需要一个字符资源来给出提示信息……这是小事,我们先来看看刚才那条资料是否被修改了。如下图

最后,我们做一个字符资源来提示“修改成功”……

让执行更新操作的那个动作显示它,如下图:

这样,当我们再次进行修改操作之后……

好累啊……总算写完了……现在,文章开始谈到的功能都已经实现了,你是不是学会了呢?其实,只要注意多次的传值,已经数据库操作集的使用就应该没什么问题。重要的是,使用动作来设计流程,操作流程,以及控制流程。应该说还是比较简单的,不过我的文笔比较差,可能有些地方没能够讲清楚,你自己再花点时间琢磨琢磨吧。为了能让你学明白,我把我的全部代码打了个包,需要的话下载,然后配置一下就可以使用了。点击这里下载 示范代码。其实这个小流程应该还提供“删除资料”的操作,这就留给你来完成吧!一定行的!

注:文章中所有示例的地址,为了让大家看的明白所以我使用的是绝对地址来书写,如:“http://localhost/NS1/fa.aspx” 大家实际制作时可以用相对地址来写(写成“/NS1/fa.aspx”这样更方便移动到不同域名下使用)。

写了好多终于大功告成了!祝学习时好运!^_^

第四章:NoahWeb中的资源

  NoahWeb使用动作编程为灵魂,在这个领域中,存在的只有“动作”和“资源”,二者的关系则是“动作”调用“资源”。没有动作,资源无法工作,因为资源本身就是为了动作的调用而存在的。学会使用各种资源,你才能更加得心应手的开发你的应用。比如,学会使用数据库操作集可以帮你高效灵活的操作数据库;学会使用模组可以有效地为你降低代码量;而且,由于NoahWeb设计器的集中管理,使得各种资源的重用性很强。下面的文章中,详细介绍了各种资源的创建以及使用技巧,为你开辟了一条熟悉NoahWeb的捷径。

字符是NoahWeb中的重要资源之一,它和表单资源一样也是做页面显示所使用的一种表现形式。字符资源的内容可以是任何文本形式的代码,被封装在ResourceStrings.xml.config文件中,代码中也可以加入JavaScript、数据库操作集等内容,使页面的输出更丰富多彩。

字符资源的代码可以直接在NoahWeb设计器中编辑,前提是你对文本代码的编写非常的熟悉,例如:HTML,如果不是的话还是用工具吧,这里我推荐用Dreamweaver,相信这个软件大家都很熟悉了,NoahWeb有一个专门为Dreamweaver编写表现层而开发的插件,它可以集成在Dreamweaver里面,这样可以给你写字符资源带来很大方便。如果你没有这个插件的话可以到NoahWeb官方网站去下载,下载网址:http://www.noahweb.net/download/,名字为:Dreamweaver NoahWeb扩展,当集成了扩展插件后Dreamweaver的插入栏里会多出三个NoahWeb的标签组:

字符资源是为了体现资源重用的,很多的字符资源在很多系统中都可以重复用到的,这样就可以节省一定的时间,从而减少开发周期。

1.编辑项目中的字符资源

首先打开NoahWeb设计器,点击进入一个已有的站点或者是新建一个站点,相信大家都已经会建立新的站点了吧,就不在赘叙了,这里选择在一个新建站点里给大家做示例,进入站点后在左上角会看到下面界面:

然后右键点击一个名称空间,选择“编辑”会进入到新建字符资源的界面:

这样就可以看到选中的名称空间下所有的字符资源了。如下图:(现在一个字符资源都还没有)

我们可以点图片底部的“新建”按钮来新建一个新的字符资源,点击新建后出现下面对话框:

在对话框里添入名称loginout,在内容里输入下面框中的代码,你也可以直接从这里复制粘贴过去:

代码如下:

 

<table width="100%" height="219" border="0" cellpadding="0" cellspacing="0">
<tr>
<td height="219" align="center" valign="middle"><font color=red style="font-size:12px;">您已经正常退出管理系统,感谢您的使用!<a href="<!-- NoahValue ValueName="http://localhost/example/example.aspx?action=outlogin" -->">点这重新登陆</a></font></td>
</tr>
</table>

 

代码拷贝框


[Ctrl+A 全部选择 然后拷贝]

然后点确定提交,这时后边页面中的存盘按钮已经由原来的不可用状态变成可以点击了,点击存盘一个新的字符资源就完成了,如下图:

2、在逻辑层中使用字符资源

字符资源建完后怎样能看到它呢?在字符资源列表里找到刚才建好的这个字符loginout,在loginout上点击“辅助”,选“复制Echo”,如下图:

字符是在动作中被调用的,右键点击‘example’,选‘使用外部编辑器’中的‘编辑此空间下的Action文件’,打开动作文件Action.xml.config,如下图:

创建一个新的动作Action 然后把刚才复制的Echo粘贴到Action里,代码如下:

 

 

这样在执行动作outlogin时,该字符就会在前端页面中显示出来,如图:

3.可为任意文本格式的字符资源

字符资源也可以用XML来写,下面是一段XML你可以把代码作为字符资源的内容:

 

代码拷贝框


[Ctrl+A 全部选择 然后拷贝]

新建一个字符资源名称为resource把代码考到新建字符资源的对话框里,然后新建一个Action:

<Action name="example.listresource" NextAction="">
    <Out Area="main">
        <Echo ContentLinkId="resource" />
    </Out>
</Action>

 

 

当调用动作listresource时,浏览器里是没有显示内容的,如下图:

原因是在这个页面中的XML代码都被当成HTML代码来解析了,我们可以点击浏览器中的‘查看’下面的‘源文件’来看看这个页面的代码,代码里就包含字符资源的内容,如下图:

4.字符资源中的逻辑

在字符资源里面还可以写逻辑(可以使用NoahWeb表现层指令编写任何的逻辑),下面我们来看一个有判断的字符资源,新建一个字符名称为ifelse,字符内容为:

 

 

然后建立一个Action,打开当前名称空间下的Action.xml.config文件,在Action文件中加入代码,代码为:

在这个Action里有一个SetVar,是用来给字符中的_root.a来传值的,当_root.a接收的值为1时,通过if语句做出判断,浏览器里会显示“您输入的值是1”,如下图:

当_root.a接收的值为2时,通过判断浏览器里会显示“您输入的值是2”,这个大家可以自己动手把1改成2,然后执行一下动作看看结果。

5._TEXT变量前缀关键词的妙用

到这,相信大家对字符资源多少已经有些了解了,这里还要给大家再介绍一下_TEXT这个变量前缀关键词,我们可以在NoahWeb表现层或是逻辑层中用_TEXT来调用一个已经存在的字符资源,这里我们新建一个只有简单文字的字符资源,字符资源起名为resourceByText,如下图:

字符资源代码中声名了一个NoahValue标签来调用动作中声名的变量message。

接下来还需要一个动作来打印字符资源,动作名为resourceByresource,动作部分代码为:

 

 

 

代码中声明了一个变量message,变量中用_TEXT调用了aaa这个字符资源,aaa字符资源代码如下:

下面我们来执行一下resourceByresource这个动作,看看在字符资源中调用字符资源的显示结果,如下图:

从上图可以看出在字符资源resourceByText的两段文字之前打印出了aaa这个字符资源,_TEXT前缀变量关键词的用法还有很多,有兴趣的可以看看NoahWeb的在线官方文档。

好了这次的字符资源就讲到这里了,最后给大家重声一下:字符资源的内容可以是任何文本形式的代码,只要是文本代码你就可以把它做成字符资源。

有详细问题的话你也可查看NoahWeb官方网站的帮助文档,网址为:http://docs.noahweb.net

教程中示例源码可以点这下载

NoahWeb应用——模组资源

这次给大家介绍一下NoahWeb中的模组,模组Module和动作Action一样,都是NoahWeb中的逻辑层部分,如果你对动做有所了解的话,会对你学习模组有很大的帮助,动作中可以实现的功能和语法,在模组中你都可以实现。关于模组,你可以暂时把它理解为面向对象的‘方法’,大家都知道方法是一段被封装好的代码,在使用的时候只要调用这个方法的名称就可以了,这样可以很大程度上减少代码量而且易于维护,模组的使用同样可以达到这个效果,而且在表现层和逻辑层都可以调用,这样也可以体现出代码的重用。好了下面就具体给大家说一下模组。

  首先我们来看看一段模组文件的代码:

 

<?xml version="1.0" encoding="gb2312"?>
<Modules NameSpace="siteroot">
</Modules>

  上面的代码是一个空的模组文件,里面没有任何内容,只有一个简单的描述,由代码可以看出模组文件是使用XML格式来描述的。第二行中有个名称空间的声名<Modules NameSpace="siteroot">,‘siteroot’是一个名称空间,名称空间下的资源文件都存储名称空间所对应的目录下的config文件夹中,反过来说一个目录中的config文件中的所有资源都属于一个名称空间,而模组里的代码就存储在当前名称空间下的Module.xml.config这个文件里面,例如,你的站点存在D盘下,根站点名称为demo,"siteroot"是这个站点的根目录下的名称空间,则"siteroot"下的Module.xml.config这个文件就存储在D:/demo/config下面。

  因此不同名称空间下的模组文件是存储在不同位置的,比如说你新建了一个名为example的名称空间,那么第二行中声名的名称空间就应该是example,代码为:<Modules NameSpace="example">,而Module.xml.config这个文件就应该存储在D:/demo/example/config中。

  下面我们来看几个例子分别实现:

  • 创建一个模组;
  • 在逻辑层调用模组;
  • 表现层调用模组;
  • 在模组设置局部变量和全局变量。

1.先做准备一下其他的资源

  在调用模组前我们先准备两个字符资源,这样方便后面模组中调用,建字符资源过程如下:

  打开设计器,选择一个已有的站点,然后选中一个名称空间,右键选择‘编辑’,如下图:

  点击编辑后进入编辑器界面,如下图:

  点击‘新建’按钮打开编辑页面,然后输入字符资源的名称和内容,如下图:

  然后点击‘确定’回到上一页面,保存字符资源。

  继续新建第二个字符资源为:

  然后点击‘确定’回到上一页面,保存字符资源,这样两个字符资源就建好了。

2、编写第一个模组

  现在我们来编写第一个模组。打开设计器,右键选中当前的名称空间,在‘使用外部编辑器’中选择‘编辑此空间下的Module文件’如下图:

  应该会看到下面的代码:

 

<?xml version="1.0" encoding="gb2312"?>
<Modules NameSpace="example">
</Modules>

  在文件中新建一个Module,起名为test。代码如下:

 

<?xml version="1.0" encoding="gb2312"?>
<Modules NameSpace="example">

   <Module Id="test">

   </Module>

</Modules>

  然后在模组中用If语句做判断,当全局变量_root.number为1时,打印一个字符资源source1,当全局变量_root.number为2时,打印另一个字符资源source2。加入判断后的完整代码如下(我省略Moudles不显示了):

 

<Module Id="test">
    
<If EX="[_root.number]==1">
        
<Echo ContentLinkId="source1" />
    
</If>
    
<If EX="[_root.number]==2">
        
<Echo ContentLinkId="source2" />
    
</If>
</Module> 

  被加粗的字体部分在模组中打印字符资源。

3、在逻辑层中调用模组

  模组自身是不能被执行需要在动作中调用,所以为了调用模组,我们还需要再建两个动作action,一个赋值为1,一个赋值为2。打开设计器,右键点击example名称空间,选中‘使用外部编辑器’中的‘编辑此空间下的Action文件’,如下图:

  在动作文件Action.xml.config中加入两个Action,第一个Action起名为‘test1’,代码如下:

 

<Action name="example.test1" NextAction="">
    
<SetVar Name="number" Value="'1'" />
        
<Out Area="main">
            
<ModuleLink Id="test" />
        
</Out>
</Action>

  上面代码<SetVar Name="number" Value="'1'" />中,用SetVar设置变量number的值为1,然后调用模组test。我们可以这样调用模组,打开设计器选中‘模组’栏,然后找到上面建好的模组test,右键点击test选‘辅助’里面的‘复制ModuleLink’,如下图:

  然后回到代码中把复制的ModuleLink粘贴到Action代码中就可以了。

  第二个Action起名为‘test2’,代码如下:

 

<Action name="example.test2" NextAction="">
    
<SetVar Name="number" Value="2" />
    
<Out Area="main">
        
<ModuleLink Id="test" />
    
</Out>
</Action>

  当执行动作'test1'时调用模组test,模组根据number的赋值来判断打印哪个字符资源,因为赋值为1,所以打印字符资源‘source1’,如下图:

  当执行动作'test2'时因为赋值为2,所以打印字符资源‘source2’,如下图:

4.在表现层调用模组

  下面我们来说说如果在表现层中调用该模组,这里我们需要用Dreamweaver来新建一个新的HTML页面,如下图:

  这里我们需要在HTML文件中的第一行加入一个NoahWeb的标签,要注意的是NoahWeb的这个标签必须放在第一行。把当前第一行的代码向下移一行,把光标指向第一行的开始部分,然后点击‘插入’菜单栏里‘NoahWeb Base Objects’下面的‘NoahPageHeadTag’标签,如下图:

  插入标签后就可以直接用NoahWeb引擎来解析此文件了,页面如下:

  下面我们还需要在页面中插入两个标签,一个是为number赋值的NoahSetValue,另一个是调用模组的标签。首先我们来插入赋值的NoahSetValue标签,把光标指向body体中,然后选择菜单栏‘插入’标签下‘NoahWeb Objects’下面的'NoahSetValue',如下图:

  加入标签后body体中会出现一灰颜色的代码,如下图:

  在SetName后面添入变量名称number,在SetValue后面添入值2,如下图:

  现在加入调用模组的标签,这里我们需要继续使用上面建好的模组test和字符资源source1、source2。打开设计器中的模组面板,在example名称空间下右键选择test这个模组,然后选择'辅助'下面的‘复制Noah’

  回到Dreamweaver中把刚才复制的模组粘贴到NoahSetValue标签的下面,如下图:

  加入标签后,保存文件,这里要注意的是,保存时要把文件保存成aspx文件格式,而且要把文件保存在example文件夹下面,如下图:

  这样表现层调用模组的文件就写好了,下面我们在浏览器中调用test.aspx这个文件看看结果,如下图:

  由于我们在页面中赋的值是‘2’所以浏览器中显示的是字符资源‘source2’。

  有兴趣的朋友可以亲自动手做一下,把SetValue的值改成‘1’,然后调用这个页面看看结果吧。

5.在模组设置局部变量和全局变量

  在模组中我们还可以通过设置局部变量和全局变量来让模组能更方便的重用,下面我们来看一个在模组中设置局部变量和全局变量的例子:在模组中设置两个局部变量x和y,然后把两个局部变量相加得到的值传给全局变量_root.sum,然后在动作中设置局部变量x和y所接收的值并打印字符资源。下面我们来看看具体部骤:

  首先打开Module.xml.config文件新建一个Module文件,命名为summation,代码为:

 

<Module Id="summation" x="Value" y="Value">
    
<SetVar Name="_root.sum" Value="[x]+[y]" />
</Module>

  之后我们再来建一个字符资源,在字符资源中调用全局变量做输出。新建一个字符资源起名为sum,字符资源代码如下:

 

<br>&nbsp x+y=<!-- NoahValue ValueName="[_root.sum]" MaxChar="" DChar="" Safety="False" -->

  字符资源中调用全局变量_root.sum作为x+y的显示结果。

  新建字符资源如下图:

  建立好字符资源后我们还需要在Action.xml.config新建一个动作来为局部变量传值和打印字符资源,动作名为:summation,动作部分代码如下:

 

<Action name="example.summation" NextAction="">
    
<Out Area="main">
        
<ModuleLink Id="summation" >
            
<!-- 设置Module中声明的局部变量x所接收的值 -->
            
<Var Value="3" />
            
<!-- 设置Module中声明的局部变量y所接收的值 -->
            
<Var Value="9" />
        
</ModuleLink>
        
<Echo ContentLinkId="sum" />
    
</Out>
</Action>

  在动作中我们分另为两个变量x和y传入了值,之后打印字符资源,下面我们来执行一下summation这个动作,看看动作执行的结果,如下图:

  在动作中为x和y传入的值分别是3和9,3加9的和为12,所以浏览器中输出的信息是x+y=12。

  同样表现层也可以调用这个Moudle,详细的操作步骤我就不说了,具体的代码就是

 

<!-- Noah ModuleLinkId="summation" Value="3" Value="9" -->
<!-- NoahValue ValueName="[_TEXT._this.sum]" MaxChar="" DChar="" Safety="False" -->

  好了模组部分的内容就简单给大家先介绍到这里了,模组强大而且很灵活,做的过程中如果有什么不能理解的可以到NoahWeb的官方论坛去问问,官方论坛地址:http://bbs.noahweb.net

  本文所用示例可在这下载:示例下载

第五章:突破传统的开发模式

  NoahWeb不仅仅带来了全新的编程理念,更重要的是,她带来了一套完整的,可行性很高的,适用于任何语言的开发模式,这就是“增量迭代”。面对一些项目规模略大、周期略长,特别是需求变更频繁的系统,使用NoahWeb配合“增量迭代”开发模式,能够大幅提高开发效率,成缩短开发周期,而且,因需求变更所造成的风险将降至最低。下面是一篇开发手记,记录着使用NoahWeb配合“增量迭代”开发模式的每一步骤。

五天实现CSDN新闻MIS系统开发

软件行业发展了很多年,已经衍生出各种开发模式,像RUP,极限编程等等。而本文详细记录了我在使用轻量级B/S引擎NoahWeb来开发B/S结构的CSDN新闻MIS系统的时所使用的“增量迭代”开发模式的过程。意在让更多的人能了解和对比NoahWeb中所倡导的“增量迭代”开发模式同其他模式的不同之处。

特别感谢:撰写本文时由于得到CSDN相关部门的大力支持!因此文中所提MIS系统的各阶段源码也随本文同时提供,在了解这套MIS系统的开发模式的同时,有兴趣的读者还可以深入了解一下CSDN对新闻采编所使用的先进管理经验,再次感谢CSDN为我们无私的公开该项目源码与管理思想。

先来和大家介绍一下本文中将要登场的三个人物(使用代称):

  • James-我公司的客户经理
  • Neo-CSDN管理人员
  • job-也就是我,这个项目的具体实施者
  • 另外还有CSDN一些使用该系统的使用者。


6月8日(星期三):需求分析阶段

上午

  早晨到公司上班,James告诉我有一个新的系统要开发,是CSDN的一个MIS系统。并把头天晚上他和Neo在MSN进行的一段交谈记录发给了我,并要我尽快完成这个项目,MSN谈话中Neo详细讲述了他所需要的新闻报道的MIS系统的需求,看后我对系统也有了个大概了解。

MSN中的内容如下:

  由于NoahWeb开源示例中已经有一套成型的MIS权限管理示例,并提供了完整的源码,所以有关MIS中的权限这部分我觉得我没必要再做了,可以直接以它为蓝本继续开发。另一方面虽然Neo对所系统的需求已经描述的很仔细,可是系统中有关系的元素很多。我和Neo之间的理解可能会有很大差异,因此开发管理上我决定采用“增量迭代”模式,逐步探索该系统的需求,同时保证整个项目能尽快完成。

  因此,第一步:我先用假页面进行系统策划,以便更多更深刻的了解Neo那边的需求。

下午

15点36分:经过一系列分析,我制作出假页面交付给James,我们的目的是更多更深刻的了解Neo那边的需求。这时的假界面版本暂定为1.0。

策划1.0版本


James把这个策划发给了Neo,其中他们又使用了MSN进行沟通,对话内容如下:

15点41分:我回头看James和Neo在MSN对话的时候发现策划1.0版本中我遗漏了“搜索产品的功能”,呵没办法,常言到智者千虑也必有一失嘛。没等Neo给我反馈,我已经开始修改策划,又发了一套假页面的策划给James,这个版本为1.1。
策划1.1版本

16点53分:James拿到了Neo那边的意见,意见如下:
MSN对话内容

为此我再次制作出了1.2版本的策划假页面。

策划1.2版本

18点26分:James发来了和Neo的对话。策划出来的假页面已经不需要进行修改,这是个不错的消息。明天准备开始写代码实现功能。
原对话内容

  今天用静态页面做了好几个策划版本,目的是通过这些的界面可以让客户通过一定程度的真实体验感去体会系统最后开发出来的效果,从而提出反馈获得帮助获得更准确的需求,通过这几次的修改对客户的需求会更快更深的了解,这无疑是一种非常好的低成本增加效率的方式,也能大大减少开发后期需求变化的可能,至少不会出现和用户需求“大相径庭”的现象。


6月9日(星期四) - 6月10日(星期五) :编码实现阶段

  从策划分析确定了这个MIS系统很小,所以“增量迭代”后面的过程我就简化了。周四和周五两天内没再同James或是Neo沟通,根据最后确定的策划1.2版,开始设计数据库和编写代码,由于NoahWeb的编码机制很利于“增量迭代”模式的开发,而且有很强的表单支持,资源重用很容易,所以在两天内整套MIS系统的功能就都实现了。


  MIS系统1.0版本下载(根据策划1.2 版,完成的实际版本MIS版本1.0)

  给James发过去了代码,James在下班前把1.0版发给了CSDN的Neo,呵呵本周工作结束,周末我可以好好休息了。


6月13日(星期一)空闲

  今天没我啥事,可能CSDN那边还未进行部署吧。我继续做我别的事情。


6月14日(星期二)变更阶段

上午

  依旧没我啥事情,我接着弄别的。

下午

16点15分:CSDN的Neo给James发来了系统安装后的一个错误日志报告,我忽略的一个小BUG。
对话内容

为此我赶快发送了将缺少资源的两个文件进行替换解决了此BUG。

16点22分:CSDN那边试用过系统之后发来了反馈意见,呵呵意料中的事了,一个系统没真正使用前谁也不能体会真实的使用感觉,所以在试运行阶段,变更是肯定的,这个正好也是“增量迭代”的中心思想!
对话内容

18点29分:经过修改,把1.1版本给James发过去了。
MIS系统1.1版本下载

18点47分:Neo和James联系,那边对于1.1版本基本上满意了,任务顺利完成。
对话内容


后记:

  “增量迭代”模式本身源于实际B/S项目开发的经验,它将整个必要的开发过程分成多个迭代过程,并通过迭代探索用户真实需求,并在每次迭代的同时根据最新获得的需求调整最终系统,使用迭代也将减少系统开发结束之后的变更工作量,把原本在项目最后阶段才会暴露出的变更融合进整个项目开发中,缩短开发周期!降低成本。

  本次的开发到这里也就结束了。5天开发完成出这么一套系统的确不是一件容易的事情,最初3个版本的策划假页面起了很大的帮助,如果没有这些工作,恐怕两周也不能开发完成。另一方面NoahWeb引擎所采用的高效编码机制对采用“增量迭代”模式下的编码效率和迭代中变更支持也起到了决定性的作用。

  希望这种开发模式能为大家带来一点点的灵感,谢谢。

更多有关NoahWeb和“增量迭代”开发模式的详细介绍,可查看:

网站设计与开发流程管理

  使用NoahWeb进行网站开发,您可以将开发过程分为三个阶段:需求阶段、实现阶段、以及发布阶段。在三个阶段中,您同样可做到始终探索用户需求,多次将DEMO交付客户进行演示,网站开发中由于NoahWeb程序编码特点所以您团队中的美术人员和程序人员编写的逻辑与表现是被分离的,整个网站开发阶段美术或逻辑的修改NoahWeb都可让您快速、轻松的面对。


[查看大图]

  • 需求分析阶段:
       这一阶段,您的需求分析人员首先设计出站点的SITEMAP,之后规划站点所需功能、内容结构页面等。功能、内容结构页面演示给客户可以让您迅速的了解到客户真实需求。减少变更的可能性。
    该阶段所要输出的文档:
    A. 站点SITEMAP的Excel文档。
    B. 所有静态内容的HTML文档。
  • 实现阶段:
      在功能、内容结构页面被确认后,您可以将功能、内容结构页面交付美工人员进行美术设计,随后再让客户通过设计界面进行确认,当用户对美术设计也确认以后可以开始为客户制作静态站点。再次对客户进行演示,在此静态站点上直至将界面设计和功能修改到客户满意。随后进行数据库设计和编码开发。编码时您的编码人员可以轻松的使用NoahWeb表现层指令快速将静态界面编码为动态界面。
  • 发布阶段:
      您的美术人员和编码人员依旧可以非常容易的根据需求变更修改站点,试运行阶段编码人员还可以根据NoahWeb引擎自动收集到的日志进行排错,测试。直至最后交付客户使用。

    业务系统(“增量迭代”)开发流程管理


          NoahWeb作为一套B/S轻量级快速开发引擎,能够帮助您快速实现网站以及信息系统的开发。而对于一些规模略大、周期略长,特别是需求变更频繁的系统,使用NoahWeb引擎配合“增量迭代”的开发模式,更能让您成倍的缩短项目周期,提高效率,节约成本。
           您可以从下文内容中体验一下使用NoahWeb来进行一个需求变化频繁的系统(如:网站后台内容管理系统、业务系统、OA。人员编制为2个全职开发人员、1个项目经理(工作量约为20%)、1个美工(工作量1周),整个项目周期在1-2个月)时的开发流程。

     



    [查看大图]

  • 需求分析阶段
           在这一阶段,您的需求分析人员的工作重点放在功能分析上。设计人员绘制UML用例图和分析数据库结构,并使用十分接近自然语言中对行为描述的一种方式——“动作”来展现系统的操作流程,该阶段系统设计人员无须考虑系统完整性。仅规划出系统所具有的主要功能。并根据“动作”列出“动作分解列表”。(注:NoahWeb中不存在类的概念,因此无需考虑程序结构)
    该输出文档所要输出的文档如下:
    A、 UML用例图:
    B、 动作分解列表:
    C、 数据库结构图:
  • 原型开发阶段:
       在这一阶段,您的编码人员需要生成各种资源的代码内容,由于NoahWeb中对各种资源均使用XML格式的代码描述和保存,XML文件最终被NoahWeb引擎解析,XML中的逻辑和描述又与最终呈现效果无关。这样可以让您的编码人员在该阶段无须考虑界面和最终呈现效果的问题,使得您的团队可以根据前期设计在较短时间内开发出原型。使用XML编码方式也为您和您的团队后续开发中出现的需求变更快速响应提供了一个非常有利的支持。
  • 实现阶段:
       利用NoahWeb程序松耦合的特点,您可以在此阶段将项目采用横向“增量迭代”和多人并行合作方式开发。
       “增量迭代”使您的最终用户在编码的多个阶段都可以从不同侧重点感受系统、了解细节。利用迭代为您引导出用户真正的需求。您的用户在整个实现阶段仍然能获得至少四次体验系统的机会,分别针对于整个系统的1、流程。 2、数据输入,数据回显。3、流程完整性。4、权限与系统完整性上得到体验,向您反馈出真实需求。
       在此阶段编码人员所编写的各类资源依旧是XML格式的代码,您可以让编码人员利用XML格式的各种优点并遵照 “NoahWeb资源命名规范”轻松实现多人并行合作开发。为了再次提高效率,您还可以让多个并行开发的编码人员之间成线性状分工,采用这样的分工,您的编码人员在相邻时间内会编写相似功能的代码,这些代码的编写方式相似,能大大缩短编码周期,并能降低整个系统BUG产生可能性,到项目后期测试阶段,也会方便测试人员更加容易寻找出由于相似原因导致的系统BUG。
  • 发布阶段:
       在这一阶段,系统进入试运行,开发接近尾声,最终用户会真正去使用您所开发的系统,由于之前几次“增量迭代”,这时候的系统已经很接近用户的真实需求,该阶段您的编码人员和测试人员工作重点是通过NoahWeb引擎自动收集到的错误日志对整个系统进行调试和排错,增强系统稳定性。在这一阶段发生的需求变更通常是最终用户人为原因导致,而NoahWeb在这一阶段依旧能让您轻松去面对这些意外变更。NoahWeb-让变化始终是您计划的一部分。
  • <Action name="example.resourceByresource" NextAction="">
        
    <Out Area="main">
            
    <SetVar Name="message" Value="[_TEXT.example.aaa]" />
            
    <Echo ContentLinkId="resourceByText" />
        
    </Out>
    </Action>

     

    <Action name="example.ifelse" NextAction="">
        
    <Out Area="main">
            
    <SetVar Name="_root.a" Value="1" />
            
    <Echo ContentLinkId="ifelse" />
        
    </Out>
    </Action>

    <!-- NoahIf EX="[_root.a]==1" -->您输入的值是1<!-- NoahElseIf EX="[_root.a]==2" -->您输入的值是2<!-- NoahEndIf --><br>

    <?xml version="1.0" encoding="gb2312"?>
    <exam>
        <!-- This is an example of resource--> 
        <resources>
            <!-- 这是一个用XML写的字符资源。--> 
        </resources> 
        <example>
            <!-- 是不是很简单啊?--> 
        </example>
    </exam>

    <Action name="example.outlogin" NextAction="">
        <Out Area="main">
            <Echo ContentLinkId="loginout" />
        </Out>
    </Action>

    【牛腩】总结—B/S这才刚刚开始

    历时一个月的牛腩新闻发布系统结束了,总结下这一个月学习牛腩的收获,激励自己前进的同时发现自己的不足。        看师哥师姐写的关于牛腩发布系统的总结最到位的一句话就是:麻雀虽小,五脏俱全。从...

    B/S学习之路—DOM(2)

    【03获取元素】 代码: //根据id获取元素,因为id是唯一的,所以只返回一个dom对象 var temp1 = ...

    重温B/S所学知识(一)—HTML

    我感觉只要你接触过HTML,就肯定知道它是一种超文本标记语言,不是编程语言。...

    B/S学习之路—DOM(3)

    【06加法计算器】 代码: //当页面加载完成后执行如下代码 onload = function () { //...

    B/S学习之路—DOM(1)

    【01对话框】 代码: //alert('123');//提示框,只有一个“确定”按钮 //确认框,有“确定”、“取消”两个按钮 ...

    PHP下用B/S编程模式去实现C/S软件编程模式下的插件引擎功能!

    • zqtsx
    • zqtsx
    • 2015年03月04日 18:24
    • 1332

    B/S学习之路—JavaScript学习笔记—第二天&DOM

    【DOM概述】 文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口。 【window、document、body的范围】...

    软件体系结构—B/S和C/S架构

    • 2015年01月07日 11:16
    • 363KB
    • 下载

    B/S学习之路—JavaScript学习笔记—第一天&基本语法

    【唠叨两句】               不得不承认学习是件枯燥乏味的事情,为了监督自己能坚持走下去并且做到知识的沉淀积累和升华特开通此博客撰写学习笔记,希望自己坚持到底同时也希望大家能多多指点共同...
    内容举报
    返回顶部
    收藏助手
    不良信息举报
    您举报文章:B/S引擎—NoahWeb专题
    举报原因:
    原因补充:

    (最多只允许输入30个字)