创建服务器
【E2EE文档】

创建服务器

E2EE的核心对象为“网站服务器”。

本章节索引:

  1. 创建静态服务器
  2. 创建动态页面
  3. 服务器初始化流程细则

网站服务器对象正确初始化流程为:

  • 1. 创建服务器变量
  • 2. * 调用服务器的初始化方法
  • 3. * 订阅初始化函数
  • 4. * 订阅全局函数
  • 5. * 订阅视图函数
  • 6. 调用服务器的启动方法

打“*”星号的为非必须流程。

1. 创建静态服务器

从上面的流程中我们可以看出来,创建最简单的服务器仅需要添加一个服务器变量,直接 启动() 就能跑起来了。那就从这步开始吧。

下载本节源码

1.1 创建网站目录

在 C:/ 盘下创建一个目录,命名为“网站”。

打开记事本,粘贴以下内容:

<!DOCTYPE html>
<html>
<head>
    <title>测试页面</title>
</head>
<body>

我是第一个测试页面,真的不骗。

<marquee>JimStone送您花式飘过~</marquee>

</body>
</html>

记事本内容保存到你创建的“网站”目录下,命名为:index.html

1.2 在易语言中新建一个“Windows窗口”

创建完窗口后先将代码保存文件到“网站”目录下,命名为“我的网站”。

双击空窗口创建“_启动窗口创建完毕”事件。

1.3 创建服务器变量

在程序集中加入“服务器”变量,类型为“网站服务器”。

1.4 启动服务器

在“_启动窗口创建完毕”事件下加入:

.版本 2
.如果真 (服务器.启动 () = 假)
    信息框 (“启动失败”, 0, , )

点击易语言的运行按钮。大工完成,此时打开浏览器在地址栏输入 http://127.0.0.1/ 就能访问了。

有些人这个时候可能访问不了,很有可能是 80 端口被占用了,这个时候我们就需要用下面的方式加入启动参数。

1.5 加入启动参数

将“_启动窗口创建完毕”事件的代码改成:

.版本 2
.如果真 (服务器.启动 (创建键值表 (“端口”, “8080”)) = 假)
    信息框 (“启动失败”, 0, , )
.如果真结束

再次点击运行。此时在浏览器输入 http://127.0.0.1:8080 访问试试。

2. 创建动态页面

下载本节源码

2.1 使用配置文件

在上面的例子中,可以发现设置启动参数的方式比较麻烦,而且不够灵活,那么接下来我们试试用配置启动服务器。

首先、 删除 创建键值表 (“端口”, “8080”) 这句代码

.版本 2
.如果真 (服务器.启动 () = 假)
    信息框 (“启动失败”, 0, , )
.如果真结束

其次、 点击下载 中文网站模板。将压缩包中的“网站”目录下的所有东西覆盖到我们的“网站”目录下。然后将 index.html 拖放到“网站/网页/”目录下。

之后、 用记事本打开“配置.conf”文件,修改[端口]配置项为 8081,然后保存文件。

再次点击运行。在浏览器中输入 http://127.0.0.1:8081 访问试试。

2.2 创建处理函数

在代码中加入下面的子程序:

.版本 2

.子程序 网站_首页, 逻辑型
.参数 请求对象地址, 整数型
.参数 响应对象地址, 整数型
.局部变量 请求, 服务器请求
.局部变量 响应, 服务器响应

取回请求对象 (请求对象地址, 响应对象地址, 请求, 响应)
响应.写文本 (“你好,祖国!我叫” + 请求.取参数 (“name”))
返回 (真)

在服务器.启动()之前加入 订阅视图函数() 方法注册刚才添加的子程序

服务器.订阅视图函数 (&网站_首页, “/”, , )

点击运行。在浏览器中输入 http://127.0.0.1:8081/?name=JimStone 访问试试。

3. 服务器初始化流程细则

从上面的例子里,我们能看出来服务器对象大概的开发流程。接下来我们深入了解下服务器的开发流程。

3.1 创建服务器变量

