鍍金池/ 教程/ Java/ Web 編程
數據庫訪問
循環(huán)
數組
錯誤處理
面向對象
調試
游戲開發(fā)
文件 I/O
變量
迭代器
Web 編程
模塊
函數
元表
協(xié)程
垃圾回收機制
標準庫
決策
數據類型
運行環(huán)境
操作符
字符串
基本語法
概述

Web 編程

Lua 是一種非常靈活的語言,它經常被用在各種平臺上,包括 web 應用。其中關于 Lua Web 項目最著名的就是 Kepler 項目了。Kepler 社區(qū)成立于 2004 年,一直致力于為 Lua 提供開源的 web 組件。

盡管其它開發(fā)者也已經推出了許多的 Lua web 應用框架,但是我們還是想主要介紹一下由 Kepler 社區(qū)開發(fā)的 web 開發(fā)組件。

應用與框架

  • Orbit 是一個基于 WSAPI 的 MVC web 框架(譯注: MVC,模型-視圖-控制器)。
  • WSAPI 是一套從 Lua web 應用中抽象出來的 web 服務 API,它是許多其它項目的基礎。
  • Xavante 是一個提供 WSAPI 的 Lua Web 服務器。
  • Sputnik 是 Kepler 項目中開發(fā)的 wiki/CMS 構架,它也基于 WSAPI。
  • CGILua 支持 LuaPages 和 LuaScripts 網絡頁面的創(chuàng)建,基于 WSAPI,不過已經不再提供支持。

在本教程中,我們會讓你了解到在 Web 應用開發(fā)中 Lua 可以完成哪些工作。了解更多安裝和使用說明,可以參閱kepler website

Orbit

Orbit 是一個 MVC 類型的 Lua web 框架。它完全拋棄了 CGILua 的腳本即應用的模型,在此模型中每個 Orbit 應用都可以放在一個文件中,如果你愿意,每個應用也可以被分割在多個文件到。

所有的 Orbit 應用都支持 WSAPI 協(xié)議,所以它們也就兼容 Xavante, CGI 和 Fastcgi。它還自帶了一個啟動器,以啟動一個 Xavante 實例便于開發(fā)。

安裝 Orbit 最簡單的方式是使用 LuaRocks。 luarocks 用命令行的方式安裝 orbit。因此,首先你需要安裝luaRocks。

如果你沒安裝所需的依賴,下面的步驟會引導你在 Unix/Linux 環(huán)境下搭建 Orbit 環(huán)境。

安裝 Apache

連接服務器,安裝 Apache2。

$ sudo apt-get install apache2 libapache2-mod-fcgid libfcgi-dev build-essential
$ sudo a2enmod rewrite
$ sudo a2enmod fcgid
$ sudo /etc/init.d/apache2 force-reload

安裝 LuaRocks

$ sudo apt-get install luarocks

安裝 WSAPI,F(xiàn)CGI,Orbit,Xavante

$ sudo luarocks install orbit
$ sudo luarocks install wsapi-xavante
$ sudo luarocks install wsapi-fcgi

配置 Apache2

$ sudo raj /etc/apache2/sites-available/default

在配置文件的 <Directory /var/www/> 的節(jié)中增如下的節(jié)。如果下面節(jié)中有 AllowOverride None, 你需將 None 改為 All,如此 .htaccess 才能覆蓋本地配置。

<IfModule mod_fcgid.c>
    AddHandler fcgid-script .lua
    AddHandler fcgid-script .ws
    AddHandler fcgid-script .op
    FCGIWrapper "/usr/local/bin/wsapi.fcgi" .ws
    FCGIWrapper "/usr/local/bin/wsapi.fcgi" .lua
    FCGIWrapper "/usr/local/bin/op.fcgi" .op
    #FCGIServer "/usr/local/bin/wsapi.fcgi" -idle-timeout 60 -processes 1
    #IdleTimeout 60
    #ProcessLifeTime 60
</IfModule>

配置好后重啟服務器使得配置更改生效。

為了使你的應用可以運行,你需要在你的 Orbit 應用根目錄下的 .htaccess 文件中添加 +ExecCGI,在本例中根目錄為 /var/www。

Options +ExecCGI
DirectoryIndex index.ws

示例——Orbit

#!/usr/bin/env index.lua
-- index.lua
require"orbit"

-- 聲明
 module("myorbit", package.seeall, orbit.new)

-- 處理程序
function index(web)
  return my_home_page()
end

-- 分配器
myorbit:dispatch_get(index, "/", "/index")

-- 樣例頁面
function my_home_page()
   return [[
    <head></head>
    <html>
    <h2>First Page</h2>
    </html>
    ]]
end

現(xiàn)在,你可以啟動你的瀏覽器訪問 http://localhost:8080 就可以看到下面的結果:

First Page

Orbit 還提供了另外選項,該選項使得 Lua 代碼可以生成 html。

#!/usr/bin/env index.lua
-- index.lua
require"orbit"

function generate()
    return html {
        head{title "HTML Example"},
        body{
            h2{"Here we go again!"}
        }
    }
