POPASP2.0 快速入门教程
欢迎您使用 POPASP,通过此教程,您将了解到 POPASP 的基本使用方法和一些使用技巧,包括 POPASP 的部署与配置、数据库的连接与链式操作、增删改查、后台表单验证、模板引擎等 POPASP 的特色功能。
为了学习本节内容,特意制作了10个案例,以便帮助快速掌握POPASP的使用。百度网盘下载
如何使用 POPASP
下载与安装
请从 POPASP下载页面下载 POPASP 的最新版本到本地,并解压。然后将 POPASP 文件夹拷贝到您的IIS站点根目录。为了您的学习需要,下面的所有示例都打包在一个文件夹。
如果您通过 http://(您的站点地址)/demo/index.asp/
访问可以运行 POPASP 自带的数据库操作示例,则表示您已经正确的安装了 POPASP。
文件结构
POPASP 内部的文件结构如下,其中的文件功能简单介绍一下:
文件 | 功能 |
---|---|
popasp.asp | 框架入口 |
popasp.convention.asp | 惯例配置 |
popasp.func.asp | 函数库 |
popasp.model.asp | 数据模型样例 |
popasp_access.class.asp | access模型类 |
popasp_application.class.asp | Application操作类 |
popasp_arr.class.asp | 数组类 |
popasp_autocomplete.class.asp | Model验证类 |
popasp_autovalidate.class.asp | Model自动完类 |
popasp_autovalidate.class.asp | Model自动完类 |
popasp_controller.class.asp | 控制器类 |
popasp_cookie.class.asp | cookie操作类 |
popasp_database_tool.class.asp | 数据库操作工具类 |
popasp_dictionary.class.asp | Dictionary操作类 |
popasp_excel.class.asp | Excel操作类 |
popasp_file.class.asp | 文件操作类 |
popasp_json.class.asp | json操作类 |
popasp_md5.class.asp | md5加密类(可加密汉字) |
popasp_model.class.asp | Model重写类 |
popasp_molibupload.class.asp | molibupload上传类 |
popasp_mvc.class.asp | 框架类 |
popasp_page.class.asp | 分页类 |
popasp_pagetrace.class.asp | 控制台类 |
popasp_rejection.class.asp | 反射类 |
popasp_structrue.class.asp | 部署类 |
popasp_template.class.asp | 模板引擎类 |
popasp_template_compiler.class.asp | 模板解析类 |
popasp_url.class.asp | url分析类 |
popasp_verify.class.asp | 验证码类 |
Tpl文件夹 | 内置的一些模板文件 |
Plugin文件夹 | 插件文件夹 |
POPASP1.X兼容Easyasp,POPASP2.0不再兼容Easyasp。
项目部署
首先在网站目录下创建index.asp文件,该文件就是我们要创建项目的入口文件。
<!--#include file="../popasp/popasp.asp" --> <% '项目文件夹,部署项目时,不要手工创建home文件夹,否则无法进行项目部署 const APP_PATH = "./home" '开启POPASP之旅 POP_MVC.start %>
然后,我们打开浏览器,输入地址并运行:
http://localhost/index.asp
就会看到欢迎页面:
:) 欢迎使用 POPASP!
需要说明的是,在进行项目部署时,因为部署时的判断条件是是否存在项目文件夹,所以不要手工去创建项目文件夹,否则无法完成项目部署。
如果看到欢迎信息,说明项目已经成功部署。部署完后的项目包括如下文件
目录 | 说明 |
---|---|
Common | 项目公共文件目录,一般放置项目的公共函数 |
Conf | 项目配置目录,项目的配置文件放在这里 |
Controller | 包含控制器文件 |
Model | 包含模型文件 |
Tpl | 项目模板目录 |
Plugin | 插件目录 |
Runtime | 项目运行时目录,包括Cache(数据缓存)、Data(数据目录)、Compile(模板解析文件)、Class(类的重写与反射文件)、Log(日志文件) |
本部分示例为01
关于项目部署更详细的说明请查看帮助文档相关章节。
Hello World
在刚才生成的项目目录中,找到 home/Controller/IndexAction.class.asp 文件,用一个你喜欢的IDE打开,会看到如下代码。
<% ' 本类由系统自动生成,仅供测试用途 Class IndexAction public Sub index() Response.write "<h1 style=""font-size:80px;margin:30px 0 10px 30px;font-family:'微软雅黑';font-weight: normal;"">☺</h1><p style=""line-height:1.8em;font-size: 36px;margin:0 0 0 30px;font-family:'微软雅黑';font-weight: normal;"">欢迎使用 <b>POPASP</b>!</p>" end Sub End Class %>
这是系统自动生成的控制器,我们将它改写一下,以便生成 Hello World 。
<% Class IndexAction public Sub index() that.assign "tip","Hello World" end Sub End Class %>
同时,我们还需要将index.asp文件的内容改写一下
<!--#include file="../popasp/popasp.asp" --> <% '项目文件夹,部署项目时,不要手工创建home文件夹,否则无法进行项目部署 const APP_PATH = "./home" '开启POPASP之旅 POP_MVC.run %> <% '调用控制器Index中的方法index Call A_("Index/index") %> <strong><%=V_("tip")%></strong>
在POPASP2.0中,放弃了复杂的模板引擎技术与单文件入口,每个入口页面其实对应的就是MVC中的视图文件。上面的V_
函数,是用来调用通过that.assign
分配的变量tip
,另外还要注意,V_
函数是区分变量名大小写的。
提示,在使用IDE编辑文件时,一定要采用 UTF-8无BOM格式编程 ,因为系统采用的是此编码,否则会出错的。
再次在浏览器打开
http://localhost/02/index.asp
会看到浏览器中显示
<strong>Hello World</strong>
或许你用惯了混写代码,突然使用POPASP感觉有些不太适应,像上例为了显示Hellow World
,操作了几个文件,似乎有些绕,而这正说明你还是不太了解MVC的工作原理,而MVC的妙处随着你学习POPASP的深入,相信一定会有所感触的。
本部分示例为02
快速查看变量
我们经常需要对一些变量快速查看,比如从数据库中查询的记录、asp的环境变量、通过form表单提交的数据等等。
此时我们可以使用sub过程var_export,使用方法如下所示
<% Class IndexAction public Sub index() var_export Request.ServerVariables end Sub End Class %>
再次在浏览器打开
http://localhost/03/index.asp
会看到环境变量已经全部输出。
本部分示例为03
数据库操作
POPASP在数据库操作的一大靓点是连贯操作。比如在数据库中查询ID=1
的文章,
dim rs set rs = M_("post").db.where(1).field("id,title,add_time").find() var_export rs
该示例在04
取15篇文章,发送给模板文件并显示
在控制器中,
<% Class IndexAction public Sub index() dim rs '得到结果集,page(null,10),当第几页为null时,会自动取当前页 set rs = M_("post").db.page(array(null,10)).field("id,title,add_time").select() '分页变量的分配必须要放在list分配之前 that.assign "page",P_("PAGE")(rs).show() '在模板文件中使用V_("page") 'rs以数组形式传入,只传取当前页数据 that.assign "list",array(rs) end Sub End Class %>
在index.asp文件中,
<!--#include file="../popasp/popasp.asp" --> <% '项目文件夹,部署项目时,不要手工创建home文件夹,否则无法进行项目部署 const APP_PATH = "./home" '一般项目部署时使用POP_MVC.start,部署完后多用POP_MVC.run,后者不去检查项目文件夹是否存在 POP_MVC.run %> <% '调用控制器Index中的方法index Call A_("Index/index") dim key,item %> <html> <head> <title>通过控制器取出文章并分配,在模板文件中显示</title> </head> <body> <ul> <% for each key in V_("list") : set item = V_("list")(key) %> <li><a href="post.asp?id=<%=item("id")%>"><%=item("title")%></a> <span><%=item("add_time")%></span> </li> <% next %> </ul> </body> </html>
该示例在05,在示例中,通过POPASP强大的控制台,可以看到完整的sql语句。
在上例中,我们并没有拼写sql语句,而是通过非常简单的连贯操作就可以从数据库中获取数据,而且我们并没有刻意手工去销毁Recordset对象。在混写代码中,对于何时销毁Recordset变量是件让人头疼的事情,但是在popasp中,程序会自动销毁这些变量,是不是非常得方便呢?
数据库的操作在POPASP中异常方便,一是体现在连贯操作,二是Recordset变量自动销毁,三是MVC分层,代码更易阅读与维护。
数据库其他操作
POPASP的版本目前是2.X,在1.X中对数据模型的操作就已经非常丰富了,在上面的例子中我们看到了连贯操作,另外还包括CRUD的连贯操作、CURD的非连贯操作、增加记录与修改记录时的自动完成与自动验证、自段排除等等,这里只作抛砖引玉,更详细的内容还请查看帮助文档。
数据分页
通常在数据查询后都会对数据集进行分页操作,POPASP也提供了分页类来对数据分页提供支持。POPASP的分页是非常简单易用的。
dim rs '得到结果集,page(null,10),当第几页为null时,会自动取当前页 set rs = M_("post").db.page(array(null,10)).field("id,title,add_time").select() that.assign "page",P_("PAGE")(rs).show() '在模板文件中使用V_("page") 'rs以数组形式传入,只传取当前页数据 that.assign "list",array(rs)
数据分页的操作如此简单,结合数据库查询,两三行代码就可以完成数据分页,而且数据分页类可以根据需要进行相应配置。
本部分示例为06
模板文件的循环语句
在popasp1.X中使用了复杂的模板引擎技术,循环语句也较为复杂。在2.X版本中,没有使用复杂的模板引擎技术,而是使用了ASP原生技术,操作更方便,更易上手。但是有几点需要注意:
因为通过that.assign
分配的变量,当其类型为Recordset时会将其转化为Dictionary对象,注意,是Dictionary对象而非数组。在模板文件中进行循环输出时,建议使用for each ... next
,这样的循环相比其它循环方式更为方便简单,如果分配变量是数组,这种方法也适用。
在控制器中,
<% Class IndexAction public Sub index() dim arr '生成一个数字数组,1,2,3……20 arr = POP_MVC.Arr.Range(1,20) '将数组分配 that.assign "arr",arr end Sub End Class %>
在index.asp文件中
<!--#include file="../popasp/popasp.asp" --> <% '项目文件夹,部署项目时,不要手工创建home文件夹,否则无法进行项目部署 const APP_PATH = "./home" '一般项目部署时使用POP_MVC.start,部署完后多用POP_MVC.run,后者不去检查项目文件夹是否存在 POP_MVC.run %> <% '调用控制器Index中的方法index Call A_("Index/index") dim item %> <html> <head> <title>通过控制器取出文章并分配,在模板文件中显示</title> </head> <body> <!--文章列表--> <ul> <% for each item in V_("arr") %> <li> <%=item%> </li> <% next %> </ul> </body> </html>
该部分示例在07中
验证码
在POPASP中使用验证码非常方便。
首先我们在Action中先定义一个方法,如下
<% Class PublicAction public Sub verify() call that.verify end Sub End Class %>
http://localhost/08/index.asp?c=Public&a=verify
这样就可以了。因为POPASP2.X采用了多文件入口,即便将index.asp
换成其他文件名,只要正确引入了popasp框架,验证码都会正常输出。
用于html中生成验证码图片时,可以如下使用
创建login.asp文件,代码如下:
<!--#include file="../popasp/popasp.asp" --> <% '项目文件夹,部署项目时,不要手工创建home文件夹,否则无法进行项目部署 const APP_PATH = "./home" '一般项目部署时使用POP_MVC.start,部署完后多用POP_MVC.run,后者不去检查项目文件夹是否存在 POP_MVC.run %> <% '调用控制器Index中的方法login,该方法即使不存在,也能正常运行 Call A_("Index/login") dim item %> <html> <form action="" method="post"> <p>用户名:<input type="text" name="username" /></p> <p>密码:<input type="password" name="password" /></p> <p>验证码:<input type="text" name="verify" /><img src="login.asp?c=Public&a=Verify" onclick="javascript:this.src='login.asp?c=Public&a=Verify&tm='+Math.random()" style="cursor:pointer;height:14px;" alt="验证码" /></p> <p>提交:<input type="submit" name="send" value="提交" /></p> </form> </body> </html>
该部分示例在08中
多文件引入框架的简化
在示例08中,我们发现在引入popasp时,需要多次写以下几行代码
<!--#include file="../popasp/popasp.asp" --> <% '项目文件夹,部署项目时,不要手工创建home文件夹,否则无法进行项目部署 const APP_PATH = "./home" '一般项目部署时使用POP_MVC.start,部署完后多用POP_MVC.run,后者不去检查项目文件夹是否存在 POP_MVC.run %>
如果要修改popasp的引用路径,或者要修改项目文件夹名称或路径,多个入口文件都需要修改,比较麻烦,下面提供一种简便方法。
首先我们先创建一个文件popasp_inc.asp
,代码如下
<!--#include file="../popasp/popasp.asp" --> <% '项目文件夹,部署项目时,不要手工创建home文件夹,否则无法进行项目部署 const APP_PATH = "./home" '框架文件夹路径,这里跟上面的include路径一致 POP_MVC.mvc_dir = "../popasp/" '该行代码不可少 '一般项目部署时使用POP_MVC.start,部署完后多用POP_MVC.run,后者不去检查项目文件夹是否存在 POP_MVC.run %>
其它入口文件只要引入该文件即可。比如login.asp
可以改写为如下:
<!--#include file="./popasp_inc.asp" --> <% '调用控制器Index中的方法login,该方法即使不存在,也能正常运行 Call A_("Index/login") dim item %> <html> <form action="" method="post"> <p>用户名:<input type="text" name="username" /></p> <p>密码:<input type="password" name="password" /></p> <p>验证码:<input type="text" name="verify" /><img src="login.asp?c=Public&a=Verify" onclick="javascript:this.src='login.asp?c=Public&a=Verify&tm='+Math.random()" style="cursor:pointer;height:14px;" alt="验证码" /></p> <p>提交:<input type="submit" name="send" value="提交" /></p> </form> </body> </html>
本示例为09
使用缓存技术
POPASP在1.X版本中就具备了缓存技术,非常强大,可以使用多种缓存技术。在2.0版本中,只保留了数据缓存技术,使用起来更方便更简单。
在IndexAction.Class.asp
文件中
<% Class IndexAction public Sub index() dim rs,page if that.get("page") = "" then page = 1 else page = that.get("page") end if 'that.expired方法有两个参数,分别是模板文件名与缓存标识ID,这里可以取当前page作缓存标识 if that.expired("",page) then '得到结果集,page(null,10),当第几页为null时,会自动取当前页 set rs = M_("post").db.page(array(null,10)).field("id,title,add_time").select() '分页变量的分配必须要放在list分配之前 that.assign "page",P_("PAGE")(rs).show() '在模板文件中使用V_("page") 'rs以数组形式传入,只传取当前页数据 that.assign "list",array(rs) that.cache() end if end Sub end Class
在模板文件index.asp
中
<!--#include file="../popasp/popasp.asp" --> <% '项目文件夹,部署项目时,不要手工创建home文件夹,否则无法进行项目部署 const APP_PATH = "./home" '一般项目部署时使用POP_MVC.start,部署完后多用POP_MVC.run,后者不去检查项目文件夹是否存在 POP_MVC.run %> <% '调用控制器Index中的方法index Call A_("Index/index") dim key,item %> <html> <head> <title>使用缓存技术</title> </head> <body> <!--文章列表--> <ul> <% for each key in V_("list") : set item = V_("list")(key) %> <li><a href="post.asp?id=<%=item("id")%>"><%=item("title")%></a> <span><%=item("add_time")%></span> </li> <% next %> </ul> <!--下面是分页--> <div> <%=V_("page")%> </div> </body> </html>
有没有使用缓存技术,对于模板文件的代码书写没有影响。但是通过控制台,我们可以发现在缓存期内,系统并没有调用数据库。这样大大节省了读取数据库的开销。
本部分示例对应10
总结
通过上面的阅读,你会发现POPASP简单易用,这是因为作者在框架中作了大量的工作用来简化您的操作。通过上面的学习,你对POPASP的了解是远远不够的,我们强烈建议您认真阅读帮助文档来学习,另外附带POPASP2.0版本作者还提供了一套多用户留言管理系统,方便您的学习。另外还要告诉大家一个好消息,作者即将推出POPASP视频教程,敬请期待。