服务器变量创建过程很简单,以下是服务器对象创建和使用的一些准则,建议您使用过程中用作参考:

  1. 服务器变量尽量放到程序集或者全局变量中。
  2. 服务器变量复制时不会产生新的服务器实例。例如:服务器1=服务器2。只是将 服务器1 对象的指针传递给 服务器2,而服务器1原始对象将会自动释放。此时使用服务器1和服务器2都为同一个对象。
  3. 如果要复制服务器请使用 服务器.克隆() 方法,此时会产生一个原对象的副本。

3.2 订阅视图函数

触发时间:收到匹配到网址请求时,全局函数执行后。

服务器.订阅视图函数 (&处理函数示例, “/user”, “/user/index.esp”, )

我们先看下订阅视图函数的原型:

服务器.订阅视图函数() : 逻辑型

通过请求相对路径订阅一个回调函数用于处理服务器请求。

 处理函数:“子程序指针()”。请求处理函数子程序地址。处理函数返回值决定是否处理成功。

 请求地址:“文本型”。请求相对路径地址。如实际网址为 http://localhost/add_user 则此处的路径为:/adduser 相对路径必须以“/”开头。可以使用正则。

 模板文件:“文本型”,可以被省略。处理函数默认渲染模板文件路径。不提供则在无模板参数的 响应.渲染() 会执行失败。建议使用“/”开头的相对路径,使用相对路径时将自动定位到“[网站]/[模板]/”目录下对应的文件。

 标签:“文本型”,可以被省略。标签标记。省略此处的标签对路径处理函数来说没有任何影响,订阅全局函数时省略标签则意味着处理所有用户请求函数(),此标签不是核心支持库中的“标签”组件。标签为一段文本,可以对功能用来做分组以便通过类似分组的方式进行全局控制。标签允许多个,您可以把功能按照层级进行处理,例如某个用户界面功能设置了以下标签:普通用户、普通用户_帖子、普通用户帖子发布。形成类似树状的结构,全局函数可以分别对每个层级的标签进行判断和控制,以便决定用户是否可以继续进行下一步处理。当然这只是其中一种场景,大部分时候您都可以通过标签的各种不同组合来完成您的业务场景处理。

[视图函数]

视图函数为业务处理的核心函数,具体格式如下:

    .版本 2
    .子程序 视图函数示例, 逻辑型
    .参数 请求对象地址, 整数型
    .参数 响应对象地址, 整数型
    .局部变量 请求, 服务器请求
    .局部变量 响应, 服务器响应
    .局部变量 模板数据, 存取键值表
    取回请求对象 (请求对象地址, 响应对象地址, 请求, 响应)
    ' // TODO: 业务处理逻辑

    返回 (响应.渲染 (模板数据))

通过服务器辅助函数 取回请求对象() 能够取回 请求 和 响应 的原始对象。

响应.渲染 方法则是将您处理生成的 模板数据 传入到“模板文件”中合成最终的网页内容。

[请求地址]

请求地址为客户浏览器访问网站的相对地址。支持正则和Restful风格的定义形式。具体格式请看下面的章节。

[模板文件]

模板文件路径。

  • 模板文件路径如果为相对路径,则对应的根目录为“模板”目录,而不是网站的根目录或者程序运行目录。
  • 模板文件的后缀名决定使用哪种渲染引擎,相关的配置见前面的章节。
  • 模板的具体格式请看下面的章节。
  • 如果不使用模板文件,您可以不设置此参数或者设置为空文本。

[标签]

为当前处理函数打标签。

  • 同一个处理函数支持打多个标签。
  • 标签的主要作用为整体的权限或全局控制。
  • 如果您还不明白或者用不到标签功能,您可以不设置此参数。

3.3 服务器初始化方法

服务器.初始化 (取运行目录 () + “/网站/”)

服务器.初始化() 方法主要作用是初始化服务器的配置信息。

当您的服务器对象作为容器模块启动时,建议不要调用此方法。

初始化方法的原型为:

服务器.初始化() : 逻辑型

初始化网站。

 网站根目录:“文本型”。网站根目录的绝对路径。

[网站根目录]

网站根目录为整个网站的根目录,注意不要理解成“网页”的根目录。网页只是用来存储静态文件的目录。

当执行完初始化方法后,能够得到网站的所有配置信息,建议不要在初始化后立刻调用 服务器.取配置() 命令,而是放在订阅的 初始化子程序 中读取网站相关配置,便于当前服务器对象作为容器模块使用。