end

orbit.htmlify(generate)

print(generate())

創(chuàng)建表單

簡單的表單創(chuàng)建代碼如下:

#!/usr/bin/env index.lua
require"orbit"

function wrap (inner)
    return html{ head(), body(inner) }
end

function test ()
    return wrap(form (H'table' {
        tr{td"First name",td( input{type='text', name='first'})},
        tr{td"Second name",td(input{type='text', name='second'})},
        tr{ td(input{type='submit', value='Submit!'}),
            td(input{type='submit',value='Cancel'})
        },
    }))
end

orbit.htmlify(wrap,test)

print(test())

你可以在官網找到關于 orbit 更加詳細內容。

WSPAI

正如前面所說的,WSAPI 是大多數項目的基礎,它內嵌了大量的特性。你現(xiàn)在可以在下面的這些系統(tǒng)平臺上使用 WSAPI:

  • Windows-
  • UNNIX 類系統(tǒng)

WSAPI 支持的服務器和接口包括:

  • CGI
  • FastCGI
  • Xavante

WSAPI 提供了大量庫方便我們使用 Lua 進行 Web 應用的開發(fā)。下面列出了其支持的部分特征:

  • 請求處理
  • 輸出緩存
  • 認證機制
  • 文件上傳
  • 請求隔離
  • 復用

下面是 WSAPI 的一個簡單例子。

 #!/usr/bin/env wsapi.cgi

module(..., package.seeall)
function run(wsapi_env)
   local headers = { ["Content-type"] = "text/html" }

   local function hello_text()
      coroutine.yield("<html><body>")
      coroutine.yield("<p>Hello Wsapi!</p>")
      coroutine.yield("<p>PATH_INFO: " .. wsapi_env.PATH_INFO .. "</p>")
      coroutine.yield("<p>SCRIPT_NAME: " .. wsapi_env.SCRIPT_NAME .. "</p>")
      coroutine.yield("</body></html>")
   end

   return 200, headers, coroutine.wrap(hello_text)
end

很容易看出來,上面的代碼生成了一個簡單的 html 頁面。同時,你可以看到使用協(xié)程可以將 html 語句一條一條的返回給調用函數。最終返回的是 html 狀態(tài)碼(200)、頭部以及 html 頁面。

Xavante

Xavante 是一款支持 HTTP 1.1 的 Lua web 服務器。它采用模塊化的結構設計,使用 URI 映射處理程序的方式進行路由。 Xavante 目前支持:

  • 文件處理程序
  • 重定向處理程序
  • WSAPI 處理程序<

文件處理程序用于一般文件;重定向處理程序實現(xiàn) URI 重映射;WSAPI 處理程序用于 WSAPI 應用。
使用示例如下:

require "xavante.filehandler"
require "xavante.cgiluahandler"
require "xavante.redirecthandler"

-- Define here where Xavante HTTP documents scripts are located
local webDir = XAVANTE_WEB

local simplerules = {

    { -- URI remapping example
      match = "^[^%./]*/$",
      with = xavante.redirecthandler,
      params = {"index.lp"}
    }, 

    { -- cgiluahandler example
      match = {"%.lp$", "%.lp/.*$", "%.lua$", "%.lua/.*$" },
      with = xavante.cgiluahandler.makeHandler (webDir)
    },

    { -- filehandler example
      match = ".",
      with = xavante.filehandler,
      params = {baseDir = webDir}
    },
} 

xavante.HTTP{
    server = {host = "*", port = 8080},

    defaultHost = {
        rules = simplerules
    },
}

如果使用 Xavante 虛擬機,xavante.HTTP 需要被修改為如下:

xavante.HTTP{
    server = {host = "*", port = 8080},

    defaultHost = {},

    virtualhosts = {
        ["www.sitename.com"] = simplerules
    }
}

Lua web 組件

  • Copas:基于協(xié)程的分配器,可用于 TCP/IP 服務器。
  • Cosmo:一個安全模板引擎,保護應用免受來自模板的任何代碼攻擊。
  • Coxpcall:封裝 Lua 原生的 pcall 和 xpcall 函數,提供協(xié)程兼容的版本。
  • LuaFileSystem:以可移植的方式訪問底層目錄結構和文件屬性。
  • Rings:提供在 Lua 中創(chuàng)建新的 Lua state 的方法。

結束語

根據我們的需求,我們可以找到很多適合我們的 Lua web 框架和組件。下面列出了另外一些可用的框架:  

  • Moontalk:提供高效的開發(fā)方式,為 Lua 開發(fā)的動態(tài) web 應用提供容器,適于各種復雜程度的應用開發(fā)。
  • Lapis:使用 MoonScript(或 Lua)的 web 應用框架,它可以運行在 OpenResty 服務器中。
  • Lua Server Pages:一個 Lua 腳本引擎插件,此插件提供了完善的嵌入 web 開發(fā)方案。

充分利用這些 Web 框架,它可以幫助你實現(xiàn)更加豐富的 web 功能。

上一篇:數組下一篇:元表