3.4 调用服务器的启动方法

服务器.启动()

启动 方法包含一个“自定义配置”参数,对应的参数值等同于网站配置文件中的配置项,但是优先级要更加高于配置文件。使用这种特性,您可以将当前服务器对象通过 克隆() 方法产生的副本,附加新的端口和配置启动一个新的服务器实例。可以参考以下代码实现。

最终的效果就是同一个网站,运行时开启了两个不同的端口。通过两个端口都能访问到当前网站。

3.5 订阅全局函数

触发时间:匹配到任意视图函数请求地址时,优先触发全局函数,之后再交给视图函数。

服务器.订阅全局函数 (&示例_全局函数, )

全局函数 能够在 视图函数执行前提前处理请求,能够根据实际环境控制当前请求是否交给视图函数继续处理。当全局函数拒绝某个请求后,请求对应的视图函数将不会执行,而当前请求会直接做为结果返回给浏览器。通过全局函数,您能够实现权限控制、全局信息注入 和 消息预处理等功能。

以下是 订阅全局函数 的原型:

订阅全局函数() : 逻辑型

订阅一个全局的处理函数用以预处理请求或者控制是否允许继续处理请求。如果不设置标签参数则该全局函数将处理所有用户请求。允许同时订阅多个全局函数(),设置标签后遇到指定“标签”内容的路径订阅函数时将会在函数执行之前触发。可以通过拦截“标签”来制定访问或权限规则等,该功能类似于Java等语言的注解功能。

 处理函数:“子程序指针()”。全局请求处理函数子程序地址。处理函数返回值决定是否继续进行其他的请求处理函数,返回[真]则继续处理该请求,返回[假]则终止接下来的所有处理过程()。

 标签:“文本型”,可以被省略。标签标记。省略此处的标签对路径处理函数来说没有任何影响,订阅全局函数时省略标签则意味着处理所有用户请求函数(),此标签不是核心支持库中的“标签”组件。标签为一段文本,可以对功能用来做分组以便通过类似分组的方式进行全局控制。标签允许多个,您可以把功能按照层级进行处理,例如某个用户界面功能设置了以下标签:普通用户、普通用户_帖子、普通用户帖子发布。形成类似树状的结构,全局函数可以分别对每个层级的标签进行判断和控制,以便决定用户是否可以继续进行下一步处理。当然这只是其中一种场景,大部分时候您都可以通过标签的各种不同组合来完成您的业务场景处理。

  • 全局函数订阅的子程序格式和使用方法 和 视图函数没有任何区别。
  • 订阅的子程序返回类型为逻辑型。子程序的返回值决定是否会继续处理接下来的请求对应的视图函数,当返回为 假 的时候,路径对应的视图函数将不会被触发。
  • 订阅的子程序中您可以通过 请求.属性表().写值() 方法来传递数据到接下来的请求对应的视图函数中。

3.6 订阅初始化函数

触发时间:服务器启动时,配置加载完之后,绑定端口之前。

留言本服务器.订阅初始化函数 (&留言本_初始化)

您可以在订阅的子程序中获取到服务器的配置信息,初始化您的数据库或者对象映射等相关数据。

您可能要问,已经执行过 服务器.初始化 方法,为什么还需要订阅初始化函数。其实订阅初始化函数的主要作用,是为容器模块化服务的。

当服务器作为容器模块时,在服务器启动前您是无法得到正确的路径和配置文件等信息的,只有在外层的主服务器启动时,给您的容器模块分配到正确的根目录后,才会执行您的容器模块(当前服务器)的初始化方法,此时您得到的配置信息和映射关系才为正确的内容。外层主服务器有可能会复写您的模块的相关配置,以便在外层做统一配置。

初始化函数 参数只有一个 子程序指针。其调用格式如下:

.版本 2

  .子程序 留言本_初始化,

  .参数 服务器地址, 整数型

  .局部变量 服务器, 网站服务器

  服务器 = 取回服务器对象()

  ' // TODO: 初始化服务器取服务器配置和对象映射中心等

您可以通过 服务器.取配置项() 得到实际的配置内容。